Trigger & Tự Động Hóa

Thời gian đọc: ~35 phút

Trigger Là Gì?

Trigger (kích hoạt) cho phép Apps Script tự động chạy mà không cần bạn nhấn Run thủ công. Có hai loại trigger chính: Simple Triggers và Installable Triggers.

Simple Triggers

Simple Triggers là các hàm đặc biệt được Apps Script tự nhận dạng và chạy khi sự kiện xảy ra. Không cần cài đặt, nhưng có giới hạn quyền (không gửi email, không fetch URL):

// Chạy khi file được mở
function onOpen(e) {
  // Tạo menu, khởi tạo UI
}

// Chạy khi có chỉnh sửa trong Sheets
function onEdit(e) {
  const range = e.range;
  const col = range.getColumn();
  const row = range.getRow();
  const value = e.value;
  const oldValue = e.oldValue;
  Logger.log('O '+ range.getA1Notation() + ' doi tu ' + oldValue + ' sang ' + value);
}

// Chạy khi form được submit (từ script gắn với Sheet)
function onFormSubmit(e) {
  const values = e.values;
}

// Chạy khi Add-on được cài
function onInstall(e) {
  onOpen(e);
}

onEdit Thực Tế — Tự Động Timestamp

// Tự động ghi thời gian khi cột "Status" (cột 5) thay đổi
function onEdit(e) {
  const sheet = e.source.getActiveSheet();
  const range = e.range;

  // Chỉ xử lý sheet "Don Hang"
  if (sheet.getName() !== 'Don Hang') return;

  // Chỉ xử lý khi cột Status (cột 5) thay đổi
  if (range.getColumn() !== 5) return;

  // Ghi timestamp vào cột kế tiếp
  range.offset(0, 1).setValue(new Date());

  // Nếu status là "Hoan thanh", highlight màu xanh
  if (e.value === 'Hoan thanh') {
    range.getEntireRow().setBackground('#d9ead3');
  }
}

Installable Triggers

Installable Triggers cần cài đặt một lần, nhưng có toàn quyền (gửi email, fetch URL, v.v.). Cài qua UI hoặc code:

// Tạo trigger chạy hàng ngày lúc 8h sáng
function createDailyTrigger() {
  // Xóa trigger cũ tránh trùng lặp
  const triggers = ScriptApp.getProjectTriggers();
  triggers.forEach(function(t) {
    if (t.getHandlerFunction() === 'sendDailyReport') {
      ScriptApp.deleteTrigger(t);
    }
  });

  // Tạo trigger mới
  ScriptApp.newTrigger('sendDailyReport')
    .timeBased()
    .atHour(8)
    .everyDays(1)
    .inTimezone('Asia/Ho_Chi_Minh')
    .create();

  Logger.log('Da tao trigger hang ngay luc 8h');
}

// Trigger chay moi gio
function createHourlyTrigger() {
  ScriptApp.newTrigger('syncData')
    .timeBased()
    .everyHours(1)
    .create();
}

// Trigger vao dau moi tuan (Thu 2 8h)
function createWeeklyTrigger() {
  ScriptApp.newTrigger('weeklyReport')
    .timeBased()
    .onWeekDay(ScriptApp.WeekDay.MONDAY)
    .atHour(8)
    .create();
}
Simple vs Installable Triggers:
Simple: Không cần cài, giới hạn quyền, chạy dưới account người dùng hiện tại.
Installable: Cần authorize một lần, full quyền, chạy dưới account người cài — kể cả khi file được chia sẻ với người khác.

Quản Lý & Xóa Trigger

// Xem tất cả trigger hiện có
function listTriggers() {
  const triggers = ScriptApp.getProjectTriggers();
  triggers.forEach(function(t) {
    Logger.log(t.getHandlerFunction() + ' - ' + t.getEventType());
  });
}

// Xoa tat ca trigger
function deleteAllTriggers() {
  ScriptApp.getProjectTriggers().forEach(function(t) {
    ScriptApp.deleteTrigger(t);
  });
  Logger.log('Da xoa tat ca trigger');
}
Use case phổ biến: Đặt trigger hàng ngày lúc 7h để tổng hợp doanh thu ngày hôm trước, gửi email báo cáo cho manager. Kết hợp SpreadsheetApp + MailApp + Time-based trigger.