跳轉至

建立 2026-09-15 更新 2026-09-21

觸發條件

觸發條件(trigger)讓函式在「開啟檔案、改儲存格、送出表單、時間到了」時自己跑。分兩類:簡易觸發靠函式名稱自動生效;可安裝觸發要在編輯器或用 ScriptApp 建立,權限比較完整。

簡易觸發

只要專案裡有這些名字的函式,繫結檔案就會呼叫它們:

函式 何時跑 常見用途
onOpen(e) 有編輯權的人打開檔案 加選單
onEdit(e) 有人改了儲存格 自動時間戳、驗證
onSelectionChange(e) 選取範圍變了 少用;容易太吵
onInstall(e) 安裝編輯器外掛 通常改呼叫 onOpen
doGet / doPost 網頁應用被請求 見 網頁應用
function onEdit(e) {
  const sheet = e.range.getSheet();
  if (sheet.getName() !== "工作區") return;
  if (e.range.getColumn() !== 1) return;
  e.range.offset(0, 1).setValue(new Date());
}

e.range 是被改的格子。務必先過濾工作表與欄,否則整張表每次按鍵都會跑。

簡易觸發的限制:不能呼叫需要授權的服務(不能寄信、不能開別人的 Drive 檔)、只能動繫結的那個檔案、單次最多 30 秒、開檔者若只有檢視權不會跑,也無法可靠取得目前使用者的身分。

onOpen、onEdit 只在繫結腳本裡有效;onOpen 在試算表、文件、簡報、表單都能用,onEdit 與 onSelectionChange 只有試算表。

可安裝觸發

編輯器左側時鐘 → 新增觸發條件,或用程式:

function createDailyTrigger() {
  ScriptApp.newTrigger("refreshReport")
    .timeBased()
    .everyDays(1)
    .atHour(8)
    .create();
}

表單提交、每天寄信、讀 Gmail,都必須用可安裝觸發。可用的事件:

事件來源 何時跑 常見用途
時間驅動 到了指定時間或週期 每天寄報表、定時抓資料、排程推播
試算表:開啟 有編輯權的人開啟 需要授權的初始化
試算表:編輯 儲存格內容被改 編輯時要寄信、要動別的檔案
試算表:變更 結構改變(新增工作表、刪欄) 偵測表格被人改壞
表單:提交 有人送出表單 自動回信、寫入日曆
日曆:事件更新 事件被建立、修改或刪除 同步行程

時間驅動的週期選項

寫法 意思
.everyMinutes(n) 每 n 分鐘,n 只能是 1、5、10、15、30
.everyHours(n) 每 n 小時
.everyDays(n).atHour(h) 每 n 天,在第 h 點到 h+1 點之間
.everyWeeks(n).onWeekDay(ScriptApp.WeekDay.MONDAY) 每 n 週的某一天
.onMonthDay(d) 每月 d 號
.at(date) 只跑一次,在指定的 Date
.after(ms) 幾毫秒後跑一次,常用來「接力續跑」長工作

時間不會精準到秒:官方說明時間可能有些微隨機延遲,所以別拿來做要求準時到秒的事。時間驅動的時區看專案設定,不是你筆電的時區。

使用可安裝觸發要注意

  • 永遠用建立者的身分執行,不是動手改表的人。寄信會顯示建立者的地址,也吃建立者的配額。
  • 腳本不會觸發腳本:用程式改儲存格,不會觸發 onEdit。
  • 每人每專案最多 20 個觸發;所有觸發的每日總執行時間也有上限,見 效能與執行限制。
  • 觸發失敗時,Google 會寄信給建立者;細節看編輯器左側 執行。
  • 同一函式不要重複按「建立」,否則會疊很多份觸發;上線前到觸發條件頁清乾淨。

想一次看各種種類與觸發方式的對照,見 種類與觸發方式總覽。

官方對照表:簡易觸發、可安裝觸發。