JavaScriptのGoogle Calendar APIで祝日を判定する方法

Google Calendar APIで祝日判定

日付が祝日か判定するにはいくつか方法がある。

1つは内閣府のWebサイトの国民の祝日についてというページにあるCSVファイルを元に判定する方法。

しかし、この方法だと静的なCSVファイルを読み込んで判定するため、定期的にCSVファイルを更新する必要がある。(APIはない)

⚠️ 何かしらの理由で急遽祝日が変わることも起こり得る。

そのため、更新の手間を省きたい場合はGoogle Calendar APIから祝日の一覧を取得して判定すると良いだろう。

Google Calendar APIから取得する仕様上、静的なCSVファイルより祝日の一覧を取得するのが遅くなるデメリットがあるが、通常のWebサイトでの利用であれば問題ないだろう。

カレンダーIDとAPIキーの準備

Google Calendar APIから祝日の一覧を取得するにはカレンダーIDとAPIキーが必要。

カレンダーIDは以下の通り。

ja.japanese#holiday@group.v.calendar.google.com

Google Calendar APIのAPIキーはGoogle Cloud Platformの認証情報からプロジェクトを作成して、認証情報を作成からAPIキーを作成する。

APIキーを使用する際は自分以外の人に使われないよう編集からアプリケーションの制限でHTTP リファラー(ウェブサイト)などを必ず指定してください。

⚠️ が出ている状態だとAPIキーの利用範囲が制限されていない状態です。

アプリケーションの制限でHTTP リファラー(ウェブサイト)を指定した例

https://console.developers.google.com/apis/credentials

Google Calendar APIは「有効にする」を押していないと使えないので、有効化も忘れずに。

※ Google Cloud PlatformでGoogle Calendar APIを検索

Google Calendar API「有効にする」
Google Calendar API「有効にする」

JavaScriptで祝日一覧をAPIから取得

APIキーが用意できたらJavaScriptで祝日一覧をAPIから取得するコードを書いてみよう。

まずGoogle Calendar APIを使用する際はapi.jsの読み込みが必要なので以下のコードをHTML内に追加しておきます。

<script src="https://apis.google.com/js/api.js"></script>

JavaScriptのコードは以下のとおりです。

⚠️ AIza〜のAPIキーはiwb.jpでしか使用できないので変えてください。

const calendarId = 'ja.japanese#holiday@group.v.calendar.google.com'
const calendarApiUrl = 'https://www.googleapis.com/calendar/v3/calendars/'
const apiKey = 'AIzaSyBPACe2aM5lHUx0-6L0zUss0yl_o6RQsMw'

function loadGoogleCalendarApi() {
  gapi.client.init({
    apiKey: apiKey,
  }).then(() => {
    return gapi.client.request({
      path: calendarApiUrl + encodeURIComponent(calendarId) + '/events'
    })
  }).then((res) => {
    const items = res.result.items
    console.log(items)
  })
}
gapi.load('client', loadGoogleCalendarApi)
Google Calendar APIで50件の祝日一覧を取得
Google Calendar APIで50件の祝日一覧を取得

配列オブジェクトで50件取得されますが、祝日判定で使用するのは祝日の日付と名前なのでreduceメソッドで絞り込みをして並べ替えておくと扱いやすくなります。

const calendarId = 'ja.japanese#holiday@group.v.calendar.google.com'
const calendarApiUrl = 'https://www.googleapis.com/calendar/v3/calendars/'
const apiKey = 'AIzaSyBPACe2aM5lHUx0-6L0zUss0yl_o6RQsMw'

function loadGoogleCalendarApi() {
  gapi.client.init({
    apiKey: apiKey,
  }).then(() => {
    return gapi.client.request({
      path: calendarApiUrl + encodeURIComponent(calendarId) + '/events'
    })
  }).then((res) => {
    const items = (res.result.items).reduce((a, c) => {
      a.push({date: c.start.date, summary: c.summary})
      return a
    }, []).sort((a, b) => {
      if (new Date(a.date) > new Date(b.date)) {
        return 1
      } else if (new Date(a.date) < new Date(b.date)) {
        return -1
      } else {
        return 0
      }
    })
    console.table(items)
  })
}
gapi.load('client', loadGoogleCalendarApi)
絞り込みをして並べ替えをした結果
絞り込みをして並べ替えをした結果

あとはこのデータを利用してfilterなどを使用すれば祝日を判定する処理のコードを作成できる。

Google Calendar APIで祝日を判定するサンプル