Bài 11: Tạo xác thực dữ liệu phụ thuộc

Trong bài này, chúng ta sẽ thực hiện mục tiêu như sau: Tạo xác thực dữ liệu cho một ô phụ thuộc vào giá trị của một ô khác

File tham khảo

https://docs.google.com/spreadsheets/d/1es8agzxldicKw6rlWd1UN3CBO7XcUMCHd93xfK6G1fM/edit?usp=sharing

Bạn hãy tạo bản sao về Drive để xem và chỉnh sửa nhé

Mô tả ví dụ

  • Cho file có 2 sheet: “sheet” và “Database”
  • Dải ô A3:A13 được xác thực dữ liệu cho các giá trị: “iPhone”, “Samsung”, và “Nokia” (hàng 1 sheet Database)
  • Khi chọn giá trị bất kì ở A3:A13 thì sẽ xuất hiện xác thực dữ liệu tương ứng ở sheet Database. Ví dụ, chọn iPhone, thì sẽ hiện ra X, XS, và XS max
Xác thực dữ liệu tương ứng ở cột B

Code hoàn chỉnh

Các bước thực hiện

  1. Lấy số thứ tự cột của activeCell
  2. Dùng getRange để lấy dải ô tương ứng với cột cần lấy
  3. Viết Xác thực dữ liệu ra ô ở cột B “Model”

Ví dụ, khi ta chọn Nokia. Bước 1 sẽ lấy số thứ tự cột của Nokia trong Database (là 3). Tiếp theo (bước 2), lấy tiếp dải ô bên dưới Nokia, là các model N70, N71, N72. Cuối cùng (bước 3), viết những model này vào Xác thực dữ liệu cho cột B.

Bước 1 – Lấy số thứ tự cột

  • Sử dụng trigger onEdit để thực thi các câu lệnh mỗi khi thay đổi giá trị trong file Google Sheet
  • sheet đại diện cho sheet “sheet”
  • dbSheet đại diện cho sheet “Database”
  • activeCell là ô chúng ta đang bấm vào

Nếu ô đang bấm vào nằm ở cột A và nằm từ dòng 3 trở đi thì thực hiện lệnh (vì dải ô xác thực là A3:A13)

Dòng lệnh này để xóa xác thực ở ô cùng hàng với activeCell trên cột B (tức cột “Model”). Mục đích là khi ta thay đổi giá trị iPhone, Samsung, hay Nokia thì ô bên cột B sẽ tự động “làm sạch”. Đây là câu lệnh không bắt buộc, chỉ thêm vào để đẹp thôi

Biến col dùng để để lấy các giá trị cho Smartphone, ở đây là dòng 1 trong sheet Database

“tam” sử dụng hàm indexOf để lấy số thứ tự của activeCell trong biến col. Ví dụ activeCell = iPhone, thì biến tam sẽ trả về số 1, vì iPhone nằm ở cột 1 (A) trong Database

Trong biến tam, có 2 thành phần cần lưu ý, thứ nhất là col[0] và thứ hai là +1 ở cuối

Nếu các bạn thử ghi ra file log biến col thì sẽ được kết quả như sau:

col = [[iPhone, Samsung, Nokia]]

Vì ở đây chúng ta dùng indexOf để lấy số thứ tự của biến cần tìm, nên ta phải đi trực tiếp vào phần tử mẹ của biến col để tìm. Để hiểu rõ, mời các bạn đọc thêm Bài viết về mảng

col[0] = [iPhone, Samsung, Nokia]

Chúng ta còn phải +1 vào cuối biến tam bởi vì khi dùng indexOf, số đếm bắt đầu từ 0. iPhone là 0, Samsung là 1, và Nokia là 2

Bước 2 – Lấy dải ô xác thực

Sau khi đã có số cột cần tìm, thì ta chỉ cần lấy dải ô có số cột tương ứng và gán vào biến luachon

Bước 3 – Ghi xác thực dữ liệu

Biến rule dùng để tạo Quy tắc xác thực dữ liệu. Ở đây, quy tắc chúng ta cần là dải ô ở biến luachon

Phần SpreadsheetApp.newDataValidation(). ở đầu và .build(); ở cuối là bắt buộc phải có. Còn các bạn có thể thay thế requireValueInRange() bằng các hàm tùy ý muốn. Xem các lựa chọn khác tại đây:

https://developers.google.com/apps-script/reference/spreadsheet/data-validation-builder

2 COMMENTS

  1. Cám ơn chủ web nhiều,

    Mình đã theo dõi hết các bài về google app script của bạn thì phải nói là rất dễ chịu, dễ hiểu và gần gũi ngay với người chưa không chuyên về lập trình như mình. Rất hy vọng là bạn sẽ viết thêm các bài khác nữa để mình có thể tiếp tục theo dõi.

    Hiện tại, trong bài này thì mình hỏi một chút là câu lệnh col[0] = [iPhone, Samsung, Nokia] thì số 0 ở đây có phải là đang nói về phần tử mẹ đầu tiên đúng không bạn?

    Vậy nếu là một mảng 02 chiều nhiều dòng nhiều cột ví dụ col[1] = [[‘a’,’b’,’c’],[‘d’,’e’,’f’],[‘g’,’h’,’i’]], thì là mình đang hiểu xét cho phần tử mẹ thứ hai [‘d’,’e’,’f’] đúng ko bạn?

    và nếu mình ghi là col[1][1] = [[‘a’,’b’,’c’],[‘d’,’e’,’f’],[‘g’,’h’,’i’]] thì là đang xét đến phần tử con ‘e’ đúng không ạ?

    Cám ơn bạn rất nhiều

    • Cảm ơn bạn vì đã quan tâm đến các bài chia sẻ của HocGgSheet.com
      Về câu hỏi về mảng ở trên thì bạn đã hiểu đúng rồi ạ

      Chúc bạn thành công. Thân 🙂

Leave a Reply