Google Apps Scriptで営業日を判定してトリガーを作成する方法


目覚まし時計

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

2回にわたり、Google Apps Scriptでトリガーの作成と削除についてお伝えしました。

Google Apps Script で毎日決まった時刻にスクリプトを実行するトリガー設定
Google Apps Scriptのトリガー設定は毎日実行する場合は、午前8時~9時のように1時間の幅があります。また、時間を細かく指定するには、2018年2月16日08:30のように日にちも設定する必要があります。 この二つを使用して、毎日指定した時間にスクリプトを実行させるトリガーを設定します。
Google Apps Scriptで使用済みのトリガーを削除する方法
前回は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で営業日を判定する関数についてお伝えしていますので、これを利用したいと思います。

ずっと使える!Google Apps Scriptで営業日を判定する関数の作り方
Google Apps Scriptで業務系のツールを作る場合、けっこうな頻度で営業日かどうかの判定が必要になります。今回は、Googleの日本の祝日カレンダーを利用した営業日を判定する関数の作り方です。

トリガーを設定する「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メソッドを使います。

Calendarオブジェクト.getEventsForDay(日付)

引数の日付はDateオブジェクトです。戻り値は、CalendarEventオブジェクトの配列になります。

カレンダーイベントの配列に「休業日」があるか

配列の全要素について条件式を判定するにはsomeメソッドを使います。

配列.some((value, index, array) => 条件式)

配列の要素の中に条件式を満たす要素が一つでもあればtrueを、そうでなければfalseを返します。

コールバック関数のパラメーターには以下の3つを使用可能で、indexとarrayは省略可能です。

  • value: 現在処理中の要素
  • index: 現在処理中の要素のインデックス
  • array: 対象となる配列

今回の例では、valueのかわりに「event」というパラメーター名を使用しています。

まとめ

今回はGoogle Apps Scriptで営業日のみトリガーを作成する方法についてお伝えしました。

Googleカレンダーやスプレッドシートも利用すれば、より幅が広がりますね!

どうぞご活用くださいませ~

連載目次:GASのスクリプトからトリガーを操作する方法

GASのトリガーはメニューから設定する以外に、スクリプトからも設置や削除が行えます。本シリーズでは、ScriptAppsサービスを使ったトリガーの操作方法についてお伝えしていきます。
  1. Google Apps Scriptで毎日決まった時刻にスクリプトを実行するトリガー設定
  2. Google Apps Scriptで使用済みのトリガーを削除する方法
  3. Google Apps Scriptで営業日を判定してトリガーを作成する方法

  投稿者プロフィール

タカハシノリアキ株式会社プランノーツ 代表取締役
株式会社プランノーツ代表、コミュニティ「ノンプロ研」主宰。1976年こどもの日生まれ。東京板橋区在住。「ITで日本の『働く』の価値を上げる!」をテーマに、VBA&GASの開発、講師、執筆などをしております。→詳しいプロフィールはコチラ
★ご依頼・ご相談はお気軽にどうぞ!→お問い合わせはコチラ
★フォロー頂ければ嬉しいです。

タイトルとURLをコピーしました