はじめに
Google Apps Scriptのトリガー設定には、タイマーを設定することにより毎日1回実行させることができます。
しかし、以下の画面に示すように、トリガー設定画面からは例えば0時~1時までのどこかで起動するという設定はできますが、決まった時間を設定することができません。
一定の時間範囲内に実行すればよい処理であれば問題ありませんが、決まった時間に起動させるためには少し工夫する必要があります。
そこで、今日の課題はこちらです。
今日の課題
Google Apps Scriptの処理を毎日決まった時間に実行したい。
この実装方法について解説します。
Google App Scriptについては以下の記事を参照ください。
指定時間に定期実行
毎日決まった時間に実行させるためには以下の処理を実装します。
- 実行させたい処理を実行(※実際に毎日実行させたい処理のことです)
- プロジェクトに設定されているトリガー設定を削除
- 翌日に実行させたい時間をトリガーとして登録
Google Apps Scriptは、設定した日時に処理を起動するトリガーをの登録と削除が可能です。
この機能を活用して、上記①~③を実装することで毎日決まった時間に処理を起動することが可能となります。
トリガー登録処理
以下にトリガー登録処理を示します。
setTrigger()関数を実行した日時から翌日の日付を取得し、RUNDAILY_HOURとRUNDAILY_MINで指定する時間から、トリガー設定日時triggerDayを作成します。
RUNDAILY_HOURとRUNDAILY_MIN を変更することで、実行時間が変更できます。
その後、ScriptApp.newTriger()に起動したい処理「runDaily」と、次回起動したいトリガー日時「triggerDay」を与えることで、特定の日時ベースのトリガーを作成します。
var RUNDAILY_HOUR = 23 // 毎日実行するトリガーの時間設定
var RUNDAILY_MIN = 00 // 毎日実行するトリガーの分設定
// トリガーを登録する
function setTrigger() {
// 起動するトリガーの時間設定
const triggerDay = new Date();
Logger.log('本日:' + triggerDay);
triggerDay.setDate(triggerDay.getDate() + 1); // 一日進める
triggerDay.setHours(RUNDAILY_HOUR); // 毎日実行するトリガーの時間設定
triggerDay.setMinutes(RUNDAILY_MIN); // 毎日実行するトリガーの分設定
Logger.log('設定トリガ:' + triggerDay);
// runDaily()を起動するトリガー登録
ScriptApp.newTrigger("runDaily")
.timeBased()
.at(triggerDay)
.create();
}
トリガー削除処理
setTrigger()関数で登録する日時ベースのトリガー設定は、削除しないと増え続けます。
日時ベースのトリガーは一度起動したら二度と使わないので、deleteTrigger()で削除します。
Google Apps Scriptは、まれに起動が失敗することがあります。使わないトリガーが残り続けるのは気持ち悪いので、過去のトリガー設定はすべて削除します。
//プロジェクト内のすべてのトリガーを削除
function deleteTrigger() {
//プロジェクトのすべてのトリガーを取得して削除する
const trgs = ScriptApp.getProjectTriggers();
for(const trg of trgs){
ScriptApp.deleteTrigger(trg); // 設定済みトリガー削除
}
}
全てのコード
以下に全てのコードを示します。
runDaily()が毎日起動する処理となります。
この中の「ここで毎日1回実行させたい処理を行う」の場所に、実際に処理したい関数を入れます。
実行させたい処理の後は、設定されているトリガーをdeleteTrigger()ですべて削除し、翌日に起動するトリガーをsetTrigger()で設定します。
また、先頭のコメントに何やら怪しいことが記述されていますが、次章で説明します。
/*
* 毎日定時実行トリガー設定(サンプル)
*
* 1日1回定期的に実行させるためのサンプル
* デフォルトではTimeZoneがAmerica/New_YorkのGMT-5なので、
* そのままではトリガを設定した時刻が意図した時間に動作しない。
* そのため、プロジェクトの設定からappsscript.jsonを表示させて、
* TimeZoneをJSTに変更しなければならない。
*
* 2022/01/08 Created by N.Sekiya
*/
var RUNDAILY_HOUR = 23 // 毎日実行するトリガーの時間設定
var RUNDAILY_MIN = 00 // 毎日実行するトリガーの分設定
function runDaily() {
Logger.log('毎日定時トリガー起動');
//-------------------------------------------
// ここで毎日1回実行させたい処理を行う
//-------------------------------------------
//-------------------------------------------
// 起動したトリガー設定の削除と次回のトリガーを設定する
//-------------------------------------------
deleteTrigger(); // 設定されているトリガーを全て削除する
setTrigger(); // 新しい時間でトリガーを再設定する
}
// トリガーを登録する
function setTrigger() {
// 起動するトリガーの時間設定
const triggerDay = new Date();
Logger.log('本日:' + triggerDay);
triggerDay.setDate(triggerDay.getDate() + 1); // 一日進める
triggerDay.setHours(RUNDAILY_HOUR); // 毎日実行するトリガーの時間設定
triggerDay.setMinutes(RUNDAILY_MIN); // 毎日実行するトリガーの分設定
Logger.log('設定トリガ:' + triggerDay);
// runDaily()を起動するトリガー登録
ScriptApp.newTrigger("runDaily")
.timeBased()
.at(triggerDay)
.create();
}
//プロジェクト内のすべてのトリガーを削除
function deleteTrigger() {
//プロジェクトのすべてのトリガーを取得して削除する
const trgs = ScriptApp.getProjectTriggers();
for(const trg of trgs){
ScriptApp.deleteTrigger(trg); // 設定済みトリガー削除
}
}
タイムゾーンの変更
Google Apps Scriptが処理するデフォルトのタイムゾーンは"America/New_York"で、GMT-5(グリニッジ標準ー5時間)に設定されています。
このため、時間の計算を行う場合は日本時間に変更しないと意図しない時刻となります。
この状態で「全てのコード」に示すコードを実行すると、以下の実行ログが示す通り"Eastern Standard Time"の"2022/1/7 23:00"にトリガーが設定されていることがわかります。これは日本時間では、"2022/1/8 13:00"となります。このままでは意図した時間に処理が動きません。
意図した時間に処理を動かすためには、タイムゾーンを「日本時間」に変更します。
まず、画面左端の歯車アイコンをクリックし「プロジェクトの設定」画面を表示します。
この中に、以下の画面の矢印が示す『「appsscript.json」マニフェストファイルをエディタで表示する』にチェックを入れます。
エディタに戻ると、ファイルの一覧に「appsscript.json」ファイルが表示されます。
この「appsscript.json」ファイルを選択すると、以下の画面に示すようにタイムゾーンが"America/New_York"に設定されていることが確認できます。
タイムゾーンは以下に示す通り"Asia/Tokyo"に変更します。
そして、「全てのコード」に示す処理を再度実行すると、以下の画面の通り"Japan Standard Time"であることが確認できます。
トリガー設定を確認すると、起動した翌日(1月9日)の23:00に起動するように設定されていることがわかります。
ここでのポイントは、
appsscript.jsonに定義されているタイムゾーンを"Asia/Tokyo"に変更する。
です。
まとめ
いかがでしたでしょうか。
毎日決まった時間に処理を行わせたい場合は、以下の3つがポイントです。
- 実行させたい処理の後にdeleteTrigger()にてトリガーをすべて削除する。
- 翌日に実行させたいトリガーをsetTrigger()で再登録する。
- タイムゾーンをAsia/Tokyoに変更する。
お試しください。
では、今日も良い一日を。