可安裝的觸發條件

可安裝觸發條件與簡易觸發條件一樣,可讓 Apps Script 在特定事件 (例如開啟文件) 時自動執行函式。然而,可安裝觸發條件比簡單的觸發條件更靈活:這些觸發條件可以呼叫需要授權服務,可提供幾種額外的事件類型,包括時間導向 (時鐘) 觸發條件,並以程式輔助方式控制。無論是簡易型和可安裝的觸發條件,Apps Script 都會傳遞觸發函式的事件物件,其中含有事件發生情況的相關資訊。

限制

即使可安裝觸發條件比簡單的觸發條件更靈活,但仍會受到下列限制:

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

  • 可安裝的觸發條件一律會在建立該觸發條件的帳戶下執行。舉例來說,如果您建立可安裝的開啟觸發條件,系統就會在同事開啟文件 (如果您的同事具有編輯權限) 時執行該觸發條件,但該觸發條件會以您的帳戶身分執行。也就是說,如果您建立觸發條件在文件開啟時傳送電子郵件,則電子郵件一律會從您的帳戶傳送,不一定是開啟文件的帳戶。不過,您可以為每個帳戶建立可安裝的觸發條件,如此一來,每個帳戶都會傳送一封電子郵件。

  • 指定帳戶無法查看從第二個帳戶安裝的觸發條件,即使第一個帳戶仍可啟用這些觸發條件。

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

時間驅動的觸發條件

時間導向的觸發條件 (也稱為時鐘觸發條件) 與 Unix 中的 Cron 工作類似。時間導向觸發條件可讓指令碼在特定時間或週期性間隔執行,頻率與每分鐘相近,或每月只執行一次。(請注意,外掛程式最多每小時可使用一次時間導向觸發條件)。時間可能會略為隨機進行。舉例來說,如果您建立了上午 9 點的週期性觸發條件,Apps Script 就會選擇上午 9 點到 10 點之間的時間,並保持每天的時間一致,讓觸發條件在 24 小時後再次觸發。

以下的 Google Chat 應用程式範例會每分鐘在該應用程式所在的每個聊天室中發布一則訊息:

// Example app for Google Chat that demonstrates app-initiated messages
// by spamming the user every minute.
//
// This app makes use of the Apps Script OAuth2 library at:
//     https://github.com/googlesamples/apps-script-oauth2
//
// Follow the instructions there to add the library to your script.

// When added to a space, we store the space's ID in ScriptProperties.
function onAddToSpace(e) {
  PropertiesService.getScriptProperties()
      .setProperty(e.space.name, '');
  return {
    'text': 'Hi! I\'ll post a message here every minute. ' +
            'Please remove me after testing or I\'ll keep spamming you!'
  };
}

// When removed from a space, we remove the space's ID from ScriptProperties.
function onRemoveFromSpace(e) {
  PropertiesService.getScriptProperties()
      .deleteProperty(e.space.name);
}

// Add a trigger that invokes this function every minute in the
// "Edit > Current Project's Triggers" menu. When it runs, it
// posts in each space the app was added to.
function onTrigger() {
  var spaceIds = PropertiesService.getScriptProperties()
      .getKeys();
  var message = { 'text': 'Hi! It\'s now ' + (new Date()) };
  for (var i = 0; i < spaceIds.length; ++i) {
    postMessage(spaceIds[i], message);
  }
}
var SCOPE = 'https://www.googleapis.com/auth/chat.bot';
// The values below are copied from the JSON file downloaded upon
// service account creation.
// For SERVICE_ACCOUNT_PRIVATE_KEY, remember to include the BEGIN and END lines
// of the private key
var SERVICE_ACCOUNT_PRIVATE_KEY = '...';
var SERVICE_ACCOUNT_EMAIL = 'service-account@project-id.iam.gserviceaccount.com';

// Posts a message into the given space ID via the API, using
// service account authentication.
function postMessage(spaceId, message) {
  var service = OAuth2.createService('chat')
      .setTokenUrl('https://accounts.google.com/o/oauth2/token')
      .setPrivateKey(SERVICE_ACCOUNT_PRIVATE_KEY)
      .setClientId(SERVICE_ACCOUNT_EMAIL)
      .setPropertyStore(PropertiesService.getUserProperties())
      .setScope(SCOPE);
  if (!service.hasAccess()) {
    Logger.log('Authentication error: %s', service.getLastError());
    return;
  }
  var url = 'https://chat.googleapis.com/v1/' + spaceId + '/messages';
  UrlFetchApp.fetch(url, {
    method: 'post',
    headers: { 'Authorization': 'Bearer ' + service.getAccessToken() },
    contentType: 'application/json',
    payload: JSON.stringify(message),
  });
}

事件導向的觸發條件

從概念來看,可安裝的事件驅動觸發條件與簡易觸發條件類似 (例如 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 點觸發 (以指令碼設定的時區為準)。

triggers/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) 即可。

triggers/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 做為引數傳送至下列函式來刪除觸發條件。

triggers/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;
    }
  }
}

觸發條件中的錯誤

可安裝的觸發條件觸發時,如果函式擲回例外狀況或成功執行失敗,您就不會在螢幕上看到錯誤訊息。畢竟,當時間導向的觸發條件或其他使用者啟動表單提交觸發條件時,您甚至可能不會使用電腦。

而是會傳送下列電子郵件給您:

From: noreply-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. 如要刪除觸發條件,請按一下觸發條件右側的「更多」圖示 >「刪除觸發條件」

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

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