Google Apps Script(以降、GAS)で、12時ちょうどに実行したい!毎時0分に実行したい!毎日7時ちょうどに実行したい!など、ちょうど0分などのタイミングで実行したいことってありますよね。 ただ、cronのような定期実行を設定したいとき、GASの通常のステップを踏むと、分単位の指定ってできないんですよね。 そこを解決する手法を紹介したいと思います。
現状の問題点
通常のステップで定期実行のトリガーを設定すると以下のようになるかと思います。
設定項目として、例えば12時に実行したい場合。
イベントのソースを選択:時間主導型 時間ベースのトリガーのタイプを選択:日付ベースのタイマー 時刻を選択:午後12時〜1時
ただ、この場合だと、12時台の何分に実行されるかがわからないという問題が発生します。実行のログを見ているとわかりますが、例えば1回目が12時38分に実行されたら、次の実行タイミングも12時38分とトリガーを登録したタイミングで何分かが決まるようです。 では、12時00分ということは、60分の1を引き当てれば良いということですね!それもまた一つの方法かと思います。ただ、おわかりだと思いますが、めんどくさい。
という問題を解消したいなと思います。
スクリプトから新しいトリガーを設定しよう
GAS上で、ScriptApp.newTrigger
というメソッドを利用することで、指定した時間に実行するトリガーを登録することができます。
Google Apps Scriptのドキュメントでは、こちらのページになります。
こちらを使用することで、分単位の指定した日時で起動するトリガーを作成することが可能となります。 これを利用することで、以下のような流れで分単位に指定したトリガーの定期実行を実現させます。
- 次の12時00分に実行するトリガーを設定
- 設定されたトリガーが実行されるタイミングで、再び翌日の12時00分に実行されるトリガーを作成する
これを繰り返すことで、起動が失敗しない限りは永遠に実行することができます。失敗したときのエラー処理などを作成してあげれば完璧かと思います。
実際のスクリプト
これをコードベースに落とし込むと以下になります。
function setTrigger() { var setTime = new Date(); setTime.setDate(setTime.getDate() + 1) setTime.setHours(12); setTime.setMinutes(00); ScriptApp.newTrigger('testMethod').timeBased().at(setTime).create(); } function testMethod() { setTrigger(); // 以降いつもの処理 }
こちらのコードの例だと、翌日の12時00分に設定するようになっています。
毎時の場合は、 setTime.setDate(setTime.getDate() + 1)
ではなく、時間を+1すれば実現できるかと思います。
最初にsetTrigger()を一回だけ実行しないとトリガーが設定されないので注意してください。
実際に設定されたもの
さて、こちらのスクリプトが実行されて、トリガーがちゃんと登録されるようになりました。 自分の場合は、今日実行したので、以下のようにトリガーが設定されました。
今日(9/23)の翌日ということで、しっかりと9/24の12:00に設定できているかと思います。 そして、次の実行時にもトリガーが新しく作成されるため、また明後日の12時00分にしっかりと実行してくれるでしょう。
さいごに
さて、今回はトリガーの作成するメソッドを利用して、分単位で定期実行するトリガーの作成を実現できました。 びっくりするくらい便利だけど知らないメソッドが多いので、もっとドキュメントを見なきゃですね。