みなさん、こんにちは!
タカハシ(@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カレンダーやスプレッドシートも利用すれば、より幅が広がりますね!
どうぞご活用くださいませ~

