こんばんは。およそ1年半ぶりにApexコードを書いている小西です。(--
さて今回のお題はSalesforceからGoogleカレンダーのイベントを読んだり書いたりするやり方の調査です。
「apex google calendar」でググると一発でGoogle Data APIのドキュメントが引っ掛かるので楽勝です。
http://wiki.developerforce.com/page/Google_Calendar_API
ただし、、、Apexに詳しい人ならな。。。(--
文法とかDeployの仕方とかもう忘れたよ!!!
★ Google Data APIのセットアップ
さて、文句ばかり言っていても仕方がないのでとっととやっつけてしまいましょう。
まずはGoogle Data APIのセットアップ方法はこちら。
http://wiki.developerforce.com/page/Google_Data_APIs_Toolkit_Setup
詳細な手順は省略しますが、やっている内容は以下です。
- Force.com IDEのインストール
- Subclipse(EclipseのSubversion プラグイン)のインストール
- Googleのリポジトリからgoogle_data_toolkitをチェックアウト
- 自分のSalesforceアカウントにgoogle_data_toolkitを取り込み
- Salesforceのリモートサイトの設定に「https://www.google.com」を追加
要するに必要なApexクラスをインポートしているだけです。
僕は今回 Force.com IDEのインストールからやっていて、純正Force.com IDEではプラグイン取得がメニューから消されてるとか、何故か管理者権限で動かさないとForce.com IDEとSalesforceの同期がエラーになるとかに軽くひっかかりましたが、多分これを読んでいる人は皆僕よりもSalesforceに詳しいのでその辺もスルーで良いでしょう。
★ Calendar APIを使ってみる
さて、環境がととのったらあとは実際にAPIを叩くだけです。
最初に示したドキュメントにはコードサンプルもそれなりに載っているので楽勝です。
今回の場合、特定のユーザでいくつかのカレンダーにアクセスできれば良いので単純にID/Passwordでログインしたかったんですが。。。あれ???
ドキュメントにはOAuthで認証する方法しか載っていません。。。(--
□□□□
さらに検索をかけるよりも、もはやソースを見た方が早そうだったのでざっとソースを眺めることにしました。
JavaのGoogle Data APIは単純にXMLの各要素をメソッドに対応させただけのシロモノでメチャメチャ冗長で扱いにくかった記憶があるんですが、Apex版はクラス数も少なくてかなり簡略化されている印象があります。(Java版も今は変わっているかもしれませんが。)
実際、Calendar APIを使用するだけなら読まなければならないクラスは
- CalendarService
- GoogleData
の2つだけです。ただし、この2つは必ず上から下までざっとでも眺めた方が良いです。
★ Google Data APIのソースを読むべき理由
まぁ僕もそれほどしっかりと読んだわけではないんですが、それでも2つばかり「なんだかなぁ。。。」と思った部分があるので以下にそれを記載します。
- Eventオブジェクトはカレンダーイベントのラッパーではない
ドキュメント見た時から不思議だったんですが、Calendar APIではInsert時にはEventオブジェクトを引数として渡します。しかし、何故かUpdate時にはEventオブジェクトではなくDOMのElementが引数になります。EventオブジェクトがイベントのラッパーであるならUpdateもそれを使えば良いじゃんと思うんですが、実はEventがあらわすものはGoogleカレンダーのイベントではありません。Salesforceの組み込みオブジェクトのEventです。
よく考えると名前が被るのでEventという名前のApexクラスは作れないんですが、なんとも中途半端な実装をしたものです。。。(--
このおかげでUpdate時には(頑張れば)どのような項目でも設定できますが、Insert時には設定することのできない項目があります。
ちなみにここで言う「頑張る」とは自力でDOMのElementを足したり引いたりすることなので、そんなことする位なら多少パフォーマンス落としても削除してからInsertしなおすよ!と思っちゃいます。。。(--
- ソースの中にちらほらとToDoが残っている
例えばこんなのとか
// TODO support for recurring events
「繰り返し項目をサポートする」。SalesforceのEventオブジェクトにも繰り返しの設定らしきものはあります。それがGoogleカレンダーの繰り返しときれいに対応する形式なのであればすぐに作れたろうと思うんですが、多分しなかったんでしょうね。。。(--
「ラッパーあるから楽勝!」と思ってタカをくくっていると痛い目にあいかねません。(自力でDOMをどうにかすればできますけど。。。)
これもEventオブジェクトをそのまま流用したことの弊害だと思います。この仕様はSalesforceのEventをGoogleカレンダーに一方向に流すだけの場合は便利なのかもしれませんが、どうにも設計ミスのように思えます。。。(--
ちなみに当初の目的であったID/PasswordでのログインメソッドはCalendarService#useClientLoginです。
★ 今後の方針とか
さてさて、どうしたものでしょう。。。(--
自前で簡単なラッパークラスを作るだけでも格段に使い勝手はよくなりそうな気はします。でも実際のところは素のまま使ってもたいていの要件は間に合うような気がするんですよね。
必要に迫られたら作る、というのが個人的な方針でもあるので今回はスルーでも良いかなぁ。。。
決してApexのコードを書きたくないとかそういうことではないんですが。。。(^^;
★ Googleからのアカウントブロックメールに注意
そういえば、最後にもうひとつ。ApexからのID/Passwordでのログインをテストしてから次のテストコードを書いて、実行すると何故かログインに失敗するようになりました。
最初は自分のコードのバグかと思ったんですが、どうにもさっきは成功していたコードで失敗しているように見える。。。
なんでだろう?と思っていたらメールボックスにGoogleからの「不正なログインがブロックされました」というメールを発見!
ほぅ。。。どうやらGoogleはログインリクエストのUser-AgentやIPをチェックして、こいつは怪しい!と判断したら即座にそのログインをブロックするようです。
ちなみにこの状態でも日常使用しているブラウザやスマホは問題なく使えていました。(多分)
メールに記載された手順でロック解除するとすぐに使えるようになりましたが、これも知らないと結構ビックリしますよね。(^^;