ryoma's note

マイペース ੯•́ʔ̋ ͙͛*͛ ͙͛*͛ ͙͛̋و

GAS で特定のトリガーを削除する

GAS を触る機会があって、スクリプトから特定のトリガーを削除する方法について調べていた。

削除対象を Trigger クラスから区別する方法として、実行する関数名を返してくれるgetHandlerFunction() やソース固有の ID を返してくれる getTriggerSourceId() を利用する方法もあるようだが、今回は同じ関数を実行する時間主導型のトリガーを複数設定する予定だったので、残したいトリガーまで削除対象に含まれてしまう。

ドキュメントによると、一意の ID を返してくれる getUniqueId() という関数があり、今回の用途に適していたので利用することにした。自分で ID を管理する必要があるので、トリガーを設定するときにスプレッドシートに ID を保存する。

const time = new Date();
trigger = ScriptApp.newTrigger('myFunction').timeBased().at(time).create();

// スプレッドシートに uniqueId を出力する
trigger.getUniqueId();
...

トリガーの削除には deleteTrigger() の関数を利用できる。トリガーが実行する関数の中に含めることもできるが、今回はトリガーを削除するための関数を別に用意して、時間主導型のトリガーとして設定した。

const triggers = ScriptApp.getProjectTriggers();

// 削除対象の uniqueId を配列に詰める
let deleteTriggerIds = [];
...

for (const deleteTriggerId of deleteTriggerIds) {
  for (let i = 0; i < triggers.length; i++) {
    if (triggers[i].getUniqueId() === deleteTriggerId) {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}

特定のトリガーを削除できるようになったけど、もっといい方法があるかもしれない。

参考