みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Google Apps Script(GAS)、活用していますか?
メルマガシステムだったり
タスク管理ツールだったり
問い合わせメールの集計だったり
大活躍です。
これら業務系のツールですと、ほとんどといっていいほどの頻度で日付データを取り扱いますよね。そして、けっこうな頻度で「営業日かどうか」という判断をしたくなります。
けっこうややこしそうですよね。しかも、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メソッドが使えましたね。
書き方は
でしたね。返ってくる値は日曜日から順番に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カレンダーで「日本の祝日」カレンダーが用意されているからです。
この「日本の祝日」カレンダーは、「他のカレンダー」で追加をすることができますよね。そして、GASではそのカレンダーIDで呼び出して利用することができるんです。
日本の祝日カレンダーのカレンダーIDは
です。
もうお分かりですよね?
Dateオブジェクトを渡して、日本の祝日カレンダーのその日に「イベント」が存在していれば、それは日本の祝日である、ということになります。
日本の祝日カレンダーを取得する
まず、日本の祝日カレンダーを取得します。カレンダーIDがわかっていますから、getCalendarByIdメソッドで
とすればOKですね。
実際には例えば
var calJa = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
とします。
日本の祝日カレンダーの特定日のイベントを取得する
次に、特定の日付のイベントを取得するgetEventsForDayメソッドを使います。
これで、カレンダーオブジェクト内の指定した日付のイベントをEventsオブジェクトとして取得します。Eventsオブジェクトとはイベントの配列になっています。
イベントの数が1つ以上あるかどうかは、その取得したEventsオブジェクトの要素数を判断すればよいわけですから
で要素数を取り出して、それが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 Apps Scriptで営業日を判定する関数の作り方についてお伝えしました。
いや~、さすがGoogleですね。この関数さえ持っていれば、祝日データの更新なんてGoogleさんが勝手にやってくれます。便利!
どうぞご活用ください!
コメント
GAS勉強中です。大変参考になります。ありがとうございます^^
よろしければ教えていただきたくコメントさせていただきました。
スプレッドシートの[ツール]-[スクリプトエディタ]で、上記の
「以上をまとめたのがコチラ」の部分を保存しました。
例えばこのスプレッドシートのセル「A1」にとある日付を入力したとき、
隣り「B1」に残り営業日数を表示するにはどう書けばよいのでしょうか?
青島様
ご返信遅くなりました。
本当はカスタム関数を使いたいところですが、カスタム関数の場合は、カレンダーの呼び出しができないので、この記事の方法ではできないかなと思います。
https://tonari-it.com/gas-spreadsheet-user-function/
あとは、「編集時」のトリガーを使って頂いて、A1セルが編集されたら、B1セルにisBusinessDayの結果を出すという方法があります。
このあたりは、以下マニュアルの最初のほうのいくつかの記事を見ていただければ、実装する方法はわかるかなと思います。
https://tonari-it.com/google-apps-script-manual/