はじめに
GASではプロジェクトのトリガーから定期的(毎時間や毎日など)に実行することができ、今まではこの機能を使用して定期的に関数を実行させていました。しかしこの機能は永久に定期的に関数を実行させていると少しずつ時間がずれていく問題があります。そこで時間ベースで決まった頻度でプログラムを実行することができたのでその方法のメモ。
前提条件
- スクリプトエディタからプロジェクトが既に作られている状態であること
手順
内容:処理を終了する際に再度プロジェクトのトリガーを設定しなおす。
まず、Main()関数があり、そこから実行しているものと過程します。
他の関数をトリガーとして指定する場合はsetTrigger("【実行したい関数名】")と入力します。
function Main(){
try{...} //任意のプログラムを記述
catch(e){...} //任意のプログラムを記述
finally{
setTrigger("Main");//ここにトリガーとして実行したい関数名を記述
}
}
毎時間実行させる方法
以下の関数を追加します。
ここでのsetTrigger()関数はプログラムを実行した際にその時点の実行時間をインクリメントしてトリガーを再設定する。
挙動としては、0:00, 1:00, 2:00...で指定した関数が作動する。
function setTrigger(func_name) {
// 指定のトリガーがあれば削除する。
var triggers = ScriptApp.getProjectTriggers();
for(var i = 0; i < triggers.length; i++){
if(triggers[i].getHandlerFunction() == func_name)
ScriptApp.deleteTrigger(triggers[i]);
}
// 1時間後の00分に起動されるようトリガーを設定
var trigger_setTime = new Date();
trigger_setTime.setHours(trigger_setTime.getHours() + 1, 0, 0, 0);
ScriptApp.newTrigger(func_name).timeBased().at(trigger_setTime).create();
}
毎日決まった時間に実行する方法
以下の関数を追加します。
ここでのsetTrigger()関数はプログラムを実行した際にその時点の実行日をインクリメントしてトリガーを再設定する。
挙動としては、"2020/1/1 7:00", "2020/1/2 7:00","2020/1/3 7:00".....で動作する。
function setTrigger(func_name) {
// 指定のトリガーがあれば削除する。
var triggers = ScriptApp.getProjectTriggers();
for(var i = 0; i < triggers.length; i++) {
if(triggers[i].getHandlerFunction() == func_name)
ScriptApp.deleteTrigger(triggers[i]);
}
// 翌日の7:00にトリガーを設定
var trigger_setTime = new Date();
trigger_setTime.setDate(trigger_setTime.getDate() + 1);
trigger_setTime.setHours(7, 0, 0, 0);
ScriptApp.newTrigger(func_name).timeBased().at(trigger_setTime).create();
}
トリガーを設定しなおす方法
- setTrigger()関数の呼び出し元の関数を実行する
- 既にトリガーで毎時間等を設定している場合はそのトリガーによって実行された時から次の日時に設定されている
最後に
初めての記事作成なので、見苦しいかと思いますが参考になれば幸いです。