Google Calendar API: 2007年8月アーカイブ

前回の[GoogleCalendarAPI]#3 取得範囲を指定して、イベントを取得するのように、取得範囲を指定してイベントを取得した場合、本来取得さるべきでないイベントまで取得してしまうようだ。

これはおそらく、循環イベントの一部分を変更した時のデータ構造のバグだと思われる。


まず、本家のgoogleCalendar(http://www.google.com/calendar/render?pli=1)で、 循環イベントを作る。
次に、その循環イベントの一部を消去する。
最後に、残ったイベントも全部消去する。

ここで、前回の[GoogleCalendarAPI]#3 取得範囲を指定して、イベントを取得するを走らせてみる。

すると、2番目ので消去したはずの循環イベントの一部が取得されてしまう。

やはり、イベントを取得する時は、範囲を指定せずに、
[GoogleCalendarAPI]#2 循環イベントを例外も考慮して取得するのようにやった方がいいのかもしれない
今までの#2 循環イベントを例外も考慮して取得する
#1 GoogleCalendarAPIを使ってみたでは、イベントを取得する際に、範囲を指定していなかった

このことが、循環イベントを取得する際に面倒なことになっていたのかもしれない。



今までのListのインスタンスの取得方法は、


だったのを、今回は、
としてみた。


この結果、8月分のイベントのみが取得でき、循環イベントに関しては8月と9月をまたいでるものは8月分のみ取得できる


これによって何が嬉しいかというと、
今まで、循環イベントやその例外を含めてイベントを取得しようと思ったら、
entry.getTimes()によって得られるListインスタンスのgetStartTime().toString()や
getEndTime().toString()では循環イベントは取得できず、


RecurrenceインスタンスのgetValue()による
DTSTART;TZID=Asia/Tokyo:20070802T100000  //開始時間
DTEND;TZID=Asia/Tokyo:20070802T130000      //終了時間
RRULE:FREQ=DAILY;UNTIL=20070809T010000Z;WKST=SU  //繰り返しルール
BEGIN:VTIMEZONE
TZID:Asia/Tokyo
X-LIC-LOCATION:Asia/Tokyo
BEGIN:STANDARD
TZOFFSETFROM:+0900
TZOFFSETTO:+0900
TZNAME:JST
DTSTART:19700101T000000
END:STANDARD
END:VTIMEZONE

と

Listの各要素の.getEntryLink().getEntry().getId()によって得た
ohqhtp5s01jelcut44eua919hg_20070807T010000Z  //例外日
ohqhtp5s01jelcut44eua919hg_20070808T010000Z  //例外日
ohqhtp5s01jelcut44eua919hg_20070809T010000Z  //例外日

を元に計算しなければならなかったのが、

後者の方法では、

entry.getTimes()によって得られるListインスタンスのgetStartTime().toString()や
getEndTime().toString()によって、循環イベントも、以下のように取得できる

2007-08-07T15:30:00.000+09:00  //getStartTime().toString()
2007-08-07T18:30:00.000+09:00  //getEndTime().toString()

2007-08-03T10:00:00.000+09:00
2007-08-03T13:00:00.000+09:00

2007-08-08T15:30:00.000+09:00
2007-08-08T18:30:00.000+09:00

2007-08-05T10:00:00.000+09:00
2007-08-05T13:00:00.000+09:00

2007-08-06T10:00:00.000+09:00
2007-08-06T13:00:00.000+09:00

2007-08-04T10:00:00.000+09:00
2007-08-04T13:00:00.000+09:00

2007-08-02T10:00:00.000+09:00
2007-08-02T13:00:00.000+09:00

2007-08-09T17:30:00.000+09:00
2007-08-09T20:30:00.000+09:00


8月4日の日記、GoogleCalendarAPI を使ってみたでは、循環イベント(Recurrence)は取得できたが、その例外までは考慮していなかった。


例外というのは例えば、
・毎週月曜日は○○だが来週は祝日だから休み
・毎週月曜日は○○だが来週は祝日だから火曜に変更

といったものである。


前者と後者の違いについて、まず説明する。

本家Goolgeで例のような操作をする場合は、循環イベントによって既に登録されているイベントをその日だけ
 前者は削除するだけ
 後者は右(火曜日)にドラッグ&ドロップするだけ


ここで、内部で起こっている処理は、
 前者は、循環イベントにその日は例外としてイベントがナシということを登録する。
 後者は、同様に環イベントにその日は例外としてイベントがナシということを登録し、その上で、循環イベントとは独立したイベントとして新規に火曜日にイベントを登録する
である


では、実際にGoogleCalendarAPIではどのように取得できるのかを示していく。


まず、循環イベントに対応するクラスとしてRecurrenceがあり
循環イベントの例外に対応するクラスとしてRecurrenceExceptionがある。

RecurrenceはCalendarEventEntryのインスタンスからgetRecurrence()で得られる。
例外の方は、同じくCalendarEventEntryのインスタンスからgetRecurrenceException()によって得られる。ここで、getRecurrenceException()の戻り値はListである。
なぜなら、循環イベントの例外は一日とは限らないからだ。


結果として、 「Google Calendar Data API」でスケジュール(イベント)を操作するのprintEventメソッドを以下のように修正すればいい
kazuhiro's weblogの 「Google Calendar Data API」でスケジュール(イベント)を操作するを参考に
GoogleCarendarAPIを使ってみた


とりあえず、Kazuhiroさんのところにあるソースをコピペして、実行するところから

121,122行目のアカウントとパスワードの部分に自分のモノを入れ、
124行目には、
http://www.google.com/calendar/feeds/メールアドレス/private/full
を入れる


そして、コンパイル&実行




これにより、単発のスケジュールはうまく取得できたが、繰り返しのスケジュールの時間が取得できない


ここで、仕様書を見ると(読めないがww)


繰り返しの予定は、recurrenceという単語で表現さているっぽい。

さらに、CalendarEventEntryには、getRecurrence()というメソッドがあるようだ


なので、109行目に



を入れてみた



すると、

DTSTART;TZID=Asia/Tokyo:20070927T090000
DTEND;TZID=Asia/Tokyo:20070927T103000
RRULE:FREQ=WEEKLY;BYDAY=TH;UNTIL=20080117T000000Z;WKST=SU
BEGIN:VTIMEZONE
TZID:Asia/Tokyo
X-LIC-LOCATION:Asia/Tokyo
BEGIN:STANDARD

TZOFFSETTO:+0900
TZNAME:JST
DTSTART:19700101T000000
END:STANDARD
END:VTIMEZONE

みたいなものが得られた



DTSTARTは、開始時間(2007年9月27日9時)
DTENDは、終了時間(2007年9月27日10時半)
RRULEは、おそらく繰り返しの規則
FREQは、周期。一週間おきとか一ヶ月おきとか(この場合は毎週)
BYDAYは、繰り返す曜日(この場合は木曜)
UNTILは、繰り返し期限(この場合は、2008年1月17日)
WKSTは、分からないw
残りはたいした情報じゃなさそうなので、無視しとく


とりあえず、GoogleCalendarApiでスケジュールが取得できたっぽい


あとは、習うより慣れろで・・・




ぁー、早くGoogleDataAPIの本出ないかなぁー

iKnow

あわせて読みたいブログパーツ
Firefox meter