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]); } } }
特定のトリガーを削除できるようになったけど、もっといい方法があるかもしれない。