こんにちは、もりです!
ノンプロ研メンバーとペアプロで書いたお題「休日を判定する関数」のスクリプトをメモしておきます。
「ペアプログラミング」の略です。1つのPCを使い、2人1組で開発する手法です。
「ナビゲーター(指示・サポート)」「ドライバー(実装)」に分かれ、一定時間ごとに役割交代しながら進めていきます。
ノンプロ研では、GASのスクリプトファイルを共有し、Zoomの画面共有機能を使いながら、完全オンラインで実施しました。
日付処理などで役立つはず!
GASで休日を判定する
まず、「休日」の種類を定義します。この記事で紹介するスクリプトは、下記の3つを判定します。
- ①土日
- ②祝日
- ③特別休日
→お盆休み、年末年始、会社の創立記念日など、①②に該当しない休日
スクリプトがこちらです。与えた日付に応じた返り値は下記のとおり。
- 休日の場合:true
- その他(営業日)の場合:false
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
function main() { const date = new Date('2020/08/13'); console.log(isHoliday_(date)); } /** * 休日かどうかを判定する関数 * * @param {Date} 判定する日付 * @return {boolean} 休日ならtrueを返す */ function isHoliday_(date) { // ①土日の判定 const day = date.getDay(); //曜日取得 if (day === 0 || day === 6) return true; // ②祝日の判定 const id = 'ja.japanese#holiday@group.v.calendar.google.com' const cal = CalendarApp.getCalendarById(id); const events = cal.getEventsForDay(date); //なんらかのイベントがある=祝日 if (events.length) return true; // ③特定の休日判定 const specialHoliday = [ '0813', '0814', '0815', '0816', '0817' ]; const mmdd = Utilities.formatDate(date, 'JST', 'MMdd'); //someメソッドでtrue/falseいずれかが返る return specialHoliday.some(value => value === mmdd); } |
以下、解説です。
①土日の判定
土曜日or日曜日の場合、trueを返します。
1 2 |
const day = date.getDay(); //曜日取得 if (day === 0 || day === 6) return true; |
DateオブジェクトのgetDayメソッドで曜日を取得します。
Dateオブジェクト.getDay()
- 引数:なし
- 戻り値:0~6の値
- 説明:Dateオブジェクトの「曜日」を取得します。
戻り値の一覧です。
曜日 | 戻り値 |
---|---|
日曜日 | 0 |
月曜日 | 1 |
火曜日 | 2 |
水曜日 | 3 |
木曜日 | 4 |
金曜日 | 5 |
土曜日 | 6 |
②祝日の判定
祝日の場合、trueを返します。
1 2 3 4 5 |
const id = 'ja.japanese#holiday@group.v.calendar.google.com' const cal = CalendarApp.getCalendarById(id); const events = cal.getEventsForDay(date); //なんらかのイベントがある=祝日 if (events.length) return true; |
祝日判定には、Googleの「祝日カレンダー」を使用します。カレンダーIDは「ja.japanese#holiday@group.v.calendar.google.com」です。
Calenderオブジェクト.getEventsForDay(date)
- 引数:Dateオブジェクト
- 戻り値:CalendarEventオブジェクトが格納された配列
- 説明:引数に指定した日に発生するすべてのイベントを取得します。
- 公式リファレンスはこちら
戻り値が「配列」なので、lengthプロパティで中身の有無をチェックします。中身が有れば「祝日」なのでtrueを返します。
③特定休日の判定
会社独自の休日に一致する場合は、trueを返します。一致しない場合はfalseが返ります。
特定休日は、4桁の数値(mmdd形式)を、配列形式で指定します。
1 2 3 4 5 6 7 8 9 10 11 12 |
const specialHoliday = [ '0813', '0814', '0815', '0816', '0817' ]; const mmdd = Utilities.formatDate(date, 'JST', 'MMdd'); //someメソッドでtrue/falseいずれかが返る return specialHoliday.some(value => value === mmdd); |
ポイントは、someメソッドです。
Arrayオブジェクト.someメソッド(コールバック関数)
- 引数:配列のすべての要素に実行する関数
- 戻り値:ブール値
- 説明:配列のいずれかの要素がコールバック関数の条件を満たす場合、trueを返す。それ以外の場合、falseを返す。
- JavaScript公式リファレンスはこちら
※someメソッドは、Arrayオブジェクトの「反復メソッド」の一種です。
「反復メソッド」についてはこちらの記事を参照してください→【GAS入門】Arrayオブジェクトのmapメソッドの使い方
【補足】someメソッド
この一行は「アロー関数」を使った省略形の書き方です。
1 |
return specialHoliday.some(value => value === mmdd); |
省略無しで書くとこのようになります。
1 2 3 4 5 6 7 |
const func = function(value){ //コールバック関数を用意 return value === mmdd; } //someメソッドの引数に、上記の関数を与える const result = specialHoliday.some(func); //true or false return result; |
以上です!日付処理にぜひ使ってみてくださいね。