はじめに
僕のインターン先では曜日ごとに担当を決めて定常業務を回しています。
先日、その日の担当をslackに通知するbotをGASで作ったのですが、最初の実装だと来たる10連休中も通知が来てしまいウザいなということに気づき、土日祝日は通知を飛ばさないようにしようと思いました。
土日に関しては普通にDate.getDay()
の値で出し分ければいいのですが、祝日はどうしたらいいのかと調べても面倒そうな方法ばかりで手を出したくありませんでした。
さて、どうしたものかと思っていた時に「Googleカレンダーに日本の祝日表示されてるやんけ!」ということに気づきました。
実装
function isHoliday(){//Googleカレンダー「日本の祝日」にイベントがあれば祝日と判定する
var today = new Date();
var calendars = CalendarApp.getCalendarsByName("日本の祝日");
var holidays = calendars[0];
var events = holidays.getEventsForDay(today);
if(events.length > 0){
return true;
}
return false;
}
GASにはCalendarApp
というクラスがありGoogleカレンダーを扱うことができます。
参考: 今日からGoogleカレンダーで使えるGASのコード一覧
getCalendarsByName(name)
というメソッドにより、自分のGoogleアカウントに登録されたカレンダーを名前で検索して取得できます。このメソッドの戻り値はCalendar
オブジェクトの配列となるので、calendars[0]
として「日本の祝日」カレンダーにアクセスします。(「日本の祝日」という名前で登録されているカレンダーは当然一つだけなのでindexは0です)
Calendar
オブジェクトを取り出せたらgetEventsForDay(date)
メソッドにより指定した日付に登録されているイベントを配列で取り出します。
「日本の祝日」カレンダーに登録されているイベントは祝日だけなので、指定した日付にイベントが存在すれば(events.length > 0
)、その日は祝日であると判定できます。
おわりに
Googleカレンダーで祝日判定するメリットは、イレギュラーな祝日(例えば今年5月1日の「天皇の即位の日」)があったとしてもGoogleさまが勝手に追加してくださるのでこちらでわざわざ書き足したりする必要がないことですね。
GAS APIの便利さに慣れすぎちゃってどうしよう。
追記
2019/04/21
ほぼ同内容で記事を書かれている先人たちがいらっしゃったようですので紹介しておきます。
2019/04/24
実際に土日祝以外のみに処理を行うにあたっては、以下のようなisWeekend()
を用意して週末でも祝日でもないことを確認して処理を行なっています。(上記ではtoday
をisHoliday()
の内部で定義していましたが、実際には下記のようにmain()
内で定義しています。)
function isWeekend(today){
var dayNum = today.getDay();//Date.getDay()は曜日番号として日曜始まりで0~6の値を返す
if(dayNum == 0 || dayNum == 6){
return true;
}
return false;
}
function main(){
var today = new Date();
if(!(isWeekend(today) || isHoliday(today))){//平日=週末でも祝日でもない
//ここで処理をする
}
}