トリガーしたい(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
でトリガーを発行する曜日を設定しています。