可安裝的觸發條件

如同簡易觸發條件,可安裝的觸發條件可讓 Apps Script 在發生特定事件 (例如開啟文件) 時自動執行函式。可安裝的觸發條件比簡單的觸發條件更有彈性:他們可以呼叫需要授權服務、提供幾種其他事件類型 (包括時間型) 觸發條件,以及可透過程式控制。針對簡單和可安裝的觸發條件,Apps Script 都會傳遞觸發事件的事件物件,其中包含事件發生的情境相關資訊。

限制

雖然可安裝的觸發條件比簡單的觸發條件更靈活,但仍會受到一些限制:

  • 如果檔案以唯讀 (檢視或註解) 模式開啟,則無法執行。針對獨立指令碼,使用者必須具備指令碼檔案的檢視權限,觸發條件才能正常運作。
  • 指令碼執行作業和 API 要求並不會導致觸發條件執行。舉例來說,呼叫 FormResponse.submit() 來提交新的表單回應,並不會導致表單的提交觸發條件執行。

  • 可安裝的觸發條件一律會在建立觸發條件所屬帳戶下執行。舉例來說,如果您建立一個可安裝的開放觸發條件,當同事開啟文件 (如果同事擁有編輯權限),系統就會執行您的廣告。也就是說,如果您建立觸發條件會在開啟文件時傳送電子郵件,該電子郵件一律會從您的帳戶傳送,不一定是開啟文件的帳戶。不過,您可以為各個帳戶建立可安裝的觸發條件,這樣就能從每個帳戶收到一封電子郵件。

  • 即使第一個帳戶仍可啟用這些觸發條件,也還是無法觸發透過第二個帳戶安裝的觸發條件。

  • 可安裝的觸發條件必須遵守 Apps Script 觸發條件配額限制

時間型觸發條件

時間型觸發條件 (也稱為時鐘觸發條件) 與 Unix 中的 Cron 工作類似,以時間為準的觸發條件可讓指令碼在特定時間或以週期性執行,執行頻率為每分鐘一次,或每月最多一次。(請注意,外掛程式可以每小時最多使用一次觸發條件型觸發條件)。時間可能會略為隨機。舉例來說,如果您建立週期性上午 9 點觸發,則 Apps Script 會選擇介於上午 9 點到上午 10 點之間的時間,然後將時間設為每天持續 24 小時,直到觸發條件再次觸發為止。

事件導向觸發條件

可安裝的事件驅動觸發條件的概念與簡易觸發條件類似,例如 onOpen(),但可以回應其他事件,行為表現也有所不同。

舉例來說,只要具有編輯權限的試算表使用者開啟試算表,就會啟用 Google 試算表的可開啟公開觸發條件,就像簡單的 onOpen() 觸發條件一樣。不過,可安裝的版本可以呼叫需要授權服務。即使有編輯權限的其他使用者開啟試算表,可安裝版本的指令碼仍會與建立觸發條件的使用者執行。

「 Google Workspace 」應用程式有幾項可安裝的觸發條件:

  • 使用者開啟一份具備編輯權限的試算表、文件或表單時,系統會執行可安裝的「開啟」觸發條件。
  • 當使用者修改試算表中的值時,就會觸發可安裝的編輯觸發條件。
  • 當使用者修改試算表的結構時 (例如新增工作表或移除資料欄),就會執行可安裝的變更觸發條件。
  • 使用者提交表單時,系統會執行可安裝的表單提交觸發條件。 表單提交觸發條件有兩種版本,一個用於 Google 表單如果表單提交至試算表,則為 Google 表單
  • 更新使用者的日曆活動、編輯或刪除活動時,系統會執行可安裝的日曆活動觸發條件。

您可以在獨立指令碼和繫結指令碼中使用可安裝的觸發條件。舉例來說,獨立的指令碼可透過呼叫 TriggerBuilder.forSpreadsheet(key) 並傳入試算表 ID,以程式輔助方式為任意 Google 試算表檔案建立可安裝觸發條件。

手動管理觸發條件

如要在指令碼編輯器中手動建立可安裝的觸發條件,請按照下列步驟操作:

  1. 開啟 Apps Script 專案。
  2. 按一下左側的「觸發條件」圖示
  3. 按一下右下方的 [新增觸發條件]
  4. 選取並設定您要建立的觸發條件類型。
  5. 按一下「儲存」

透過程式管理觸發條件

您也可以使用指令碼服務,透過程式建立及刪除觸發條件。首先呼叫 ScriptApp.newTrigger(functionName),其會傳回 TriggerBuilder

以下範例說明如何建立兩個時間型觸發條件,一個在每 6 小時觸發一個觸發條件,另一個則是每週一上午 9 點觸發一次 (在指令碼所設定的時區中)。

trigger/triggers.gs
/**
 * Creates two time-driven triggers.
 * @see https://developers.google.com/apps-script/guides/triggers/installable#time-driven_triggers
 */
function createTimeDrivenTriggers() {
  // Trigger every 6 hours.
  ScriptApp.newTrigger('myFunction')
      .timeBased()
      .everyHours(6)
      .create();
  // Trigger every Monday at 09:00.
  ScriptApp.newTrigger('myFunction')
      .timeBased()
      .onWeekDay(ScriptApp.WeekDay.MONDAY)
      .atHour(9)
      .create();
}

下一個範例說明如何為試算表建立可安裝的開啟觸發條件。請注意,與簡單的 onOpen() 觸發條件不同,可安裝觸發條件的指令碼不必繫結至試算表。如要透過獨立指令碼建立這個觸發條件,只要將 SpreadsheetApp.getActive() 替換為呼叫 SpreadsheetApp.openById(id) 即可。

trigger/triggers.gs
/**
 * Creates a trigger for when a spreadsheet opens.
 * @see https://developers.google.com/apps-script/guides/triggers/installable
 */
function createSpreadsheetOpenTrigger() {
  const ss = SpreadsheetApp.getActive();
  ScriptApp.newTrigger('myFunction')
      .forSpreadsheet(ss)
      .onOpen()
      .create();
}

如要透過程式輔助方式修改現有的可安裝觸發條件,您必須刪除並建立新的觸發條件。如果您先前儲存了觸發條件的 ID,可以將 ID 做為引數傳遞至下列函式,以刪除該觸發條件。

trigger/triggers.gs
/**
 * Deletes a trigger.
 * @param {string} triggerId The Trigger ID.
 * @see https://developers.google.com/apps-script/guides/triggers/installable
 */
function deleteTrigger(triggerId) {
  // Loop over all triggers.
  const allTriggers = ScriptApp.getProjectTriggers();
  for (let index = 0; index < allTriggers.length; index++) {
    // If the current trigger is the correct one, delete it.
    if (allTriggers[index].getUniqueId() === triggerId) {
      ScriptApp.deleteTrigger(allTriggers[index]);
      break;
    }
  }
}

觸發條件發生錯誤

如果可安裝的觸發條件觸發,但函式擲回例外狀況,否則無法成功執行,系統就不會在螢幕上顯示錯誤訊息。畢竟,當啟用以時間為準的觸發條件執行時,或是其他使用者啟用您的表單提交觸發條件後,您可能甚至不會使用電腦。

Apps Script 會透過電子郵件傳送這類電子郵件給您:

From: apps-scripts-notifications@google.com
Subject: Summary of failures for Google Apps Script
Your script has recently failed to finish successfully.
A summary of the failure(s) is shown below.

電子郵件會包含停用或重新設定觸發條件的連結。如果指令碼繫結至 Google 試算表、文件或表單檔案,電子郵件中也會附上該檔案的連結。這些連結可讓您停用觸發條件或編輯指令碼來修正錯誤。

如要查看與 Google 帳戶相關聯的所有觸發條件,並停用不再需要的觸發條件,請按照下列步驟操作:

  1. 前往 script.google.com
  2. 按一下左側的「我的觸發條件」
  3. 如要刪除觸發條件,請依序點選觸發條件右側的「更多」圖示 >「刪除觸發條件」

外掛程式中的可安裝觸發條件

如要進一步瞭解如何在外掛程式中使用可安裝的觸發條件,請參閱外掛程式觸發條件