業務の自動化等をしていると、「休日は回避して営業日に処理してほしい」という要望を受けることがあります。
そこで今回はGoogleカレンダーを使って祝日情報を取得することで、営業日判定できるように実装したので記録に残します。
なお、前提として以下2点をご承知おきください。
- 土曜・日曜・日本における祝日以外を営業日とすること
- 今回の実装はGASじゃなくても実装できるが、他言語実装については言及しないこと
土日判定をする
まずは土日判定をしましょう。
これは簡単で、以下のように記述すれば1行で完結します。
[0, 6].includes(new Date().getDay())
new Date()はGASでその時点の日時を取得できます。
new Date(‘2025/03/01’)のように、日付等を指定したり、後から変更することも可能です。
getDay()は曜日を数値として取得できます。0が日曜で、6が土曜です。
[0, 6].includes(曜日番号)とすることで、土日であるかどうかが判定できます。戻り値はBooleanです。
これを実行することで、土日かどうかが判定できます。
Googleカレンダーを使って祝日判定をする
次はGoogleカレンダーを使って祝日かどうか判定しましょう。
取得元となるGoogleカレンダーは、デフォルトでアクセスできる「日本の祝日」というカレンダー情報を元にします。
これはja.japanese#holiday@group.v.calendar.google.com をIDとして指定することで、GASからでも取得が可能です。
ただ、この情報には一つ注意点があります。
それは、国民の休日ではない祭日も含まれること。
ひな祭りや七五三などが該当します。
回避策の一つとして祝日だけが記載されている ja.japanese.official#holiday@group.v.calendar.google.com を参照する形が確実なのですが、これはアカウント設定で元の「日本の祝日」カレンダーを削除したうえで上記を入れるといった画面上の対応が必要です。
詳細は以下の記事で解説してくれている方がいます。
最後の「画面上では大丈夫だけどGASでは祭日が取れてしまう」などの情報はとても参考になりました。感謝。
ただ、こちらの手順を実施すれば確実性は高いのですが、実行アカウントが自分ではなく依頼者のGoogleアカウントの場合は設定してもらう必要があるため、できればやりたくないところ。(同じように思うコーポレートエンジニアは多いはず)
そこで今回は、デフォルトで参照できるカレンダーを使いつつ祝日を判定する処理を加える形で実装しました。
function isHoliday_(date) {
const calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com')
const events = calendar.getEventsForDay(date)
return events.filter(e => e.getDescription() == "祝日").length > 0
}
まず引数にはnew Date()で作成したdatetimeを渡します。
カレンダー情報は ja.japanese#holiday@group.v.calendar.google.com (休日ではない祭日も含むカレンダー)を参照。
calendar.getEventsForDay(date) でその日のイベント情報を取得。
そしてevents.filter(e => e.getDescription() == “祝日”).length > 0 でその日が祝日かどうか判定します。
getDescription()はイベントの概要情報を取得するのですが、休日となる祝日は振替休日は”祝日”と記載されます。
これに対しひな祭りや七五三などは”祭日”となっているため、この書き方で祝日判定が可能です。
「==
よりも祝日の文字列が含まれるかで判定した方がよくない?」
と思うかもしれませんが、祭日イベントのgetDescription()には以下の文字列も添えられているので要注意。ありがた迷惑
“祭日を非表示にするには、Google カレンダーの [設定] > [日本の祝日] に移動してください”
もうちょっと良い判定方法が見つかった際はこの記事を更新しますね。
翌営業日を取得する
ここまでの処理を使って、翌営業日を取得します。
const date = new Date()
// 土日祝日の場合は平日になるまで日付を進める
while ([0, 6].includes(date.getDay()) || isHoliday_(date)) {
date.setDate(date.getDate() + 1)
}
console.log(date)
function isHoliday_(date) {
const calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com')
const events = calendar.getEventsForDay(date)
return events.filter(e => e.getDescription() == "祝日").length > 0
}
これで翌営業日がdateに格納され、ログ出力されました。
ここではCalendarApp.getCalendarById()を呼び出される度に取得していますが、都度実行するのが嫌な場合は諸々考慮したうえで変更してください。
今回は翌営業日を取得する形で書きましたが、応用すれば月末締めの期限となる営業日を取得するとかも可能です。
まとめ
やはりGoogleカレンダー周りのところが少し悩むポイントになりそうですね。
GASリファレンスを読むとイベント情報にはgetEventType()
というメソッドがあって「これでいけるのでは?」と思ったのですが、思った情報は取得できなくて断念しました。
土日祝日のフラグとかあるととても助かるのですが、そんな機能はさすがに実装されないだろうな。ざんねん。
とはいえ現時点で判定はできそうだし、サンプルコード自体は簡単なので、上手く活用していただけると嬉しいです。