📆

GoogleCalendarAPIの日本の祝日が国民の祝日以外も祝日扱いするようになった件

2024/10/07に公開

概要

いつからかはっきり調べられてませんが、Googleカレンダーの「日本の祝日」が、例えば「七夕」や「七五三」や「クリスマス」など国民の祝日ではない日を赤く表示するようになりました。

これはカレンダーの左側の・・・をクリックし、「設定」から「祝日カレンダーのコンテンツ」を「祝日及びその他の休日」から「休日のみ」に変更すれば治るのですが、GoogleCalendarAPIで取得していた場合どうすればいいのか?というお話です。

コード

古いコード

コードはrubyです。一部抜粋。

    end_date = Time.zone.parse("#{params['end']}-01")
    url = sprintf(
      'https://www.googleapis.com/calendar/v3/calendars/%s/events?key=%s&timeMin=%s&timeMax=%s&orderBy=startTime&singleEvents=true',
      'japanese__ja@holiday.calendar.google.com',
      Env.fetch('GOOGLE_CALENDAR_API_KEY'),
      Time.zone.parse("#{params['start']}-01").strftime('%Y-%m-%dT%H%%3A%M%%3A%SZ'),
      end_date.change(day: Time.days_in_month(end_date.month, end_date.year)).strftime('%Y-%m-%dT%H%%3A%M%%3A%SZ')
    )

    resp = Net::HTTP.get_response(URI.parse(url)).body

どこかで拾ったコードを参考にしたのですが、カレンダーIDがjapanese__ja@holiday.calendar.google.comとなっています。

解決策

Googleカレンダーで設定を変更し、少し下の方にある「このカレンダーID」を見比べるとわかるのですが、「休日のみ」と「祝日及びその他の休日」でカレンダーIDが変わるようです。

タイプ ID
休日のみ ja.japanese.official#holiday@group.v.calendar.google.com
祝日及びその他の休日 ja.japanese#holiday@group.v.calendar.google.com

なんか、以前のjapanese__ja@holiday.calendar.google.comと微妙に違うし、#が入ってるのでそのまま代入してもダメですね。URLエンコードすればOKです。

  def holidays
    end_date = Time.zone.parse("#{params['end']}-01")
    url = sprintf(
      'https://www.googleapis.com/calendar/v3/calendars/%s/events?key=%s&timeMin=%s&timeMax=%s&orderBy=startTime&singleEvents=true',
      CGI.escape('ja.japanese.official#holiday@group.v.calendar.google.com'),
      Env.fetch('GOOGLE_CALENDAR_API_KEY'),
      Time.zone.parse("#{params['start']}-01").strftime('%Y-%m-%dT%H%%3A%M%%3A%SZ'),
      end_date.change(day: Time.days_in_month(end_date.month, end_date.year)).strftime('%Y-%m-%dT%H%%3A%M%%3A%SZ')
    )

    resp = Net::HTTP.get_response(URI.parse(url)).body
    self.exports = JSON.parse(resp)
    render_json
  end

Discussion