以前、下記の記事のようなGASのスクリプトを作った。
記事のタイトル通り、連休(祝日)も考慮したうえで、その週の最終営業日にSlackに通知を行うと言うものだ。
つくったっきり特にメンテもしておらず、毎週いい感じに動作していた。
しかし、本日2024/11/14(木)に突如としておかしい挙動を見せた。
休日前の営業日ではないはずなのに当該のGASが動作してSlackに通知が行われた。
「きっと自分が書いたGASのコードのロジックにバグがあったんだろうな、、」と若干落ち込みながらコードを読んでいた。
ただ、いくら探してもバグが発見できない。
実行しながらコードを見てみると2024/11/15(金)が祝日として判定されていることが分かった。
自宅にある物理的なカレンダーを見ても2024/11/15(金)は普通の平日として表記されている。
Googleカレンダーを見てみると「七五三」が祝日として表示されていた。
「え・・?七五三って祝日扱いだっけ?」と思い調べてみたらやはり祝日ではなさそうだった。
「七五三 祝日」で検索したときに下記の様な記事がヒットした。
どうやらGoogleカレンダー側の誤表記らしい。クリスマスや七五三といったイベントが何故か「祝日」のカレンダーにイベントとして登録されてしまっているらしい。
オフィシャルの情報ではないがWeb上の先人たちの情報によればGoogleカレンダーのカレンダーIDによって取得できる情報が異なるらしい。
-
ja.japanese#holiday@group.v.calendar.google.com
: 祝日 + 七五三などのイベント -
ja.japanese.official#holiday@group.v.calendar.google.com
: 祝日のみ
動作中のGASの祝日取得カレンダーID指定部分をja.japanese#holiday@group.v.calendar.google.com
からja.japanese.official#holiday@group.v.calendar.google.com
に変えれば問題なさそう。
念の為確認しておこうと下記のようなGASのコードを書いて実行してみた。
function myFunction() {
const day = new Date('2024-11-15');
const holidayAndEventCalendar = CalendarApp.getCalendarById("ja.japanese#holiday@group.v.calendar.google.com");
const holidayCalendar = CalendarApp.getCalendarById("ja.japanese.official#holiday@group.v.calendar.google.com");
console.log('祝日 + その他の行事カレンダーの2024/11/15のイベント数: ' + holidayAndEventCalendar.getEventsForDay(day).length);
console.log('祝日カレンダーの2024/11/15のイベント数: ' + holidayCalendar.getEventsForDay(day).length);
}
最後のconsole.log部分でエラーになる。なんでだろうと思って遡ってみたら、holidayCalendarがnullになっているっぽい。
どうやらgetCalendarById()
は何らかの理由でカレンダーが取得できなかった場合にnullを返すらしい。(無効なカレンダーIDだったり、権限がなかったり。)
カレンダーが存在しない場合は null ユーザーがカレンダーにアクセスできない場合や、ユーザーがそのカレンダーに登録していない場合
自分の環境だとja.japanese.official#holiday@group.v.calendar.google.com
のカレンダーIDは使えなかった。。
まあ、自分のGASのコードはただSlackに通知しているだけなのでこのまま誤表示に踊らされっぱなしでも良いかも。
※良く考えたら「誤表示」ではなく「Googleカレンダーの日本の祝日の仕様変更」が正しいかも、、!