LoginSignup
4
8

More than 5 years have passed since last update.

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

Posted at

概要

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

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

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

  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 でインストールできるので省略します。)
  2. Google API Console にアクセス スクリーンショット 2016-07-08 21.54.25.png

  3. 左サイドの「認証情報」メニュー >「認証情報を作成」>「サービスアカウント キー」を選択スクリーンショット 2016-07-08 21.56.20.png

  4. 「新しいサービスアカウント」を作成 > キーのタイプは「P12」で作成 (参考となるJSONでやろうとしたら、実現できなかったので「P12」に逃げました。。)スクリーンショット 2016-07-08 21.59.18.png

  5. 「P12」ファイルはrubyスクリプトがアクセスできるところに保存し、サービスアカウントを作成する過程で作成された「サービスアカウントID」をメモっておきます。

  6. 次は、Googleカレンダーにアクセススクリーンショット 2016-07-08 22.12.16.png

  7. 連携するカレンダーの「カレンダーID」を確認しましょう。(標準のカレンダーを使う場合は、Googleアカウントです。)スクリーンショット 2016-07-08 22.12.44.png

  8. カレンダーの共有設定を変更します。ここで、先ほどメモった「サービスアカウントID」を追加します。スクリーンショット 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で、2種類を試してみました。
event.end.date_timeについては、Google Calenader APIのページには出てこないので、古いフォーマットなのかもしれません。

参照サイト

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8