GASは面倒な環境周りの設定をほぼすることなく動作するツールですが、それ故にいくつか制限事項があります。 例えば、毎日決まった時間に起動するバッチスクリプトを作成(=トリガーを作成)する時に、GUIから設定した場合、実行時間に1時間ほど幅が生じてしまいます。 今回は、正確な時間に起動するトリガーの作り方をご紹介します。
GAS
をある程度理解できるGUI
からトリガーを作ったことがある通常GUI
から作成したトリガーは下図のように、実行時間に一定の幅が生まれてしまいます。
これは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.newTrigger
はGAS
に用意されているモジュールのひとつで、トリガーのインスタンス(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
で確認すると下図のようなトリガーが生成されているかと思います。
これは毎日、翌日の09:30:00に起動するトリガーをその都度設定しているため、事実上毎日決まった時刻に起動するバッチ処理として成立しています。
今回は、正確な実行時間を指定して動作するGAS
のトリガーの作成方法についてご紹介しました。
スクリプトの方に手を加えないといけないため、通常のトリガー設定に比べると多少ハードルは上がりますが、正確な実行時間を指定したい場面というのは割と多いのかなとも思うので、覚えておくとオススメです。