GoogleカレンダーAPIで、カレンダーリストを作成・取得する (Node.js)

GoogleカレンダーAPIを利用して、複数のカレンダーのデータを参照するケースを想定しています。 このケースでは、対象となるカレンダーのIDなどを定数としてアプリケーション側に持たせるか、データベースへの登録、そしてG […]

広告ここから
広告ここまで

目次

    GoogleカレンダーAPIを利用して、複数のカレンダーのデータを参照するケースを想定しています。

    このケースでは、対象となるカレンダーのIDなどを定数としてアプリケーション側に持たせるか、データベースへの登録、そしてGoogleカレンダーAPIでの一覧取得などが実装方法として挙がります。

    カレンダーの数が増減するケースが考えられるため、今回はGoogleカレンダーAPIを利用しました。

    CalendarList APIでリストを管理する

    任意のカレンダーリストを管理するには、CalendarList APIを利用します。

    ユーザーのカレンダー リスト内のカレンダーのコレクション。

    https://developers.google.com/calendar/api/v3/reference/calendarList?hl=ja

    更新系のAPIなども利用するため、認証まわりは次のように設定しました。

    import {google} from 'googleapis'
    
    const SCOPES = ['https://www.googleapis.com/auth/calendar']
    const GOOGLE_PROJECT_ID = 'gcaldemo'
    
    const auth = new google.auth.GoogleAuth({
      keyFile: '/path/to/your-secret-key.json',
      scopes: SCOPES,
      projectId: GOOGLE_PROJECT_ID
    })

    もし、Insufficient Permissionエラーが出た場合は、SCOPESが'https://www.googleapis.com/auth/calendar.readonlyになっていないか確認しましょう。

    CalendarList APIでリストにカレンダーを登録・取得する

    登録したいカレンダーのIDを利用して登録しましょう。

    
        const calendar = google.calendar({
          version: "v3",
          auth: auth
        });
        await calendar.calendarList.insert({
          requestBody: {
            id: GOOGLE_CALENDAR_ID
          }
        })

    取得したい場合は、List APIを利用します。

        await calendar.calendarList.list().then(({data}) => data)

    リストに登録したカレンダーイベントをまとめて取得するサンプル

    
        const calendar = google.calendar({
          version: "v3",
          auth: auth
        })
    
        const calendars = await calendar.calendarList.list().then(({data}) => {
          return data.items.map(item => ({
            id: item.id,
            name: item.summary
          }))
        })
    
        const events: {
          [calendar_name: string]: calendar_v3.Schema$Event[]
        } = {}
    
        await Promise.all(calendars.map(async({id, name}) => {
          const response = await  calendar.events.list({
            calendarId: id,
            timeMin: new Date().toISOString(),
            maxResults: 10,
          }).then(res => res.data.items)
          events[name] = response
        }))
    
        return events

    ここまでくると、APIのレスポンスが遅くなるケースが想定されそうです。

    S3などのファイルストレージにJSONで配置するか、KVS系のDBにバッチ的に保存する方がよいかもしれません。

    Next step

    Webhook的に利用できる機能がある・・・様子でした。

    Google Calendar API には、リソースの変更を監視できるプッシュ通知が用意されています。この機能を使用して、アプリケーションのパフォーマンスを向上させることができます。

    https://developers.google.com/calendar/api/guides/push?hl=ja

    次はこれを使って、変更があった時にデータを更新したり通知を出したりする方法を試してみます。

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark