Google Apps Scriptの時間設定トリガーはデフォルトでは「1:00-2:00の間のどこか」といった具合で、1時間単位で指定することはできますが、分単位まで指定することができません。
この記事では、強制的に分単位で設定する方法について記述します。
トリガーの基本概念と時間指定の課題
まず、GASで利用可能なトリガーの基本的な種類と、それぞれの特徴を理解しておくことが重要です。通常、時間主導型トリガーは「日次」「週次」「月次」などの単位で設定できますが、時間指定は1時間単位でしか行えません。そのため、特定の分にスクリプトを実行したい場合、標準の設定では不可能です。
しかし、Google Apps Scriptでは、トリガー自体をGASから設定する処理を組むことが可能であり、その場合は分単位の指定することが可能になります。
トリガーの設定コードの紹介
以下に、分単位でトリガーを設定するためのサンプルコードを紹介します。このコードは、指定した時間(例えば、翌日の9:59)にスクリプトを実行するためのトリガーを設定するものです。
// 翌日9:59にトリガーをセットする処理
function setMinTrigger() {
let triggers = ScriptApp.getScriptTriggers();
for(let trigger of triggers){
let funcName = trigger.getHandlerFunction();
if(funcName == 'exampleFunction'){ //function名を定期実行したい関数名に変更する
ScriptApp.deleteTrigger(trigger);
}
}
let now = new Date();
let y = now.getFullYear();
let m = now.getMonth();
let d = now.getDate();
let date = new Date(y, m, d+1, 9, 59);
ScriptApp.newTrigger('exampleFunction').timeBased().at(date).create(); //function名を定期実行したい関数名に変更する
}
// 定期実行したい処理
function exampleFunction() {
/* ----------------------------
// ここに定期実行したい内容をかく
------------------------------*/
setMinTrigger(); //上記内容が処理し終える度に、翌日9:59にトリガーがセットする
}
たったこれだけで完了です。
setMinTrigger関数内の
let now = new Date();
let y = now.getFullYear();
let m = now.getMonth();
let d = now.getDate();
let date = new Date(y, m, d+1, 9, 59);
ScriptApp.newTrigger('copyValueToLastRow').timeBased().at(date).create();
の部分を修正すれば、時間指定も変化させることができます。
例えば、2日置きの23:30に起動したい場合は、
// 翌々日23:00にトリガーをセットする処理
function setMinTrigger() {
let triggers = ScriptApp.getScriptTriggers();
for(let trigger of triggers){
let funcName = trigger.getHandlerFunction();
if(funcName == 'exampleFunction'){
ScriptApp.deleteTrigger(trigger);
}
}
let now = new Date();
let y = now.getFullYear();
let m = now.getMonth();
let d = now.getDate();
let date = new Date(y, m, d+2, 23, 00);
ScriptApp.newTrigger('exampleFunction').timeBased().at(date).create();
}
// 定期実行したい処理
function exampleFunction() {
/* ----------------------------
// ここに定期実行したい内容をかく
------------------------------*/
setMinTrigger(); //上記内容が処理し終える度に、翌日9:59にトリガーがセットする
}
コードの詳細な解説
トリガーのクリアと再設定
まず、setMinTrigger
関数では、既存のトリガーを確認し、同じ関数名で設定されたトリガーがあれば削除します。これにより、重複したトリガーの設定を防ぎ、管理をシンプルにします。
日付と時間の設定
次に、Date
オブジェクトを使用して、翌日の特定の時間(9:59)を設定します。new Date(y, m, d+1, 9, 59)
で、翌日の9:59に実行されるようにトリガーを設定しています。この部分が、分単位での時間指定を可能にしている要点です。
定期的なトリガーの再設定
copyValueToLastRow
関数は、定期的に実行したい処理を記述する場所です。この関数の最後で、再度setMinTrigger
関数を呼び出すことで、処理が終わるたびに翌日の9:59にトリガーが再設定されます。これにより、毎日同じ時間に処理を実行させることができます。
より柔軟なスケジュール設定のための応用例
この方法を応用すれば、より複雑なスケジュールや特定の時間帯に実行したい処理のトリガーを柔軟に設定することが可能です。例えば、特定の曜日だけ異なる時間に実行したり、特定の条件を満たしたときにのみトリガーを設定することもできます。
よくある質問とトラブルシューティング
GASでトリガーの日時指定はできますか?
このコードを使用すれば、GASのトリガーを特定の日時に設定することが可能です。標準の設定では分単位の指定ができませんが、この方法なら可能になります。
GASのトリガーは時差を指定できますか?
標準のGASでは時差を設定する機能はありませんが、スクリプト内で計算を行い、異なるタイムゾーンに合わせて日時を設定することは可能です。
GASのトリガーの実行時間はずれることがありますか?
Googleサーバーの負荷やトリガーの登録状況により、実行時間がわずかにずれることがあります。この場合も、再設定のロジックを使って確実に再トリガーを設定することで、安定した実行が可能です。
GASのトリガーの編集時と変更時の違いは何ですか?
編集時はトリガーの既存の設定内容を変更する際に使用し、変更時は新しいトリガーを設定する際に使用します。
まとめ
GASを使ったスクリプトの自動化は非常に便利ですが、トリガーの設定においては時間指定が1時間単位であることがしばしば制約となります。本記事で紹介した方法を使えば、分単位での細かい時間指定が可能になり、より柔軟なスケジュール管理が可能となります。ぜひ、この方法を活用して、GASによる自動化をさらに進化させてください。