みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
2回にわたり、Google Apps Scriptでトリガーの作成と削除についてお伝えしました。
実行したい処理に、例えばChatworkに何かを送信するようなスクリプトを設定すると、毎日指定の時間にChatworkに通知されますね。
ところで、毎日通知がいくようになったのはいいですが、休みの日にも通知がいってしまいますね…
そこで今回は、Google Apps Scriptで営業日を判定してトリガーを作成する方法をお伝えします。
では、行ってみましょう!
前回のおさらい
まずは、前回までのおさらいです。
function setTrigger(){ const time = new Date(); time.setHours(23); time.setMinutes(59); ScriptApp.newTrigger('myFunction').timeBased().at(time).create(); } function delTrigger() { const triggers = ScriptApp.getProjectTriggers(); for(const trigger of triggers){ if(trigger.getHandlerFunction() == "myFunction"){ ScriptApp.deleteTrigger(trigger); } } } function myFunction(){ delTrigger(); console.log('実行されました'); //本当はChatworkへの送信など }
関数setTriggerを毎日動作するトリガーに設定しておけば、毎日23:59に関数myFunctionが実行されるようになります。
実行されると、関数myFunction内で関数delTriggerが呼び出されて、使用済みのトリガーが削除されます。
カレンダーどおりの営業日のみトリガーを作成する
以前、Google Apps Scriptで営業日を判定する関数についてお伝えしていますので、これを利用したいと思います。
トリガーを設定する「setTrigger」から日付をわたして、土日と祝祭日でなければ、「true」が返ってくるようにします。
function isBusinessDay(date){ if (date.getDay() == 0 || date.getDay() == 6) { return false; } const calJa = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com'); if(calJa.getEventsForDay(date).length > 0){ return false; } return true; }
後は、「true」が返ってきたときに、トリガーを作成するようにすればいいですね。
トリガーを作成する関数setTriggerを下記のように変更します。
function setTrigger(){ const time = new Date(); time.setHours(23); time.setMinutes(59); if (isBusinessDay(date)){ ScriptApp.newTrigger('myFunction').timeBased().at(time).create(); } }
if文をちょっと追加するだけですね。
色々な関数を作成しておけば、使い回しができて便利ですね。
会社独自の営業日に合わせてトリガーを作成する
さて、会社の営業日がカレンダーどおりではない場合はどうすればよいでしょうか。
この場合もGoogleカレンダーを使用していきます。
終日イベントの「休業日」を判定する
会社の営業日のカレンダーに、休みの日の終日イベントとして「休業日」を登録するようにしました。
このカレンダーから当日の終日イベントを取得し、「休業日」が含まれているかどうかを判定するのです。
「休業日」が含まれていれば「false」、そうでなければ「true」です。
関数isMyBusinessDayはこちらです。
function isMyBusinessDay(date){ const calendar = CalendarApp.getCalendarById('*****カレンダーID*****'); const events = calendar.getEventsForDay(date); return events.some(event => (event.getTitle() === '休業日')); }
トリガーを設定する関数setTriggerは、こちらですね。
function setTrigger(){ const time = new Date(); time.setHours(23); time.setMinutes(59); if (isMyBusinessDay(date)){ ScriptApp.newTrigger('myFunction').timeBased().at(time).create(); } }
カレンダーの終日イベントを取得する
Calendarオブジェクトについて、特定の日付の終日イベントを取得するには、getEventsForDayメソッドを使います。
引数の日付はDateオブジェクトです。戻り値は、CalendarEventオブジェクトの配列になります。
カレンダーイベントの配列に「休業日」があるか
配列の全要素について条件式を判定するにはsomeメソッドを使います。
配列の要素の中に条件式を満たす要素が一つでもあればtrueを、そうでなければfalseを返します。
コールバック関数のパラメーターには以下の3つを使用可能で、indexとarrayは省略可能です。
- value: 現在処理中の要素
- index: 現在処理中の要素のインデックス
- array: 対象となる配列
今回の例では、valueのかわりに「event」というパラメーター名を使用しています。
まとめ
今回はGoogle Apps Scriptで営業日のみトリガーを作成する方法についてお伝えしました。
Googleカレンダーやスプレッドシートも利用すれば、より幅が広がりますね!
どうぞご活用くださいませ~