GAS 開始時間を秒単位で指定して一定時間毎分トリガーをセットする方法
2020.07.13
GASとは
Google Apps Scriptという、Googleが提供しているクラウド上でスクリプトを実行できる環境のことをいいます。
JavaScriptをベースにした言語で書き、GoogleドライブやGmail、スプレッドシートといったGoogleの各種サービスと簡単に連携することができます。
トリガー について
作成したスクリプトを自動実行したいときに使うのが、トリガー 。画面上からぽちぽち設定することができます。cronやタスクスケジューラのようなものです。
設定できるトリガーを実行するタイミング(イベント)
スプレッドシート
時間主導
Googleカレンダー
それぞれの詳しい説明と、基本的な設定方法についてはこのページが参考になります。【GAS】Google Apps Scriptトリガーの種類と使い方を徹底解説!
時間主導トリガー
今回使いたいのは、時間主導のトリガーなのですが、その中にも6種類あります。
特定の日時(指定したYYYY-MM-DD HH:MMに1回だけ実行)
分ベースのタイマー(1分、5分、10分、15分、30分おきに実行)
時ベースのタイマー(1時間、2時間、4時間、6時間、8時間、12時間おきに実行)
日付ベースのタイマー(毎日n時〜n+1時のどこかで実行)
週ベースのタイマー(毎週n曜日のどこかで実行)
月ベースのタイマー(毎月n日のどこかで実行)
いろいろあるのですが、開始と終了を設定することはできない・・・。
そして、最小の指定は分であり、仮に06:00に指定しても06:00から06:01の間のどこかで処理が実行されるため、何秒に処理!ということまでは指定できません。
細かい設定はできないのです。
やりたいこと
毎日、06:00:00から07:00:00の間、1分間隔で実行したい。
上記の通り、画面上で設定するトリガーでは実現できないので、自分でスクリプトを書きました。
方法
//実行したい処理
function main(){
//ここに毎分実行したい処理を書く
}
//開始時間から終了時間までのトリガーを設定する
//日付ベースのトリガー(0~1時)として設定しておく
function setTrigger() {
deleteTrigger('minuteTrigger');
var registerDate = new Date();
registerDate.setHours(05);//本当に開始したい時間の1分前にしておく
registerDate.setMinutes(59);
ScriptApp.newTrigger('minuteTrigger').timeBased().at(registerDate).create();
deleteTrigger('minutedeleteTrigger');
var registerDate = new Date();
registerDate.setHours(07);//終了時間
registerDate.setMinutes(00);
ScriptApp.newTrigger('minutedeleteTrigger').timeBased().at(registerDate).create();
}
//トリガー削除
function deleteTrigger(triggerName) {
ScriptApp.getProjectTriggers().forEach(function(trigger) {
if (trigger.getHandlerFunction() == triggerName) {
ScriptApp.deleteTrigger(trigger);
}
});
}
//毎分実行するトリガーを作成する
function minuteTrigger() {
deleteTrigger('main');
waitUntilTime(00);
ScriptApp.newTrigger('main').timeBased().everyMinutes(1).create();
}
//毎分実行トリガーを削除する
function minutedeleteTrigger() {
deleteTrigger('main');
}
//指定の秒までまつ
function waitUntilTime() {
var notificationTime = new Date();
notificationTime.setHours(06);
notificationTime.setMinutes(00);
notificationTime.setSeconds(00);
Utilities.sleep((notificationTime - new Date()));
}
解説
ClockTriggerBuilder クラスを使うと、 画面上で設定するトリガーと同じことをスクリプトで設定できるようになります。
ちょっとややこしいのですが・・・
- 00:00〜01:00: setTrigger が実行
- 毎分実行トリガー である minuteTrigger を05:59~06:00の間にセット
- 07:00〜07:01の間に minuteTrigger を削除する minutedeleteTrigger もセット
- 05:59:minuteTrigger が実行
- waitUntilTime を使って06:00までの差分時間分だけ処理をストップ
- 06:00になったら毎分トリガーとして main をセット
- 06:00〜07:00の間:main が毎分実行
- 07:00:minutedeleteTrigger が実行
- 毎分トリガーである main を削除
一定時間処理を止めるために、Utilities.sleepという関数をつかっています。
最初の1回が思い通りの秒に走れば、あとは1分ごとに走ってくれるので心配なしです。
ちなみに、minutedeleteTriggerは07:00〜07:01のどこかで走るので、タイミングによっては最後の1回main処理が走らない可能性があるので、終了時刻は余裕を持って設定したほうがいいと思います。
日付ベースのトリガーとして setTrigger を登録しておくこともお忘れなく!
参考ページ:GASで自作トリガー!ClockTriggerBuilder を使ってトリガーをカスタマイズしてみた!
参考ページ:GAS(Google Apps Script)で秒まで指定して実行する
以上、オープンレポートでした
技術的なことで調べたり勉強したことを残していきます。日報をブログでやってみています
きっとゆるめに脱線することもあると思いますが、ゆるめに見守っていただければと思います。
参考にさせてもらったみんなのアウトプットに最大限のリスペクトと感謝を。
そして、この記事が誰かの役に立つことを願って