はじめに
**「GASで1時間に一度、指定時刻にmyFunctionを実行する」**なんて
めっちゃ簡単そうと思ったら、
下記のような事情で、工夫が必要だったので記事にしました。
- 時間主導型のトリガーは、時刻を指定すると繰り返し実行できない
- ユーザー/スクリプトにつき設定できるトリガーは20個まで
目次
- 手順まとめ
- 解説
手順まとめ
タイムゾーンの変更
プロジェクトの設定から
「appsscript.json」マニフェスト ファイルをエディタで表示する」
にチェックを入れる
application.jsonを編集する
{
"timeZone": "Asia/Tokyo",
"dependencies": {
},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8"
}
詳しくはこちら
GASコード
// run in 23-24
function setTriggersAM() {
removeTriggers();
var time = new Date();
time.setDate(time.getDate() + 1);
for (var i = 0; i < 12; i++) {
time.setHours(i);
time.setMinutes(0);
ScriptApp.newTrigger('myFunction').timeBased().at(time).create();
}
}
// run in 11-12
function setTriggersPM() {
removeTriggers();
var time = new Date()
for (var i = 12; i < 24; i++) {
time.setHours(i);
time.setMinutes(0);
ScriptApp.newTrigger('myFunction').timeBased().at(time).create();
}
}
function removeTriggers() {
var triggers = ScriptApp.getProjectTriggers();
for (var i = 0; i < triggers.length; i++) {
if (triggers[i].getHandlerFunction() == "myFunction") {
ScriptApp.deleteTrigger(triggers[i]);
}
}
}
function myFunction() {
}
時間主導型トリガーの設定
- 1日に一度、23時から24時の間に
setTriggersAM()
を実行 - 1日に一度、11時から12時の間に
setTriggersPM()
を実行
解説
設計
function removeTriggers() {
// myFunction() を実行するトリガーを全て削除
}
function setTriggersAM() {
removeTriggers() // 実行済みのトリガーを削除するため
// myFunction()を実行するトリガーを、翌日の0時0分から11時00分まで1時間ごとに計12個設定
}
function setTriggersPM() {
removeTriggers() //実行済みのトリガーを削除するため
// myFunction()を実行するトリガーを、その日の12時0分から23時00分まで1時間ごとに計12個設定
}
function myFunction() {
// あなたが実行したい内容
}
1日に一度23時から24時の間に setTriggersAM() を実行する
1日に一度11時から12時の間に setTriggersPM() を実行する
注意点
GASの仕様
「時間主導型のトリガーは毎日特定の日時に設定できない」
(https://tonari-it.com/gas-trigger-set/ より引用。)
つまり、時間主導型のトリガーは、時刻を指定すると繰り返し実行できないということ。
それに加えて、
Apps script has a limited of 20 triggers per user/script.
(https://stackoverflow.com/questions/31713735/dynamically-set-google-script-time-driven-timers-and-too-many-timers-error-in-gm より引用)
つまり、ユーザー/スクリプトにつき設定できるトリガーは20個まで
という事情があるので、上記のような少し複雑な実装になっている。
setTriggersAM()とsetTriggersPM()の違い
setTriggersAM()
は23-24時に実行されるので、
翌日の0時0分から11時00分まで1時間ごとに計12個設定しているのに対して、
setTriggersPM()
は23-24時に実行されるので、
その日の12時00分から23時00分まで1時間ごとに計12個設定していることに注意。
タイムゾーンを変更する理由
タイムゾーンを変更しないと、setTriggersAM()
, setTriggersPM()
の
time.setHours(i);
でニューヨークのタイムゾーンの時刻がセットされてしまう。
参考URL