Bài 7: Giới thiệu các Trigger App Script – onEdit onOpen

onEdit() và onOpen() là hai trigger cơ bản và phổ biến nhất của App Script. Để sử dụng chúng, bạn chỉ đơn giản là đổi tên function của bạn thành onEdit hoặc onOpen. Ví dụ:

Để đọc thêm về các trigger, các bạn có thể truy cập vào link sau:

https://developers.google.com/apps-script/guides/triggers/

Trong bài này mình sẽ đưa ra các ví dụ cụ thể về việc ứng dụng chúng trong App Script Sheet. Để xem file luyện tập, các bạn hãy kéo xuống dưới cùng nhé. Còn đây là video hướng dẫn:

1. onEdit()

Một function có tên là onEdit sẽ: chạy chương trình khi người dùng (user) thay đổi một giá trị bất kì trong bảng tính Google Sheet

Ví dụ

Tiếp nối ví dụ của bài 6: câu lệnh if , lần này mình thực hiện yêu cầu sau:

Hình minh họa ví dụ onEdit
Hình minh họa ví dụ onEdit
  • Trên Google Sheet, mình thêm một cột bên trái cột A cũ trong bài 6. Cột này được Xác thực dữ liệu, chỉ nhận 2 giá trị “Duyệt” hoặc “Không duyệt”
  • Khi chọn những lựa chọn ở cột A mới, ô chúng ta đang bấm vào được gọi là Active cell
  • Khi chọn “Duyệt”, dải ô gồm các ô cùng hàng với Active cell sẽ được di chuyển sang sheet1 ngay lập tức
  • Nếu chọn “Không duyệt” hoặc giá trị khác, thì để nguyên, không làm gì cả

Code hoàn chỉnh

Chú thích các biến

BiếnÝ nghĩa
activeCellô đang được kích hoạt ở Google Sheet
activeCellValuegiá trị của activeCell
rangelấy dải ô chứa các giá trị cùng hàng với activeCell
dichđích đến khi thực hiện Di chuyển hoặc Copy dòng

2. onOpen()

Một function có tên là onOpen sẽ: chạy chương trình khi user mở file Google Sheet, hoặc làm mới (refresh) file. Ngoài ra, nếu file Google Sheet được kết nối với Google Form (biểu mẫu) thì onOpen sẽ chạy code mỗi khi có người gửi form (new response)

Ví dụ

Để minh họa ví dụ onOpen, mình viết một đoạn code đơn giản có mục đích như sau:

Khi user Làm mới / Mở file Google Sheet, ô H1 trong sheet0 sẽ ghi số lượng dòng có dữ liệu hiện đang có trong sheet0

Code

Chú thích các biến

  • numRow dùng để lưu lại số lượng dòng có dữ liệu hiện đang có trong sheet0

Code nâng cao – Nối chuỗi

Ví dụ nâng cao minh họa onOpen
Ví dụ nâng cao minh họa onOpen

Để cải tiến code của ví dụ onOpen, mình muốn ô H1 hiện lên thông báo: “Hiện có … dòng”, với … là biến numRow. Để nối chuỗi, ta dùng dấu cộng (+). Lưu ý nhớ để kí tự trống ở sau hoặc trước các chuỗi nối.

File luyện tại cho Bài 7

https://docs.google.com/spreadsheets/d/1Xtibys_azXe7DcQsgYno6yYEbNZo6CALrPd5zsq3d2s/edit#gid=0

Lưu ý: để xem, chỉnh sửa file và code, các bạn vui lòng chọn File (tệp) -> Make a copy (copy) để Copy file vào Google Drive của các bạn nhé.

7 COMMENTS

  1. Hi admin
    Bài giảng của bạn rất hay, dễ hiểu
    Mình có 1 chút thắc mắc ví dụ mình có 2 cột A và B là cột nhập thời gian sửa chữa máy chẳng hạn ( dùng google form để nhập. Mình muốn cột C là kết quả thời gian dừng máy ( lấy B – A)
    mình tạo ra code như sau:

    function onEdit()
    {
    var ss=SpreadsheetApp.getActiveSpreadsheet();
    var sheet0=ss.getSheetByName(“sheet0”);
    var cotA=sheet0.getRange(sheet0.getLastRow(), 1);
    var cotB=sheet0.getRange(sheet0.getLastRow(), 2);
    var cotC=sheet0.getRange(sheet0.getLastRow(), 3);
    var giatriC= cotB.getValue()-cotA.getValue();
    cotC.setValue(giatriC);
    }

    Code này nếu là các số bình thường thì sẽ ra kết quả đúng khi nhập cột A và cột B là số. Nhưng nếu nhập là thời gian thì sẽ ra kết quả không mong muốn. Mong bạn chỉ ra cách giúp mình. Tks

    • Chào bạn, cảm ơn bạn đã ghé thăm web của mình
      Câu hỏi của bạn rất thú vị. Tại vì hồi trước khi mình xử lý 1 project liên quan đến thời gian trong Apps Script thì đã khá vất vả để hiểu cách nó hoạt động. Mình xin trả lời bạn thế này:
      Sau khi getValue 2 ô thời gian, và trừ 2 giá trị này cho nhau, bạn sẽ được 1 số tương đối lớn. Đó là kết quả Dưới Dạng Mili Giây (milisecond).
      Mà 1 ngày = 86400000 mili giây. Thế nên sau khi trừ 2 ngày cho nhau, bạn lấy kết quả chia cho 86400000 thì sẽ ra số ngày.
      Cụ thể code trên thì bạn có thể sửa như sau:
      function onEdit()
      {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet0 = ss.getSheetByName(“sheet0”);
      var cotA = sheet0.getRange(sheet0.getLastRow(), 1);
      var cotB = sheet0.getRange(sheet0.getLastRow(), 2);
      var cotC = sheet0.getRange(sheet0.getLastRow(), 3);
      var giatriC = (cotB.getValue()-cotA.getValue())/86400000;
      cotC.setValue(giatriC);
      }

  2. Hi admin
    Thank bạn đã trả lời câu hỏi của mình. Nhưng có 1 số điểm mình chưa rõ như sau. Ví dụ mình tạo form nhập lấy số liệu time để sửa máy và mình muốn để tự động tính thời gian sửa máy cho form đó. Mình sử dụng trigger onOpen và cả onEdit để thử. Nhưng nếu như mình ko bật online file google sheet đó thì sau một khoảng thời gian người khác nhập qua google form trên 2 dữ liệu (ví dụ có 2 máy hỏng trở lên) thì khi mở form ra nó chỉ tính cho dữ liệu nhập cuối cùng mà ko tính cho các dữ liệu khác vừa nhập sau khi mình tắt google sheet được nhập vào. Vậy có cách nào giải quyết vấn đề này không bạn?
    Hoặc bạn có thể hướng dẫn cao hơn là hướng dẫn mình tính công thức trừ thời gian trên chỉ cho những dữ liệu mới nhập vào sau khi mình tắt google sheet và mở lại ( những dữ liệu được nhập google form trong khoảng thời gian này)
    Nếu như chưa rõ câu hỏi mình, bạn phản hồi lại để mình gửi hình ảnh hoặc file liên quan nhé.
    Thank ad nhiều!

    • Lỗi khá lạ =)) Khả năng cao là do những người điền form không có quyền sử dụng code apps script HOẶC bạn thử lại dùng trigger onFormSubmit() thay vì onEdit() xem. Từ hồi tháng 8/2019 Apps Script có rất nhiều thay đổi và 2 trigger cũng bị ảnh hưởng ít nhiều. Nếu vẫn không được thì bạn vui lòng gửi link file lên đây và chia sẻ quyền cho mình vào mail [email protected] với nhé.

    • Chào bạn, có vẻ như đợt thay đổi đó đã thay đổi luôn cả chức năng của trigger onEdit(). Bây giờ thì bạn phải thiết lập trigger bằng tay chứ không được viết tên function giống với tên trigger được nữa. Cụ thể như sau:
      1. Trong giao diện apps script, vào Edit -> Current project’s triggers
      2. Tại Current project’s triggers, chọn Add Trigger (nút màu xanh ở góc phải dưới màn hình)
      3. Tùy chỉnh các lựa chọn như sau:
      – Choose which function to run: onEdit (đây là function mà mỗi lần gửi form thì sẽ chạy)
      – Select event type: on form submit (mỗi lần gửi form)

      Bạn thử xem sao nhé. Có gì thì cứ trao đổi qua comment ở đây, mình sẽ đọc và phản hồi.

  3. Ok. Được rồi AD
    Cảm ơn ad nhiều
    P/S: seri về nâng cao google sheet bằng App Scrips rất hay. Bạn có thể hướng dẫn thêm một số thủ thuật nữa được ko? Ví dụ giống như excel làm cách nào khởi động VBA 1 cách trực quan (ấn nút) trên trang sheet cho người ko biết về VBA cũng xài được….và nhiều kiến thức khác

Leave a Reply