RailsでGoogle Calendar APIを叩こうと思ったのだけど、つまずきポイントがけっこうあったのでメモを残しておく。
RailsでGoogle Calendar APIを叩くための下準備

下準備としては、
- GCPで行う設定
- Googleカレンダーで行う設定
の2つがある。
GCPで行う設定
まずはGCPの設定から行う。
1:プロジェクトを作成する

GCPの管理画面のメニュバーにある『プロジェクトの選択』をクリックする。

右上にある『新しいプロジェクト』をクリックする。

プロジェクトの作成画面になるので、『プロジェクト名』を入力してから『作成ボタン』をクリック。
2:Google Calendar APIの利用を許可する
次にGoogle Calendar APIの利用を有効化する。

左サイドバーの『APIとサービス』をクリックし、『ライブラリ』をクリックする。

検索フォームに『google calendar api』と入力。

検索すると、Google Calendar APIがヒットするので、これをクリックする。

最後に『有効にする』ボタンをクリックして、Google Calendar APIを有効にする。
3:サービスアカウントを作成する
次にサービスアカウントを作成する。
サービスアカウントとは、簡単に言ってしまうとAPIを管理するためのアカウントだ。
つまり、ここではGoogleカレンダーのAPIを管理するためのアカウントを作る。

左サイドバーの『APIとサービス』をクリックし、『認証情報』をクリックする。

画面上部の『+認証情報を作成』をクリックしてから、『サービスアカウント』をクリックする。

『サービスアカウント名』を入力し、『作成して続行』をクリック。

任意のロールを選択して『続行』をクリック。
ちなみにロールを選択しなくてもAPIの動作確認はできるので、後から設定してもOK。

『完了』をクリック。
ユーザーロールが空欄のままでも動作確認はできる。
4:サービスアカウントに鍵を追加する

左サイドバーの『サービスアカウント』をクリックし、赤枠にある『メール』をクリックする。

『キー』をクリックし、『鍵を追加』をクリックする。

『JSON』を選択して、『作成』をクリックする。
ここでダウンロードされるjsonファイルは、のちほどRailsアプリで使用する。
Googleカレンダーの設定
次にGoogleカレンダーの設定をする。
1:サービスアカウントのメールアドレスをGoogleカレンダーに登録する

任意のカレンダーを選んでから、『設定と共有』をクリック。

『ユーザーを追加』をクリックし、先ほど作った『サービスアカウントのメールアドレスを追加』する。
この時、権限を『変更及び共有の管理権限』とする。
これでGoogle Calendar APIを使うための準備は終わり。
RailsでGoogle Calendar APIのCRUD処理をする

次にGoogle カレンダーを操作するためのコードを書く。
1:gemをインストールする
以下をGemfileに記述し、『bundle install』をする。
# Gemfile gem 'google-apis-calendar_v3' gem 'google-api-ruby-client' gem 'googleauth'
2:jsonファイルを配置する
先ほどダウンロードしたjsonファイルをRailsアプリケーションのルートディレクトリに配置する。
このファイルの情報は外に漏れたらダメなので、gitignoreを忘れないこと。
3:CRUD処理をするコードを書く
#
# google_calendar.rb
#
require "google/apis/calendar_v3"
require "googleauth"
require "googleauth/stores/file_token_store"
require "date"
require "fileutils"
class GoogleCalendar
def initialize
@calendar = Google::Apis::CalendarV3::CalendarService.new
@calendar.client_options.application_name = ENV.fetch['GOOGLE_CALENDAR_APPLICATION_NAME']
@calendar.authorization = credential
@calendar_id = ENV.fetch['GOOGLE_CALENDAR_ID']
end
def authorize
credential = Google::Auth::ServiceAccountCredentials.make_creds(
json_key_io: File.open(ENV.fetch['GOOGLE_CALENDAR_SECRET_PATH']),
scope: Google::Apis::CalendarV3::AUTH_CALENDAR)
credential.fetch_access_token!
credential
end
def build_event(summary:, description:, location:, start:, end:)
Google::Apis::CalendarV3::Event.new(
summary: summary,
description: description,
location: location,
start: Google::Apis::CalendarV3::EventDateTime.new(date_time: start),
end: Google::Apis::CalendarV3::EventDateTime.new(date_time: end)
)
end
def create(summary:, description:, location: start:, end:)
event = build_event(
summary: summary, #String
description: description, #String
location: location, #String
start: start, # DateTime.now
end: end # DateTime.now + 1.hour
)
response = @calendar.insert_event(
@calendar_id,
event
)
end
def read(time_min:, time_max:,)
events = @calendar.list_events(@calendar_id,
time_min: time_min, # Time.now
time_max: time_max, #Time.now + 1.day
)
events.items.each do |event|
Rails.logger.debug '----------------------------'
Rails.logger.debug "-#{event.id} "
Rails.logger.debug "-#{event.summary} "
Rails.logger.debug "-#{event.location} "
Rails.logger.debug "-#{event.start.date_time} "
Rails.logger.debug "-#{event.end.date_time} "
end
end
def update(event_id:)
event = build_event(
summary: 'updated event',
description: 'updated event',
location: 'Chiba',
start: DateTime.now + 1.hour,
end: DateTime.now + 2.hour
)
res = @calendar.update_event(
@calendar_id,
event_id,
event
)
Rails.logger.debug '----------------------------'
Rails.logger.debug "-#{res.id} "
Rails.logger.debug "-#{res.summary} "
Rails.logger.debug "-#{res.location} "
Rails.logger.debug "-#{res.start.date_time} "
Rails.logger.debug "-#{res.end.date_time} "
end
def delete(event_id:)
@calendar.delete_event(
@calendar_id,
event_id
)
end
end
環境変数は以下のように設定すればOK。
- ENV[‘GOOGLE_CALENDAR_APPLICATION_NAME’]
- GCPで作ったサービスアカウント名
- ENV[‘GOOGLE_CALENDAR_ID’]
- Googleカレンダーと紐づいているGmailのアドレス
- ENV[‘GOOGLE_CALENDAR_SECRET_PATH’]
- 先ほどダウンロードしたjsonファイルをのパス
- ルート直下に配置していれば、『./xxxxxx.json』と設定する
- パスを指定するのではなく、JSONファイルの中身を直接読み込む方法もある(以下リンク参照)

これでGoogle Calendar APIを叩けるはず。
終わりに
そのほか使えるメソッドなどは公式のリファレンスに詳しく書いてあるのでそちらをチェックしてみてください。


