GoogleカレンダーのイベントをRubyで取得する



## 概要
会社ではサイボウズとかOutlookを使っていて、個人のスケジュールはGoogleカレンダーを使っている、ってケースは多いんじゃないでしょうか。

２つのツールを統合していきたいと思っているんですが、手頃なツールを見つけることができなかったので、自作に挑戦する前の、まず第一ステップとして、GoogleカレンダーのAPIを使って登録イベントを取得してみます。

Googleカレンダーの連携方法としては３つあって

1. APIキー
2. OAuth2.0 クライアントID
3. サービスアカウント キー

そのうち、APIキーは、公開スケジュールのみの取得する際の利用方法になるようです。

OAuth2.0 での連携は、ブラウザーを使った連携を想定している方法のようです。こちらも試しているのですが、説明についてはまた別の機会に。

ここでは、「3. サービスアカウント キー」を使った連携方法を説明します。
## 環境
- OS X El Capitan
- ruby 2.1.6p336 (2015-04-13 revision 50298)
- gem 2.6.6

## 手順
1. *google api client*のモジュールをインストール（gem でインストールできるので省略します。）
1. [Google API Console](https://console.developers.google.com/) にアクセス ![スクリーンショット 2016-07-08 21.54.25.png](https://qiita-image-store.s3.amazonaws.com/0/87229/7ded44e3-05bb-a577-6358-aab9672ba216.png "スクリーンショット 2016-07-08 21.54.25.png")

1. 左サイドの「認証情報」メニュー　＞「認証情報を作成」＞「サービスアカウント キー」を選択![スクリーンショット 2016-07-08 21.56.20.png](https://qiita-image-store.s3.amazonaws.com/0/87229/95f0d47f-d59c-2824-d806-49147a7d2340.png "スクリーンショット 2016-07-08 21.56.20.png")

1. 「新しいサービスアカウント」を作成 ＞ キーのタイプは「P12」で作成　（参考となるJSONでやろうとしたら、実現できなかったので「P12」に逃げました。。）![スクリーンショット 2016-07-08 21.59.18.png](https://qiita-image-store.s3.amazonaws.com/0/87229/ac233628-378e-aae9-795e-13b5039b32a5.png "スクリーンショット 2016-07-08 21.59.18.png")

1. 「P12」ファイルはrubyスクリプトがアクセスできるところに保存し、サービスアカウントを作成する過程で作成された「サービスアカウントID」をメモっておきます。
1. 次は、Googleカレンダーにアクセス![スクリーンショット 2016-07-08 22.12.16.png](https://qiita-image-store.s3.amazonaws.com/0/87229/38087764-f891-6df6-6d6d-0d9462aa23ea.png "スクリーンショット 2016-07-08 22.12.16.png")

1. 連携するカレンダーの「カレンダーID」を確認しましょう。（標準のカレンダーを使う場合は、Googleアカウントです。）![スクリーンショット 2016-07-08 22.12.44.png](https://qiita-image-store.s3.amazonaws.com/0/87229/1b19b630-5524-fed3-ce9e-0037f3d1c3ae.png "スクリーンショット 2016-07-08 22.12.44.png")

1. カレンダーの共有設定を変更します。ここで、先ほどメモった「サービスアカウントID」を追加します。![スクリーンショット 2016-07-08 22.17.54.png](https://qiita-image-store.s3.amazonaws.com/0/87229/59ad1a6d-c532-12a9-e888-5c5a51eb67ca.png "スクリーンショット 2016-07-08 22.17.54.png")


ここまで終われば、いよいよ、スクリプトの準備です。

## スクリプトの実行

サンプルコードとしては下記の通りです。

```gcal_s3.rb
# coding: utf-8
require 'google/api_client'

client = Google::APIClient.new(:application_name => 'test')

# 認証
key = Google::APIClient::KeyUtils.load_from_pkcs12('[秘密キーのファイル]', '[秘密キーのパスワード]')
client.authorization = Signet::OAuth2::Client.new(
  token_credential_uri: 'https://accounts.google.com/o/oauth2/token',
  audience: 'https://accounts.google.com/o/oauth2/token',
  scope: 'https://www.googleapis.com/auth/calendar.readonly',
  issuer: '[サービスアカウント ID(メールアドレス形式)]',
  signing_key: key
  )
client.authorization.fetch_access_token!

# イベント取得
cal = client.discovered_api('calendar', 'v3')

time_min = Time.utc(2016, 1, 1, 0).iso8601
time_max = Time.utc(2016, 12, 31, 0).iso8601
params = {'calendarId' => '[カレンダーID]',
          'orderBy' => 'startTime',
          'timeMax' => time_max,
          'timeMin' => time_min,
          'singleEvents' => 'True'}

result = client.execute(:api_method => cal.events.list,
                        :parameters => params)


# イベント格納
events = []
result.data.items.each do |item|
  events << item
end

# 出力
events.each do |event|
  printf("%s, %s, %s, %s, %s\n",
  event.start.dateTime.strftime("%Y-%m-%d %H:%M:%S"), event.end.date_time, event.summary, event.description, event.id)
end
```


・[秘密キーのファイル][秘密キーのパスワード]
・[サービスアカウントID]
・[カレンダーID]
を変更しましょう。

スクリプトの実行結果は、

```gcal_s4.rbの結果
boku-no-MacBook:ruby boku$ ruby gcal_s4.rb 
2016-07-08 12:30:00, 2016-07-08 13:30:00 +0900, 旅行の準備, 説明書き, p4hq**********etqrg834ueo
```
となり、イベントを取得できました。

## 補足
日付の結果出力については、startとendで、２種類を試してみました。
*event.end.date_time*については、Google Calenader APIのページには出てこないので、古いフォーマットなのかもしれません。

## 参照サイト
- [Google Calendar API を使って予定表を自動更新したりする](http://takuya-1st.hatenablog.jp/entry/2014/11/09/042013)
- [Googleカレンダーを使ったRuby製自動目覚ましを作ってみた - Qiita](http://qiita.com/youcune/items/188c1fdb86c06bd94432)
- [rubyでgoogleカレンダーのイベントを取得するメモ - Qiita](http://qiita.com/mechamogera/items/bf2ed20e332dc31d2352)
- [Google Calendar API - Events](https://developers.google.com/google-apps/calendar/v3/reference/events?hl=ja#resource)
  - カレンダーイベントの出力フォーマット