トリガーを作成したい(ScriptApp.newTrigger)
1ScriptApp.newTrigger("関数名")
2 .timeBased() // 時間主導型トリガー(ClockTriggerBuilder)
3 .atHour(9) // 午前9時
4 .everyDays(1) // 毎日
5 .create();
ScriptApp.newTriggerでトリガーを作成できます。
トリガーの種類ごとにTriggerBuilderが用意されているので、目的にあったビルダーを呼び出して設定し、createします。
上のサンプルではtimeBasedで時間主導型のClockTriggerBuilderを作成し、atHourとeveryDaysで「毎日午前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();
ClockTriggerBuilderのonWeekDayで、トリガーを発行する曜日を指定できます。
atHourやeveryDaysのかわりに使うことで「毎週日曜日」のような設定ができます。