【Nuxt3】FullCalendarを使用してGoogleカレンダーを表示させる方法

FullCalendarは、Webアプリケーションでカレンダーを表示・操作するためのjsライブラリです。この記事では、FullCalendarにGoogleカレンダーを表示させる方法を説明します。

2023年06月03日

前提

  • Nuxt3プロジェクトが存在する
  • node v18.0.0

モジュールを入れる

PCの場合はカレンダー表示、スマホの時にはリスト表示で実装していくため、以下のモジュールを追加してください。

yarn add @fullcalendar/core @fullcalendar/daygrid @fullcalendar/google-calendar @fullcalendar/interaction @fullcalendar/list @fullcalendar/timegrid @fullcalendar/vue3

APIを有効にする

APIを有効にせず作業を進めても項目が表示されません。
403エラーが出る場合はここを疑いましょう!

  • Google Cloud Consoleにアクセスします。
  • ナビゲーションメニューから「APIとサービス」>「ライブラリ」に移動します。
  • ライブラリページで、「Google Calendar API」というキーワードで検索します。
  • 検索結果から「Google Calendar API」を見つけ、その横にある「有効にする」ボタンをクリックします。
  • しばらくすると画面遷移し、APIの有効化が完了します。

ApiKeyを発行する

Google Cloud Consoleにアクセスします。

  1. プロジェクトを選択。
    ※ プロジェクトがまだない場合は、新しいプロジェクトを作成してください。
  2. メニューから「APIとサービス」>「認証情報」に移動します。
  3. 「認証情報を作成」ボタンをクリックします。
  4. 「APIキー」を選択します(自動生成)
  5. 生成後、APIKey付きのダイアログが出現するので、コピーしておいてください。
    ※ 必要に応じて、編集画面から名前など内容を変えてください

ちなみに、Firebase環境では自動生成されているAPIKeyを使用できます。

環境変数を設定

nuxt.config.tsから、プロジェクト内で使用できるように設定します。

runtimeConfig: {
  public: {
    apiKey: AIzaxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, #設定
    ~~~
  }
}     

実装

vuetify3 × nuxt3のプロジェクトで進めていきます。

コンポーネント部分

components/GoogleCalendar.vueを作成し、内容を以下の通りに実装します。

<template>
  <div id="calendar" ref="calendarRef"></div>
</template>

<script setup lang="ts">
import { Calendar } from '@fullcalendar/core'
import dayGridPlugin from '@fullcalendar/daygrid'
import listPlugin from '@fullcalendar/list'
import interactionPlugin from '@fullcalendar/interaction'
import googleCalendarPlugin from '@fullcalendar/google-calendar'
import { useDisplay } from 'vuetify'

const calendarRef = ref<HTMLDivElement | null>(null)
const display = ref(useDisplay())

onMounted(() => {
  if (!calendarRef.value) return

  const { apiKey } = useRuntimeConfig().public
  const calendar = new Calendar(calendarRef.value, {
    locale: 'ja',
    plugins: [dayGridPlugin, listPlugin, interactionPlugin, googleCalendarPlugin],
    initialView: display.value.xs ? 'listMonth' : 'dayGridMonth',
    eventSources: [
      {
        googleCalendarApiKey: apiKey,
        googleCalendarId: '#Google Calendar からIDを取得'
      }
    ]
  })

  calendar.render()
})
</script>

ざっと書きましたが、ここから説明していきます。

プラグイン

Fullcalendarは拡張性が高く、いろいろなプラグインに対応しています。
今回入れているのは以下です。簡単に説明します。

dayGridPlugin

カレンダー表示をさせるためのプラグインです。
PC表示の場合に適用させます。

listPlugin

リスト表示をさせるためのプラグインです。
スマホもしくはタブレットサイズの場合に適用させます。

interactionPlugin

日付のクリック(dateClick)を検知するためのプラグインです。

Google Calendar IDを取得する

今回は日本の祝日を取得してみましょう。

  1. Google Calendarにアクセスします
  2. カレンダーリストの左側に表示されている、対象カレンダーのオーバーフローメニュー(縦に…のやつ)をクリックします。
  3. ドロップダウンメニューから「設定」を選択します。
  4. @group.calendar.google.comで終わる一連の文字列がIDとなります。

    ※ 日本の祝日はこのような表示となります

確認してみよう

IDをコピーし、eventSourcesに当てこんでいきます。

    ~~~
    eventSources: [
      {
        googleCalendarApiKey: apiKey,
        googleCalendarId: 'ja.japanese#holiday@group.v.calendar.google.com' #ここ
      }
    ]
    ~~~

GoogleCalendarコンポーネントを呼び出し、祝日が表示されていることを確認しましょう!

<template>
  <div>
    <v-container>
      <google-calendar />
    </v-container>
  </div>
</template>

共有

こちらに動作環境があります。
https://fir-study-42747.web.app/calendar

【今回の作業ブランチ】
https://github.com/yutahhh/firebase-study/tree/feature/%239

お疲れ様でした。

筆者情報
IT業界経験6年目のフルスタックエンジニア。
フロントエンドを軸として技術を研鑽中でございます。