みなさんこんにちは!GASおじさんです。
今日はYoutubeのコメントでご質問をいただきましたので、その回答と解説を記事にしてみたいと思います。
コメントをいただいた動画は以下の動画です。
この動画で、以下のご質問をいただきました。
いつも分かりやすく為になる動画ありがとうございます。勉強させて頂いています。
今はトリガーで「0時~1時」と設定していますが「0時01分」などの任意の時間にトリガー発動するスクリプトを動画で説明頂けないでしょうか。
予約フォームなどは日付変更線を跨いで0時過ぎなどにフォーム入力する場合もあると思います。 そうすると、より実用性があると思いますので是非とも宜しくお願い致します。
嬉しいコメントとご質問ありがとうございます!
「トリガー実行は便利なんだけど、12〜13時とか時間の幅があるから、本当は12時ぴったりに実行したいんだよな〜」
みたいなお悩みは実際よく耳にしますね。
結論、これはGASを書くことで解決できちゃいます!
ということで今回は「GASを毎日0時1分に実行する方法」について解説していきます。
ちなみに解説動画はすでに作成済みですが、本記事では動画の内容とは若干異なる解説をします。
どちらかというと本記事で解説するコードの方がよりスマートかなと思いますが、どちらを参考にしてもらっても構いません。
動画を視聴したい方は以下からどうぞ!
まずは定期実行したいサンプルスクリプトを用意
ということでやっていきましょう。
今回は以下のsendMail
関数を毎日0時1分に実行したいというケースを想定して解説します。
function sendMail() {
let recipient = Session.getEffectiveUser();
let subject = '深夜0時1分のお知らせです。';
let body = 'こちらはGASによる自動配信メールです。\n0時1分になりましたのでお知らせします。';
GmailApp.sendEmail(recipient, subject, body);
}
まずはこちらのスクリプトをエディタに貼り付けてみてください。
※貼り付けたら一度実行して、権限承認しておきましょう。
「特定の日時」トリガーについて
さて、このsendMail
関数を毎日0時1分に実行したいのですが、ここでまず「特定の日時」トリガーについて説明しておきます。
トリガー設定画面を開いて、イベントのソースを「時間主導型」にすると、トリガーのタイプに「特定の日時」が選べるようになります。
そして「日時を入力」の欄の中に、「YYYY-MM-DD HH:MM」形式で日時を入力すると、その時刻ぴったりにトリガー実行することができるのです。
本記事を書いている今日現在は2022年12月9日なので、上記画像では明日の日付の「2022-12-10 00:01」と入力して保存しました。
こうすると、2022年12月10日の0時1分にsendMail
関数が実行されます。
「特定の日時」トリガーをGASで設定するスクリプト
とりあえず「特定の日時」トリガーを手動で設定してみました。
今度はこれを手動ではなくGASを書いて設定してみたいと思います。
以下のsetTrigger
関数を実行すると、2022年12月10日の0時1分にトリガー設定をすることができます。
function setTrigger() {
let date = new Date(2022, 11, 10, 0, 1);
ScriptApp.newTrigger('sendMail').timeBased().at(date).create();
}
試しにコードをコピペして実行してみましょう。
setTrigger
関数を実行すると…
トリガーが1個増えてますね!
新たに追加されたトリガーの内容を確認すると、手動で設定したときと同様の内容で設定できていることが確認できると思います。
ということで、GASのトリガーはスクリプトを書くことでも設定できるということがわかりました!
これを利用して、各数値を変数化していけば、実装できそうですね!
年月日を変数化
ということでまずはベタ打ちしている年月日の部分を変数化しましょう。
setTrigger
関数を以下のように書き換えてみてください。
function setTrigger() {
let now = new Date();
let y = now.getFullYear();
let m = now.getMonth();
let d = now.getDate();
let date = new Date(y, m, d+1, 0, 1);
ScriptApp.newTrigger('sendMail').timeBased().at(date).create();
}
こうすることで「明日の0時1分」という日時を指定してトリガー設定することができますね。
sendMail関数の中でsetTrigger関数を呼び出す
次にsendMail
関数の中でsetTrigger
関数を呼び出します。
sendMail
関数を以下のように書き換えてみてください。
function sendMail() {
let recipient = Session.getEffectiveUser();
let subject = '深夜0時1分のお知らせです。';
let body = 'こちらはGASによる自動配信メールです。\n0時1分になりましたのでお知らせします。';
GmailApp.sendEmail(recipient, subject, body);
setTrigger(); // メール送信後にトリガー設定
}
6行目でsetTrigger
関数を呼び出しています。
こうすることで、
- 12月10日の0時1分にメール送信後、12月11日の0時1分にトリガー設定される
- 12月11日の0時1分にメール送信後、12月12日の0時1分にトリガー設定される
- 12月12日の0時1分にメール送信後、12月13日の0時1分にトリガー設定される
- 以下繰り返し
という形で、ドミノ倒しのようにトリガー設定が行われることになるので、これで毎日0時1分にトリガー実行することができます!
過去のトリガーを消去するスクリプトを実装
これで実装完了です!
・・・といいたいところですが、あともうひとつ、やっておきたいことがあります。
現状のままだと、毎日新たなトリガーが追加されてしまいます。以下のようにどんどん過去のトリガーが溜まっていってしまうんですね。
こうなるとトリガーの管理が大変になってしまうので、必要のない過去のトリガーについては削除してしまいたいです。
ということで、setTrigger
関数を以下のように書き換えましょう。
function setTrigger() {
let triggers = ScriptApp.getScriptTriggers();
for(let trigger of triggers){
let funcName = trigger.getHandlerFunction();
if(funcName == 'sendMail'){
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, 0, 1);
ScriptApp.newTrigger('sendMail').timeBased().at(date).create();
}
2〜8行目を新たに書き加えました。
こうすることで、過去に設定されたトリガーを削除した後に、新たなトリガーを追加することができます。
試しにsetTrigger
関数を実行してみます。
その後トリガー画面を確認してみると…
不要なトリガーは削除され、必要なトリガーが1個だけ設定されていることが確認できました!
これにて実装完了です!
まとめ
以上、「GASを毎日0時1分に実行する方法」について解説しました!
最後の「過去のトリガーを消去するスクリプト」まで実装できるかどうかは、実際の現場では結構大事なポイントになるかな〜と思います。
日付ベースで0時〜1時に実行する、というトリガー実行も十分実用的ですが、より厳密な時刻を指定して実行したいという人には有益な情報になったのではないでしょうか?ぜひ参考にしていただければ幸いです。
それではまた次回!
コメント