自分のオフィスでは、社員共通のスケジュール管理はサイボウズOffice6を使っています。利用者のコメントなんか見ていると他の製品やサービスとの連携は難が多いようです。

最近、iPhoneを手に入れまして、スケジュール管理は「さいすけ」が評判がいいようなので、基本的には無料アプリばっかりで通していたんですが、これだけは買ってしまいました。
さいすけ

さいすけはGoogleカレンダーと同期ができて、iPhoneでちまちまスケジュール入力するよりも、パソコンでGoogleカレンダーに入力する方が大量にスケジュール入力するときは楽です。

さて、これらのスケジュールの同期を取る場合、

  • サイボウズはスケジュールをCSVテキスト形式でインポート、エクスポートできる。

  • GoogleカレンダーはRFCにもなっているiCalendar形式でインポート、エクスポートできる。

  • さいすけはGoogleカレンダーとボタン一つで同期できる。


ということで何とか同期はできそうです。

ツールとしてはogawaさんのcybozu2icalというオープンソースがあるんですが、自分のcygwin環境ではうまくインストールすることができませんでした。

仕方なく、とりあえず以下の3つのスクリプトを作りました。

サイボウズのスケジュールのCSVエクスポート
サイボウズのスケジュールのエクスポートをブラウザからでなくコマンドラインから行えるようにしたスクリプト。開始月と期間の指定ができる。
csvの差分ファイル作成ツール
サイボウズのスケジュールをCSVでエクスポートした際、同じ期間で古いのと新しいのとを比較して、追加になったイベントのCSV、削除になったイベントのCSVを生成するスクリプト
サイボウズのCSVからGoogleのiCalendarに変換する
サイボウズのCSV形式のファイルからGoogleカレンダーでインポートできるiCalendar形式に変換するツール

両方ともPerlのText::CSV_XSモジュールを使った簡単なものです。

これで、サイボウズに新規に登録されたものだけを、Googleカレンダーにインポートして登録するところまではでき、さいすけとも同期が取れました。

でも、サイボウズでキャンセルになったスケジュールをGoogleカレンダーで削除するところは標準機能だけではダメなようです。

仕方なく調べてみると、Google Calendar Data APIというのがあって、カレンダーなんかも操作でき、Java、.NET、Python、PHP、Objective-C、JavaScriptなど様々な言語をサポートしていることがわかりました。

自分としてはキャンセルされたスケジュールの削除だけが、とりあえずできればよいので、簡単そうなPythonを使ってみることにしました。

ここからgdata-2.0.5.zipというPythonのライブラリを落とします。

Python 2.2以上に対応しているそうで、cygwinでは2.5.2だったので問題ありませんでした。インストールは以下で終わりです。

% unzip gdata-2.0.5.zip
% cd gdata-2.0.5
% ./setup.py install


さて、簡単なところからGoogleカレンダーの登録されているイベントを表示するようなサンプルを動かしてみようと、一覧表示部分を抜き出して実行しましたがダメでした。

#!/usr/bin/python
import gdata.calendar.service
client = gdata.calendar.service.CalendarService()
client.email = 'あなたのアドレス@gmail.com'
client.password = 'パスワード'
client.source = 'Google-Calendar_Python_Sample-1.0'
client.ProgrammaticLogin()
feed = client.GetOwnCalendarsFeed()
for i, an_event in enumerate(feed.entry):
 print '\t%s. %s' % (i, an_event.title.text,)
 for p, a_participant in enumerate(an_event.who):
  print '\t\t%s. %s' % (p, a_participant.email,)
  print '\t\t\t%s' % (a_participant.name,)
  print '\t\t\t%s' % (a_participant.attendee_status.value,)


AttributeError: 'CalendarListEntry' object has no attribute 'who'


動かないサンプルなんか入れとくな〜〜〜っ!!!と怒りの気持ちをおさえつつ、queryなら動くようなのでちょっと手直しして

#!/usr/bin/python
# coding: cp932
import gdata.calendar.service
client = gdata.calendar.service.CalendarService()
client.email = 'あなたのGmailアドレス'
client.password = 'パスワード'
client.source = 'Google-Calendar_Python_Sample-1.0'
client.ProgrammaticLogin()

query = gdata.calendar.service.CalendarEventQuery('あなたのGmailアドレス', 'private', 'full')
query.max_results = 50

feed = client.CalendarQuery(query)
for i, an_event in enumerate(feed.entry):
 title_u8 = an_event.title.text
 title = unicode(title_u8, 'utf-8').encode('cp932', 'replace')
 when = an_event.when
 print '件名: %s' % (title,)
 print '場所: %s' % (an_event.where[0].value_string,)
 print '詳細: %s' % (an_event.content.text,)
 print '日付: %s - %s' % (when[0].start_time, when[0].end_time,)
 print '参照: %s' % (an_event.GetEditLink().href,)
 print ''


実行してみるとカレンダーに登録されたイベントが表示されます。

件名: 仕事始め
場所: None
詳細: None
日付: 2010-01-04 - 2010-01-05
参照: http://www.google.com/calendar/feeds/○×1

件名: PKI定点観測
場所: None
詳細: None
日付: 2010-01-18 - 2010-01-19
参照: http://www.google.com/calendar/feeds/○×1


さて本題のカレンダーのイベントの削除ですが、消したいと思うイベントをクエリや件名などで絞り込んでから、実際に消すにはイベントan_eventに対して以下を実行すればオーケーです。

client.DeleteEvent(an_event.GetEditLink().href)


サイボウズからエクスポートされたCSVに対して、差分生成ツールによりスケジュールの更新によりキャンセルされたイベントのCSVは出てくるので適当に処理して、上のDeleteEventメソッドを実行してやればよいわけです。

APIを勉強した今では、登録も削除もAPI使った方が一貫性があるような気もしますが、とりあえず目的は達成されたので、時間が取れるまではこれで凌ごうと思っています。

ではでは、