【GAS】正確な時間に起動するトリガーの設定

GASは面倒な環境周りの設定をほぼすることなく動作するツールですが、それ故にいくつか制限事項があります。 例えば、毎日決まった時間に起動するバッチスクリプトを作成(=トリガーを作成)する時に、GUIから設定した場合、実行時間に1時間ほど幅が生じてしまいます。 今回は、正確な時間に起動するトリガーの作り方をご紹介します。

前提条件

  • GASをある程度理解できる
  • GUIからトリガーを作ったことがある

通常のトリガー

通常GUIから作成したトリガーは下図のように、実行時間に一定の幅が生まれてしまいます。

trigger1

これはGASのトリガーの仕様なので、GUIから指定する方法ではどうにもならないです。

しかしながら、これだと困る場合も出てくると思います(ex.毎日9時ジャストに起動させたい等)。

時間を確実に指定するならスクリプト中で動的にトリガーを作成

その場合、スクリプト中でトリガーを動的に作成する他ないです。 どういうことかというと、スクリプトの通常処理の後に、次に自身を呼び出すトリガーを時間指定で作成します。

// 現在の日付を取得
const next = new Date();

// 翌日の日付に変換
next.setDate(next.getDate() + 1);

// 09:30:00に時刻を設定
next.setHours(9);
next.setMinutes(30);
next.setSeconds(0);
  
// hogeを9時に実行するトリガーを作成
ScriptApp.newTrigger('hoge').timeBased().at(next).create();

では、細かく処理を見ていきます。

ScriptApp.newTriggerで任意のトリガーインスタンスを作成

ScriptApp.newTriggerGASに用意されているモジュールのひとつで、トリガーのインスタンス(TriggerBuilder型)を作成します。

引数には文字列型で、実行させたいメソッド名を指定します。

// fuga()を実行するトリガーインスタンスを生成
const fugaTrigger = ScriptApp.newTrigger('fuga');

TriggerBuilder型インスタンスを生成しただけでは、実際にトリガーがセットされることはありません。 TriggerBuilder型のcreate()を実行することではじめてトリガーが設定されます。

// この処理を実行することではじめてfugaTriggerが設定される
fugaTrigger.create();

timeBased()で時間指定のトリガーを生成

TriggetBuilder型のtimeBased()メソッドを実行することでClockTriggerBuilder型のインスタンスを生成します。

ClockTriggerBuilder型にはDate型を用いて実行時間を細かく指定することができます。 先ほどの例では、at()を用いて実行する時間を指定していました。 最終的にトリガーを設定するのはTriggerBuilder型と同じでcreate()を実行します。

// fugaTriggerのClockTriggerBuilderを生成
const fugaClockTrigger = fugaTrigger.timeBased();
// 2020/12/25 00:00:00に時間指定でセット
fugaClockTrigger.at(new Date(2020,11,25)).create();

出力結果

先のサンプルを実際に実行した場合、GUIで確認すると下図のようなトリガーが生成されているかと思います。

trigger2

これは毎日、翌日の09:30:00に起動するトリガーをその都度設定しているため、事実上毎日決まった時刻に起動するバッチ処理として成立しています。

まとめ

今回は、正確な実行時間を指定して動作するGASのトリガーの作成方法についてご紹介しました。 スクリプトの方に手を加えないといけないため、通常のトリガー設定に比べると多少ハードルは上がりますが、正確な実行時間を指定したい場面というのは割と多いのかなとも思うので、覚えておくとオススメです。

SNSでシェアする