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