觸發條件
觸發條件(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 會寄信給建立者;細節看編輯器左側 執行。
- 同一函式不要重複按「建立」,否則會疊很多份觸發;上線前到觸發條件頁清乾淨。
想一次看各種種類與觸發方式的對照,見 種類與觸發方式總覽。