Googleカレンダーの日本の祝日がおかしい件
2024年後半、いつの間にかGoogleが提供してるカレンダーである「日本の祝日」カレンダーに突如としてオカシナものが登録され、日本中の利用者に大きな影響を与えました。
このカレンダーの問題点とこのカレンダーに対してGASなどを回していた場合には大きな障害となるため、スクリプトに対して変更が必要になります。
今回利用するサンプルと課題
サンプルファイル
- 日本の祝日抽出 - Googleスプレッドシート
後述のGoogleカレンダーから銀行休業日と大晦日を除外した祝日のリストを期間指定で取得するGoogle Apps Scriptのサンプルコードが入っています。
取得対象とすべき祝日のみのカレンダーIDを指定してサンプル内では1年分を取得させています。
問題の内容
一体日本の祝日カレンダーに何が起きたのか?というと
日本の祝日カレンダーに対して、「祝日でもないのに行事が含まれるようになった」との報告があります。たしかに七五三という行事が何故か祝日カレンダーに入っていて、会社休めるとぬか喜びしてよくみたら、祝日じゃねーじゃねーかという怒りの声が上がっています。
間違って祝日だと思ったら祝日ではなく、勝手に会社を無断欠勤といった事故につながる非常に問題のあるアップデートです。完全にGoogleが余計なことをしており、その影響がどれだけ大きのかを理解していなかったのであろうということがわかります。
図:問題の表示がコレ
解決策
手動で解決する方法
何故このような理解不能な機能追加をしたのが不明ですが、非常に邪魔になるので以下の手順でオフにすることが可能です。
- カレンダーの左サイドバーの日本の祝日にカーソルを合わせる
- 右側に出てくる「︙」をクリックして、設定をクリックする
- 祝日カレンダーのコンテンツの「地域限定の祝日で選択」をクリック(この日本語表記もオカシイ)
- 地域限定の祝日にて、「その他の行事」のチェックを外す
- カレンダー画面に戻ると余計な行事名がカレンダーから消える
しかし、これで大半は問題なくなるのですが、未だに1月1日〜1月3日の「銀行休業日」や「大晦日」という意味不明なイベントが残っており、非常に邪魔な存在になっています。
図:その他の行事のチェックを外す
図:銀行休業日という謎の祝日表記が残ってる
GASから参照する場合
概要
大元のGoogleカレンダーにおける日本の祝日カレンダーのカレンダーIDは「japanese__ja@holiday.calendar.google.com」のようですが、この中に2つのカレンダーが入っています。
- 祝日データのみ:ja.japanese.official#holiday@group.v.calendar.google.com
- 日本の行事も含む:ja.japanese#holiday@group.v.calendar.google.com
前者の祝日のみのカレンダーIDを元にプログラムを構築すると良いでしょう(銀行休業日や大晦日が残ってしまっていますが)。
ソースコード
カレンダーから日付の範囲を指定し、その中で銀行休業日と大晦日を除外したリストを構築するGoogle Apps Scriptのコードです。最後にスプシに書き出してリストとして利用することが可能です。
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 43 44 45 46 47 48 49 50 51 52 53 54 |
//祝日のみカレンダーのID const holidaycal = 'ja.japanese.official#holiday@group.v.calendar.google.com' //日本の祝日を取得する function getJapanHolidayList() { const holidayCalendar = CalendarApp.getCalendarById(holidaycal); //日付の範囲を指定して取得する(最大2年分まで) let start = new Date(2024, 0, 1); let end = new Date(2025, 0, 1); let holidaylist = holidayCalendar.getEvents(start, end); //祝日データから必要なものを取り出す let editarray = []; for(let i = 0;i<holidaylist.length;i++){ //位置時配列を用意 let temparr = []; //レコードを一個取り出す let rec = holidaylist[i]; //日付を取り出す let holiday = Utilities.formatDate(rec.getStartTime(), "JST", "yyyy/MM/dd"); //イベント名を取得する let holidayname = rec.getTitle(); //holidaynameが銀行休業日や大晦日の場合はスルーする if(holidayname == "銀行休業日" || holidayname == "大晦日"){ continue; }else{ //一時に追加する temparr = [holiday,holidayname]; } //書き込み用配列に追加する editarray.push(temparr); } //スプシを取得する let ss = SpreadsheetApp.getActiveSpreadsheet(); let sheet = ss.getSheetByName("祝日リスト"); //データをクリアする sheet.getRange("A2:B").clearContent(); //スプシに書き出す let lastColumn = editarray[0].length; //カラムの数を取得する let lastRow = editarray.length; //行の数を取得する //C列に一括で書き込み sheet.getRange(2,1,lastRow,lastColumn).setValues(editarray); } |
図:スプシに無事に祝日リストを取り出せた