ポンコツエンジニアのごじゃっぺ開発日記。

いろいろポンコツだけど、気にするな。プログラム&ロボット大好きなポンコツが日々の記録を残していきます。 自動で収入を得られるサービスやシステムを作ることが目標!!

【GAS】毎日12:00ちょうどに定期実行したい!分単位で時間指定して定期実行を実現する方法。

Google Apps Script(以降、GAS)で、12時ちょうどに実行したい!毎時0分に実行したい!毎日7時ちょうどに実行したい!など、ちょうど0分などのタイミングで実行したいことってありますよね。 ただ、cronのような定期実行を設定したいとき、GASの通常のステップを踏むと、分単位の指定ってできないんですよね。 そこを解決する手法を紹介したいと思います。

現状の問題点

通常のステップで定期実行のトリガーを設定すると以下のようになるかと思います。

f:id:ponkotsu0605:20190923115742p:plain

設定項目として、例えば12時に実行したい場合。

イベントのソースを選択:時間主導型 時間ベースのトリガーのタイプを選択:日付ベースのタイマー 時刻を選択:午後12時〜1時

ただ、この場合だと、12時台の何分に実行されるかがわからないという問題が発生します。実行のログを見ているとわかりますが、例えば1回目が12時38分に実行されたら、次の実行タイミングも12時38分とトリガーを登録したタイミングで何分かが決まるようです。 では、12時00分ということは、60分の1を引き当てれば良いということですね!それもまた一つの方法かと思います。ただ、おわかりだと思いますが、めんどくさい。

という問題を解消したいなと思います。

スクリプトから新しいトリガーを設定しよう

GAS上で、ScriptApp.newTriggerというメソッドを利用することで、指定した時間に実行するトリガーを登録することができます。 Google Apps Scriptのドキュメントでは、こちらのページになります。

developers.google.com

こちらを使用することで、分単位の指定した日時で起動するトリガーを作成することが可能となります。 これを利用することで、以下のような流れで分単位に指定したトリガーの定期実行を実現させます

  • 次の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()を一回だけ実行しないとトリガーが設定されないので注意してください。

実際に設定されたもの

さて、こちらのスクリプトが実行されて、トリガーがちゃんと登録されるようになりました。 自分の場合は、今日実行したので、以下のようにトリガーが設定されました。

f:id:ponkotsu0605:20190923121050p:plain

今日(9/23)の翌日ということで、しっかりと9/24の12:00に設定できているかと思います。 そして、次の実行時にもトリガーが新しく作成されるため、また明後日の12時00分にしっかりと実行してくれるでしょう。

さいごに

さて、今回はトリガーの作成するメソッドを利用して、分単位で定期実行するトリガーの作成を実現できました。 びっくりするくらい便利だけど知らないメソッドが多いので、もっとドキュメントを見なきゃですね。