GoogleカレンダーのデータをAPI経由で取得する-Ruby-
基本的にはここに書いてある事と同じようなコードでやりますが幾つかハマりポイントがあるのでその辺を書いてみます。
やりたいこと
リバネスではGoogleAppsを使っており、Googleカレンダーで全員のスケジュール管理が成されています。本当はSalesforceのスケジューラでできればこんな苦労をする必要はないのですが、使いにくすぎてこりゃ駄目だということで、Googleカレンダーを使い続けています。まあ便利ですよねやっぱり。
そのスケジュールをGoogle→Salesforceに同期させたいのですが、現在はZapierを使って同期しております。設定は簡単に出来るのですが、一つ欠点がありまして、ZapierだとGoogle→Salesforceの一方通行になってしまい、Googleカレンダーで情報が更新されたりすると、カレンダーのイベントIDをSalesforce側に持つことが出来ないために、Salesforce側の情報が更新出来ません。便利にはなったのだけれど片手落ちだなという感じで運用してきたのですが、スケジュールデータが経営上それなりにクリティカルなデータになるだろうということに気付いた為に、もう少しマシな方法を模索しましょうということになる訳です。
前置きが長くなりました。やりたいことは以下のとおり
- 全社員のGoogleカレンダーのupdate情報を取得する事
これです。それを元に、コードを見て行きたいと思います。
データの取得間隔をどうするか
取得間隔は10分としましょう。今からさかのぼって10分以内に更新された情報を取得したい。そうすると、サンプルにあるコードだと足りません。どうするかというと…
[code] userList = CSV.read("googleAppsUserList.csv") t = Time.now - 50.minutes t_max = Time.now + 3.month for uid in userList do # Fetch the next 10 events for the user results = client.execute!( :api_method => calendar_api.events.list, :parameters => { :showDeleted => 'False', :calendarId => uid, :maxResults => 20, :singleEvents => true, :orderBy => 'startTime', # :orderBy => 'updated', :updatedMin => t.iso8601 , # :timeMin => Time.now.iso8601, :timeMax => t_max.iso8601 } ) ここにやりたい処理を書く end [/code]
こんな感じです。userListでは、社員のメアドリストを開いてます。calendarIdはメールアドレスで良いみたいですよ。
時間の計算をするのでAcriveSupportを使います。
require 'active_support'
ハマリポイント1:時間計算はiso8601に変換する前に行う
変換前に計算しないとエラーでますね。ちょっとハマりました。
t = Time.now - 10.minutes
ここで10分前を取得しています。
ハマリポイント2:キャンセルしたデータは読み込まない
:showDeleted => 'False',
ここなんですけど。デリートフラグがFalseのデータだけ取得しましょう。これやらないとエラーになって止まります。
以上
こんな設定にしておくと、更新時間が10分前以降のデータで、削除フラグがたってないもので、且つ3ヶ月先までの期間のデータを最大20件取得してくれます。