トリガーしたい(ScriptApp.newTrigger

1const triggerBuilder = ScriptApp.newTrigger("関数名")
2    .timeBased()     // トリガーの種類
3    .atHour(9)       // 午前9時
4    .everyDays(1)    // 毎日
5triggerBuilder.create();

ScriptApp.newTriggerでトリガーを作成できます。 トリガーの種類ごとにTriggerBuilderが用意されているので、目的にあったビルダーを呼び出して設定し、createします。

トリガーを確認したい

 1function getProjectTriggers() {
 2    const triggers = ScriptApp.getProjectTriggers();
 3    const n = triggers.length;
 4    Logger.log(`Found {$n} triggers`);
 5    if (n === 0) return []
 6
 7    const triggerList = triggers.map(trigger => ({
 8        functionName: trigger.getHandlerFunction(),
 9        eventType: trigger.getEventType(),
10        triggerSource: trigger.getTriggerSource(),
11        triggerSourceId: trigger.getTriggerSourceId(),  // ソースの固有ID。クロックイベントはnull
12        uniqueId: trigger.getUniqueId(),
13    }))
14}
15
16function logProjectTriggers(triggerList) {
17    if (triggerList.length == 0) {
18        Logger.log("現在設定されているトリガーはありません");
19        return;
20    }
21
22    triggerList.forEach(trigger => {
23        Logger.log(`関数名: ${trigger.functionName}`);
24        Logger.log(`種類  : ${trigger.eventType}`);
25        Logger.log(`ソース: ${trigger.triggerSource}`);
26        Logger.log(`ソースID: ${trigger.triggerSourceId}`);
27        Logger.log(`ユニークID: ${trigger.uniqueId}`);
28        logger.log("-----");
29    })
30}
31
32function showProjectTriggers() {
33    const triggers = getProjectTriggers();
34    logProjectTriggers(triggers);
35}

getProjectTriggersで、現在のプロジェクトに設定されているすべてのトリガーを取得できます。 get...log...show...のように、 用途を意識したコンポーネントに分離しておくと、便利です。

トリガーを追加したい

 1function addTriggerOnce(triggerBuilder, eventType) {
 2    const fnName = triggerBuilder.getHandlerFunction();
 3
 4    const isRegistered = ScriptApp.getProjectTriggers().some(trigger =>
 5        trigger.getHandlerFunction() === fnName &&
 6        trigger.getEventType() === eventType &&
 7        trigger.getTriggerSource() === ScriptApp.TriggerSource.CLOCK
 8    );
 9
10    if (isRegistered) {
11        Logger.log("トリガーはすでに登録済みです");
12        return;
13    }
14
15    triggerBuilder.create();
16    Logger.log("新しいトリガーを追加しました");
17}
18
19function addTrigger(fnName) {
20    const triggerBuilder = ScriptApp.newTrigger(fnName)
21        .timeBased()
22        .atHour(9)
23        .everyDays(1);
24
25    addTriggerOnce(triggerBuilder, ScriptApp.EventType.CLOCK);
26}

トリガーを追加するサンプルです。 設定済みのトリガーがないことを確認してから追加しています。

注釈

このサンプルは、ひとつの関数に対してひとつの時間帯だけ登録するようにしてあります。 ひとつの関数を異なる複数の時間帯に登録したい場合は、改良が必要です。

トリガーを削除したい(deleteTrigger

 1function deleteTriggerByFnName(fnName) {
 2    const triggers = ScriptApp.getProjectTriggers();
 3
 4    triggers.forEach(trigger => {
 5        if (trigger.getHandlerFunction() === fnName) {
 6            ScriptApp.deleteTrigger(trigger);
 7            Logger.log(`トリガーを削除しました: ${fnName}`);
 8        }
 9    })
10}

deleteTriggerで指定したトリガーを削除できます。 関数名で削除できるようにしておくと便利です。

時間主導型したい(ClockTriggerBuilder

1ScriptApp.newTrigger("関数名")
2  .timeBased()
3  .onWeekDay(ScriptApp.WeekDay.SUNDAY)
4  .create();

timeBasedで時間主導型のClockTriggerBuilderを作成できます。 ここではonWeekDayでトリガーを発行する曜日を設定しています。

リファレンス