トリガーを作成したい(ScriptApp.newTrigger

1ScriptApp.newTrigger("関数名")
2    .timeBased()     // 時間主導型トリガー(ClockTriggerBuilder)
3    .atHour(9)       // 午前9時
4    .everyDays(1)    // 毎日
5    .create();

ScriptApp.newTriggerでトリガーを作成できます。 トリガーの種類ごとにTriggerBuilderが用意されているので、目的にあったビルダーを呼び出して設定し、createします。 上のサンプルではtimeBasedで時間主導型のClockTriggerBuilderを作成し、atHoureveryDaysで「毎日午前9時」を設定しています。

トリガーを確認したい

 1function showProjectTriggers() {
 2    const triggers = ScriptApp.getProjectTriggers();
 3
 4    if (triggers.length === 0) {
 5        Logger.log("現在設定されているトリガーはありません");
 6        return;
 7    }
 8
 9    triggers.forEach(trigger => {
10        Logger.log(`関数名: ${trigger.getHandlerFunction()}`);
11        Logger.log(`種類  : ${trigger.getEventType()}`);
12        Logger.log(`ソース: ${trigger.getTriggerSource()}`);
13        Logger.log(`ソースID: ${trigger.getTriggerSourceId()}`);  // クロックイベントはnull
14        Logger.log(`ユニークID: ${trigger.getUniqueId()}`);
15        Logger.log("-----");
16    });
17}

ScriptApp.getProjectTriggersで、現在のプロジェクトに設定されているすべてのトリガーを取得できます。 Triggerオブジェクトのget...系メソッドで、関数名や種類などの詳細を確認できます。

トリガーを追加したい

 1function addTrigger(fnName, configure) {
 2    // 同じ関数に対する既存トリガーを削除する
 3    ScriptApp.getProjectTriggers()
 4        .filter(trigger => trigger.getHandlerFunction() === fnName)
 5        .forEach(trigger => ScriptApp.deleteTrigger(trigger));
 6
 7    // 新しいトリガーを追加する
 8    // configureで、ビルダーの設定(timeBased/onEdit/onFormSubmitなど)を行う
 9    configure(ScriptApp.newTrigger(fnName)).create();
10    Logger.log(`トリガーを追加しました: ${fnName}`);
11}

トリガーを追加する関数です。 configureに、TriggerBuilderを受け取って設定する関数を渡すことで、 「毎日午前9時」に限らず、任意の種類・任意の設定のトリガーを追加できます。

 1// 毎日午前9時に実行する時間主導型トリガー
 2addTrigger("onDaily", builder => builder.timeBased().atHour(9).everyDays(1));
 3
 4// 毎週日曜日に実行する時間主導型トリガー
 5addTrigger("onWeekly", builder => builder.timeBased().onWeekDay(ScriptApp.WeekDay.SUNDAY));
 6
 7// フォーム送信時に実行するトリガー
 8addTrigger("onFormSubmit", builder => builder.forSpreadsheet("シートID").onFormSubmit());
 9
10// シート編集時に実行するトリガー
11addTrigger("onEdit", builder => builder.forSpreadsheet("シートID").onEdit());

同じ関数に対するトリガーがすでに存在する場合は、いったん削除してから追加し直しています。 こうしておくと、addTriggerを何度実行してもトリガーが重複登録される心配がありません。

複数のトリガーをまとめて追加したい

1function setupTriggers() {
2    addTrigger("onDaily", builder => builder.timeBased().atHour(9).everyDays(1));
3    addTrigger("onFormSubmit", builder => builder.forSpreadsheet("シートID").onFormSubmit());
4    addTrigger("onEdit", builder => builder.forSpreadsheet("シートID").onEdit());
5}

登録したいトリガーの分だけaddTriggerを呼び出すだけで、複数のトリガーをまとめて追加できます。 プロジェクトの初回実行時に、このsetupTriggersをエントリーポイントとして呼び出しておくと便利です。

トリガーを削除したい(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で指定したトリガーを削除できます。 関数名で削除できるようにしておくと便利です。

曜日を指定してトリガーを作成したい(onWeekDay

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

ClockTriggerBuilderonWeekDayで、トリガーを発行する曜日を指定できます。 atHoureveryDaysのかわりに使うことで「毎週日曜日」のような設定ができます。

リファレンス