Google Calendar APIをRuby on Railsで動作検証 （イベント取得まで）

## 概要
本記事では、RailsアプリケーションにてGoogle Calendar APIを使用したGoogleカレンダーの予定（イベント）取得を行います。

## 作業環境

Ruby 3.3.4
Ruby on Rails 7.1.5

※本記事ではrails newが既に完了してアプリケーションのベースが出来た状態である前提で説明していきます。

## Google Cloude Platform（GCP）の設定

まずはじめに事前準備としてGoogle Calendar API接続のための初期設定を行います。

公式ページにGoogle カレンダーの[クイックスタート](https://developers.google.com/calendar/api/quickstart/js?hl=ja "Google Calendar JavaScriptクイックスタート")が用意されており、こちらの手順に従って進める事も可能です。
ただ、少し情報が足りなかったり、Rubyに対応していなかったりするため、分からない所は以下の記事を参考にしながら進めました。

・[Google Calendar APIで予定のCRUD操作を行う](https://qiita.com/r-ish/items/2fc217f22af4a8333fa6 "Google Calendar APIで予定のCRUD操作を行う")
・[Ruby on RailsでGoogle Calendar APIを叩く
](https://ph-1ab.com/how-to-use-google-calendar-api-with-rails/ "Ruby on RailsでGoogle Calendar APIを叩く
")
<nr>

GCPの設定作業の流れは以下の通りです。

 **[GCPの設定]**
1：プロジェクトを作成する
2：Google Calendar APIの利用を許可する
3：API管理するためのサービスアカウントを作成する
4：サービスアカウントに秘密鍵を追加する

**[Googleカレンダーの設定]**
5：サービスアカウントのメールアドレスをGoogleカレンダーに登録する

詳細な設定方法は、以下記事にて非常に分かりやすく解説されているため、本記事では割愛します。
[Ruby on RailsでGoogle Calendar APIを叩く
](https://ph-1ab.com/how-to-use-google-calendar-api-with-rails/ "Ruby on RailsでGoogle Calendar APIを叩く")

## Rails Appにてコードを記述
### Gemのインストール

今回の実装では以下のgemを利用するためインストールを行います。

```ruby:Gemfile
# google-api-client for Google Calendar API
gem 'google-apis-calendar_v3'
gem 'googleauth'

gem 'dotenv', groups: [:development, :test]
```
`dotenv`については、後ほど`.env`ファイルで環境変数を設定することになるため、先にインストールしておきます。

`bundle install`を実行してgemをインストールします。

※参考資料では、`gem 'google-api-client'`を使用しておりますが、本記事では使用しませんでした。ちなみに`google-api-client`をインストールした際に以下の警告が発生します。
```
The google-api-client gem is deprecated and will likely not be updated further.

Instead, please install the gem corresponding to the specific service to use.
For example, to use the Google Drive V3 client, install google-apis-drive_v3.
For more information, see the FAQ in the [OVERVIEW.md](http://overview.md/) file or the YARD docs.
```
この警告は、The google-api-client が今後更新されないため非推奨であること。Google Drive V3を使用する場合はgoogle-apis-drive_v3のインストールを推奨しているとのことです。（詳細は以下記事参照）
[google-api-clientを指定してinstallするのはもう非推奨になっていた](https://tools.bigwave.biz/notes/blog/posts/ruby_do_not_import_google_api_client "google-api-clientを指定してinstallするのはもう非推奨になっていた")

今回の場合は、`google-apis-calendar_v3`がインストールされており、`google-api-client`をインストールしなくとも、動作に影響なかったため省きました。

### Initializeメソッドの記述
まずは、Initializeメソッドを定義して初期設定を行います。

今回は、appディレクトリ直下に`calendar_test.rb`を作成し、以下のコードを記述しました。
```ruby:calendar_test.rb
require "google/apis/calendar_v3"
require "googleauth"
require "googleauth/stores/file_token_store"
require 'dotenv/load'

class GoogleCalendar
  def initialize
    calendar = Google::Apis::CalendarV3
    # カレンダー操作用のインスタンスを生成、@serviceとして定義
    @calendar = calendar::CalendarService.new
    # アプリケーションの名前を設定（GCPで設定したサービスアカウント名）
    @calendar.client_options.application_name = ENV['GOOGLE_CALENDAR_APPLICATION_NAME']
    # authorizeメソッド（Google::Auth::UserAuthorizer）から受け取った認証情報
    @calendar.authorization = authorize
    # 利用するカレンダーのID(GCPで設定したメールアドレス)を設定する
    @calendar_id = ENV['GOOGLE_CALENDAR_ID']
  end
end
```
環境変数`'GOOGLE_CALENDAR_APPLICATION_NAME'`および`'GOOGLE_CALENDAR_ID'`については、アプリのルートディレクトリに`.env`を作成し、環境変数を定義しておきます。
```ruby:.env
GOOGLE_CALENDAR_APPLICATION_NAME = '****' # GCPで設定したサービスアカウント名
GOOGLE_CALENDAR_ID = '****' # GCPで設定したメールアドレス
```

### Authorizeメソッドの記述
Initializeメソッドにて`@calendar.authorization = authorize`が登場しておりますが、ここでは、authorize（認証情報を取得する動作）に該当する動作を定義します。

```ruby:calendar_test.rb
class GoogleCalendar
 ### 一部省略 ###
  def authorize
    # 認証情報を取得し、credentialに格納
    credential = Google::Auth::ServiceAccountCredentials.make_creds(
      json_ke_io: File.open(ENV['GOOGLE_CALENDAR_SECRET_PATH']),
      scope: Google::Apis::CalendarV3::AUTH_CALENDAR
    )
    # アクセストークンを取得
    credential.fetch_access_token!
    # 認証情報を返す
    credential
  end
end
```
GCPの設定にてダウンロードしたJSONファイルを、ルートディレクトリに保管します。

※注意
このJSONファイルを公開するとセキュリティ上危険であるため、`.gitignore`に追記してgit管理対象から外すようにしてください。

`.env`に環境変数`'GOOGLE_CALENDAR_SECRET_PATH'`を追加します。
```ruby: .env
### 一部省略 ###
GOOGLE_CALENDAR_SECRET = "./****.json" # ルートディレクトリに保存したJSONファイルのURLを指定
```

これで最低限のAPI接続の準備は完了しました。一旦ここで動作確認をしてみましょう。

```ruby: calendar_test.rb
class GoogleCalendar
  def initialize
   ### 一部省略 ###
    puts "Google Calendar API initialized" #確認終わったら削除orコメントアウト
    credential #credentialを戻り値に設定したいため、最後に記載すること。
  end

  def authorize
  ### 一部省略 ###
    puts "Google Calendar API authorized" #確認終わったら削除orコメントアウト
  end
end

GoogleCalendar.new
```
以下の表示が出れば成功です。エラーが出る場合はエラー内容に応じて対応しましょう。
```bash:
app# ruby app/calendar_test.rb 
> Google Calendar API authorized
> Google Calendar API initialized
```

### Readメソッドの記述
Readメソッドでは、Googleカレンダーのイベント情報を取得する動作を記述していきます。
```ruby: calendar_test.rb
class GoogleCalendar
  ### 一部省略 ###
  def read
    events = @calendar.list_events(@calendar_id,
        time_min: Time.new(2025,1,1).iso8601, #抽出開始時間
        time_max: Time.new(2025,1,31).iso8601, #抽出終了時間
    )

    events.items.each do |event|
      puts '-------------------------------'
      puts_event(event)  # 下で定義するputs_eventに基づき抽出
    end
  end

  def puts_event(event)
    puts "Event: #{event.summary}"
    puts "description: #{event.description}"
    puts "Start: #{event.start.date_time || event.start.date}"
    puts "End: #{event.end.date_time || event.end.date}"
    puts "reminders: #{event.reminders}"
  end
end

GoogleCalendar.new.read # readメソッドの実行
```

ターミナルから`app# ruby app/calendar_test.rb`のようにコード実行すれば、puts_eventで指定した項目がログに表示されます。

どのようなイベントが取得できるかについては、Event listから確認して、必要な情報を出力出来るようにしてみてください。
[Google Calendar Events List](https://developers.google.com/calendar/api/v3/reference/events?hl=ja "Google Calendar Events List")

## まとめ
Googleカレンダーの予定（イベント）を取得して、ログに出力する事が出来るようになりました。

## 参考文献
・[Google カレンダー クイックスタート](https://developers.google.com/calendar/api/quickstart/js?hl=ja "Google Calendar JavaScriptクイックスタート")
・[Google Calendar APIで予定のCRUD操作を行う](https://qiita.com/r-ish/items/2fc217f22af4a8333fa6 "Google Calendar APIで予定のCRUD操作を行う")
・[Ruby on RailsでGoogle Calendar APIを叩く](https://ph-1ab.com/how-to-use-google-calendar-api-with-rails/ "Ruby on RailsでGoogle Calendar APIを叩く")
・[google-api-clientを指定してinstallするのはもう非推奨になっていた](https://tools.bigwave.biz/notes/blog/posts/ruby_do_not_import_google_api_client "google-api-clientを指定してinstallするのはもう非推奨になっていた")
・[Google Calendar Events List](https://developers.google.com/calendar/api/v3/reference/events?hl=ja "Google Calendar Events List")