Ruby on RailsでGoogle Calendar APIを叩く

Engineering
この記事を書いた人

PharmaXというオンライン薬局のスタートアップで薬剤師・エンジニアとして働いています。Rails・React・TypeScriptなどを書きます。英語が得意でTOEIC900点・通訳案内士資格取得。主に薬剤師の働き方やプログラミング、英語学習について書きます。当サイトではアフィリエイトプログラムを利用して商品を紹介しています。
>> 詳しいプロフィール

Tomoyuki Katoをフォローする

 

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ファイルの中身を直接読み込む方法もある(以下リンク参照)
googleauth gemで直接JSONを読み込んで認証する
『googleauth gem』のREADMEを読むと、以下のようにFirebaseコンソールからダウンロードしたJSONファイルのパスを読み込んで認証をしている。 scope = ' authorizer = Go

 

これでGoogle Calendar APIを叩けるはず。

 

終わりに

そのほか使えるメソッドなどは公式のリファレンスに詳しく書いてあるのでそちらをチェックしてみてください。