ずっと使える!Google Apps Scriptで営業日を判定する関数の作り方


holiday

photo credit: forum.linvoyage.com Relax at apres ski at Val’d’Isere via photopin (license)

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

Google Apps Script(GAS)、活用していますか?

メルマガシステムだったり

初心者でも簡単!Google Apps ScriptでGmailを操作してメールを送る方法
Google Apps Scriptでメールマガジンを送るシステムを作りたいと思います。シリーズ初回の今回は、Google Apps ScriptでGmailを操作してメールを送る方法です。

タスク管理ツールだったり

入力インターフェースとして超優秀!Googleフォームで新規タスクを入力する
チームで使えるGoogleカレンダータスク管理ツールを作っていきます。今回はタスクを追加する用のフォームの作成と編集とスプレッドシートの入力規則の設定などの下準備についてお伝えしていきます。

問い合わせメールの集計だったり

【GAS】Gmailに送られた過去のメールから特定条件のメールを検索して取得する
問い合わせメールのデータの蓄積と効果分析にまつわることを色々とやっていきたいということで、今回はGoogle Apps Scriptで過去の問い合わせメールを特定条件で検索して取り出す方法です。

大活躍です。

これら業務系のツールですと、ほとんどといっていいほどの頻度で日付データを取り扱いますよね。そして、けっこうな頻度で「営業日かどうか」という判断をしたくなります。

けっこうややこしそうですよね。しかも、GASのベースとなっているJavaScriptの日付処理に若干の苦手意識がある方もチラホラ…

でも実は、簡単に営業日を判断する機能は作れちゃうんです。GASならね。

ということで今回は、Google Apps Scriptで営業日を判定する関数の作り方についてお伝えします。

スポンサーリンク

営業日の判断をする関数

イメージとしては、関数isBusinessDayに対して

function myFunction() {
  var date = new Date('2016/11/3');

  if(isBusinessDay(date)){
     Logger.log('働きなさい');
  }else{
     Logger.log('休みなさい');
  }
}

などのように、Dateオブジェクトを渡すと

  • 営業日:True
  • 土日、祝日:False

と返ってくるような動作ができると良いですよね。

この場合、土日の判定と祝日の判定とは別々に考える必要がありますね。

土日の判定をする

まず、土日の判定だけ考えてみましょう。

以下のように、関数isWeekDayにDateオブジェクトを渡すと

function myFunction() {
  var date = new Date('2016/11/3');

  if(isWeekDay(date)){
     Logger.log('平日');
  }else{
     Logger.log('土日');
  }
}
  • 平日:True
  • 土日:False

が返ってくるような関数を考えます。

getDayで曜日を取得

Dateオブジェクトから曜日を取り出すには、getDayメソッドが使えましたね。

書き方は

Dateオブジェクト.getDay()

でしたね。返ってくる値は日曜日から順番に0から土曜日が6になります。

ですから、getDayの値が0か6であれば土日ということになりますね。

function isWeekDay(date){
  if (date.getDay() == 0 || date.getDay() == 6) {
    return false;
  }
  return true;
}

これでOKですね。ちなみに、JavaScriptの場合returnで値を返さないと「undefined」が返り値になるそうです。undefinedはfalseの判定になってしまうので、return true;を忘れないように。

日本の祝日を判定する

さて、これで土日は判定できましたが、日本の祝日はどう判定しましょうか?

それ用の祝日データを準備したりが一般的ですが、はっきり行って超面倒です。

それが、GASなら簡単に日本の祝日の判定ができちゃいます。なぜなら、Googleカレンダーで「日本の祝日」カレンダーが用意されているからです。

Googleカレンダーの日本の祝日カレンダー

この「日本の祝日」カレンダーは、「他のカレンダー」で追加をすることができますよね。そして、GASではそのカレンダーIDで呼び出して利用することができるんです。

日本の祝日カレンダーのカレンダーIDは

ja.japanese#holiday@group.v.calendar.google.com

です。

もうお分かりですよね?

Dateオブジェクトを渡して、日本の祝日カレンダーのその日に「イベント」が存在していれば、それは日本の祝日である、ということになります。

日本の祝日カレンダーを取得する

まず、日本の祝日カレンダーを取得します。カレンダーIDがわかっていますから、getCalendarByIdメソッド

CalendarApp.getCalendarById(カレンダーID)

とすればOKですね。

実際には例えば

var calJa = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');

とします。

日本の祝日カレンダーの特定日のイベントを取得する

次に、特定の日付のイベントを取得するgetEventsForDayメソッドを使います。

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

これで、カレンダーオブジェクト内の指定した日付のイベントをEventsオブジェクトとして取得します。Eventsオブジェクトとはイベントの配列になっています。

イベントの数が1つ以上あるかどうかは、その取得したEventsオブジェクトの要素数を判断すればよいわけですから

Eventsオブジェクト.length

で要素数を取り出して、それが0より大きいかを判断すればよいということになります。

以上をまとめたのがコチラですね。

function isBusinessDay(date){
  if (date.getDay() == 0 || date.getDay() == 6) {
    return false;
  }
  var calJa = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
  if(calJa.getEventsForDay(date).length > 0){
    return false;
  }
  return true;
}

Googleカレンダーの取り扱いに関しては、以下の記事もご参考ください。

毎朝、当日の予定をGoogleカレンダーから取得してチャットワークに送る
Google Apps Scriptを使ってチャットワークに色々と送ることができます。Googleカレンダーから当日の予定を取得してチャットワークに送る方法についてお伝えしたいと思います。

まとめ

以上、Google Apps Scriptで営業日を判定する関数の作り方についてお伝えしました。

いや~、さすがGoogleですね。この関数さえ持っていれば、祝日データの更新なんてGoogleさんが勝手にやってくれます。便利!

どうぞご活用ください!


コメント

  1. 青島雄一 より:

    GAS勉強中です。大変参考になります。ありがとうございます^^
    よろしければ教えていただきたくコメントさせていただきました。

    スプレッドシートの[ツール]-[スクリプトエディタ]で、上記の
    「以上をまとめたのがコチラ」の部分を保存しました。

    例えばこのスプレッドシートのセル「A1」にとある日付を入力したとき、
    隣り「B1」に残り営業日数を表示するにはどう書けばよいのでしょうか?

    • 青島様

      ご返信遅くなりました。

      本当はカスタム関数を使いたいところですが、カスタム関数の場合は、カレンダーの呼び出しができないので、この記事の方法ではできないかなと思います。
      https://tonari-it.com/gas-spreadsheet-user-function/

      あとは、「編集時」のトリガーを使って頂いて、A1セルが編集されたら、B1セルにisBusinessDayの結果を出すという方法があります。
      このあたりは、以下マニュアルの最初のほうのいくつかの記事を見ていただければ、実装する方法はわかるかなと思います。
      https://tonari-it.com/google-apps-script-manual/

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