4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Ruby]Google Calendar APIから日程を取得しよう

Last updated at Posted at 2018-06-11

※順次更新していきます。

#1 サービスアカウントの作成
Google developにアクセスして[APIとサービスの有効化]をクリック。
[Google Calendar API]を有効にします。
そのままホームページの指示にしたがって入力していきます。
そしたらjson形式のファイルがダウンロードされると思います。

#2 Googleカレンダーとサービスアカウントの連携
[APIとサービス⇨認証情報⇨サービスアカウントの管理]をクリック
以下のようなページ表が出てくることと思います。
スクリーンショット 2018-06-11 23.13.04.png
メールの下に記入されているメールアドレスをコピーします。

次に、共有させたいGoogleCalendarを開き、[特定のユーザーとの共有]のところ(以下の画面)に先ほどコピーしたメールアドレスを貼り付けます。
スクリーンショット 2018-06-11 23.18.45.png

#3 実装

app.rb
require 'bundler/setup'
Bundler.require

APPLICATION_NAME = '「2で出てきたサービスアカウント管理の中の名前」'
MY_CALENDAR_ID = '「連動させたカレンダーのID」'
CLIENT_SECRET_PATH = '「ダウンロードしたjsonのパス」'

class Calendar
  def initialize
    @service = Google::Apis::CalendarV3::CalendarService.new
    @service.client_options.application_name = APPLICATION_NAME
    @service.authorization = authorize
    @calendar_id = MY_CALENDAR_ID
  end

  def authorize
    authorizer = Google::Auth::ServiceAccountCredentials.make_creds(
      json_key_io: File.open(CLIENT_SECRET_PATH),
      scope: Google::Apis::CalendarV3::AUTH_CALENDAR)
    authorizer.fetch_access_token!
    authorizer
  end

  def test
    events = @service.list_events(@calendar_id,
                                    time_min: (Time.now - 365.days).iso8601,
                                    time_max: (Time.now + 365.days).iso8601,
                                   )
    puts "Calendar name: #{events.summary}"
    events.items.each do |event|
      time = if event.start.date.present?
               "#{event.start.date.to_s}#{event.end.date.to_s}"
             else
               "#{event.start.date_time.to_date} #{event.start.date_time.strftime('%-k:%M')}#{event.end.date_time.to_date} #{event.end.date_time.strftime('%-k:%M')}"
             end
      puts "#{time} :::: #{event.summary} at #{event.location}"
    end
  end
end

Calendar.new.test

#error

jsonがうまく引っかかっていないと以下のようなエラーが出た。
jsonのパスを確認しよう

 `fetch_access_token': Authorization failed.  Server message: (Signet::AuthorizationError)
{
"error": "invalid_grant",
"error_description": "Invalid JWT Signature."
}

#参考文献
LINEBOTからGoogleカレンダーを取得する

4
5
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
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?