Ruby で Google Calendar 情報を読み出す


TL; DR

  • Google Calendar のイベントを Ruby プログラムから読み出す方法を書きました。IoT ガジェットなどの自作に便利かと思います。
  • 公式 Quick Start は人間が介在する OAuth2 のやり方だけど、ようはこれの無人版です。あと、この公式ドキュメントは single_events パラメタを指定してないので動かない(バグ持ちの)はずです。
  • サービスアカウントというものを作って、それに必要な権限を与え、そのアカウントの秘密鍵を使ってアクセスします。

カレンダーの準備

既存のものもしくは新規作成した Google Calendar の ID をメモします。IDは設定 > マイカレンダーの設定 から確認できます。

プロジェクトとサービスアカウント

各種ドキュメントを操作するには当然権限が必要です。プログラムから操作する場合は、大雑把に言って2とおりの権限獲得の手法があります。

  • 一時的に人間の許可を得て、その人間のアカウントで操作
  • 権限を与えられた 機械ようのアカウント で操作

ざっくり言うと前者はインタラクティヴなソフトで使う方法で、後者は自動化システムで使う方法です。今回は後者の方法を使います。ここで「機械ようのアカウント」を サービスアカウントと言います。つまり、まずはサービスアカウントを作り、必要な権限を与える必要がります。だいたい以下の手順です。

  1. GCPのコンソール に行って、プロジェクトを作ります。
  2. GCPの左上のハンバーガーメニュー > IAMと管理 > サービスアカウント > サービスアカウントを作成
  3. 入力は必須項目だけで良いと思います。[email protected] というアカウントができます。
  4. アカウントを作ると秘密鍵 (private key) をダウンロードできると思います。JSON形式でダウンロードしてください。
  5. このアカウントに対して、カレンダーの権限を与えてください(=共有してください)。与え方は通常の人間向けの権限操作といっしょです。
  6. ハンバーガーメニュー > APIとサービス > ライブラリ からカレンダーAPIを有効化してください。

パッケージのインストール

たぶんこれだけでいいはず。

$ gem install google-apis-calendar_v3

コード

直近の10個のイベントを取得して標準出力に開始時刻と概要を出力します。

# coding: utf-8
require 'google/apis/calendar_v3'

KEYFILE = "ダウンロードした鍵.json".freeze
CALENDAR_ID = "「マイカレンダーの設定」にあるID".freeze

service = Google::Apis::CalendarV3::CalendarService.new
service.authorization = Google::Auth::ServiceAccountCredentials.make_creds(
  json_key_io: File.open(KEYFILE),
  scope: Google::Apis::CalendarV3::AUTH_CALENDAR_READONLY,
)

resp = service.list_events(
  CALENDAR_ID,
  max_results: 10,
  order_by:    :startTime,
  time_min:    DateTime.now.rfc3339,
  single_events: true,  # これがないと order_by を "startTime" にできない
)

resp.items.each {|event|
  # 全日の予定は DateTime じゃなくて Date になる
  start = event.start.date_time || event.start.date
  puts "%s %s" % [start, event.summary]
}