2007年04月13日(金)

mhc2gcal : MHC のスケジュールを Google Calendar にアップロード

mhc2gcalに関するりばにしの記事

スケジュールの共有に Google Calendar を使うことになり,当初は MHC で管理しているスケジュール情報を mhc2ical を使って iCal 形式のファイルに出力し,ブラウザからインポート作業をしていたのだが,なんとも面倒なので自動化することにした.

自動化といっても,出力したファイルをインポートする作業を,ブラウザをエミュレートするライブラリなどで自動化するだけではぬるい(というか,それはそれで自分の力量ではすぐにできるわけではなさそうだが)と考え,思い切って Google Calendar Data API を使って MHC のスケジュールを Google Calendar に直接登録することを企んだ.

MHC は Ruby からいろいろといじれるようにライブラリが用意されている.そこで Google Calendar Data API も Ruby で使うことができれば,一気に解決するのではないかと考え,検索してみたところ RubyForge に gcalapi を発見.早速 gem でインストール.これで環境は整った.

で,完成したスクリプトが,その名も mhc2gcal という安直なネーミング.名前が mhc2ical からインスパイアされており,またプログラムもベースにさせていただいた.また gcalapi の example ディレクトリに入っていた ol2gcal も参考にさせていただいた.

2008年08月19日追記:最新版の使い方はこちらをご参照ください.
2009年10月26日追記:最新版の使い方はこちらをご参照ください.

というわけで mhc2gcal.rb はこちら.

まずは設定.上記スクリプト内の該当部分を,各自の環境に合わせて変更.

# google calendar Feed URL
GCAL_FEED = "http://www.google.com/calendar/feeds/XXXXXXXXXXXXXXXX@group.calendar.google.com/private/full"
# email address
GCAL_MAIL = "XXXXXXXXXX@gmail.com"
# password
GCAL_PASS = "XXXXXXX"
# delete events in the period of date from google calendar
GCAL_DEL  = false

GCAL_FEED は Google Calendar のカレンダーの個人用 URL というもの.カレンダーの詳細から見ることができる.ただし private の部分と full の部分は,違う書式になっていると思うので,こちらを参考にして,書き込みのできる URL に修正.
GCAL_MAIL は Google Calendar にアクセスするためのメールアカウント.おそらく Gmail のアカウントだったりするのではなかろうか.
GCAL_PASS は Google Calendar にアクセスするためのパスワード.これも同上.

GCAL_DEL は注意が必要.この値を true にすると,後述のコマンドラインオプションなどで指定された期間のイベントを Google Calendar から削除します.デフォルトでは GCAL_DEL の値は false にしてあります.よく理解した上でご利用下さい.

mhc2gcal が MHC から Google Calendar への一方的な登録のみを実現したくて作成したものです.Google Calendar に登録されているイベントを考慮しないため,何度も実行するとイベントが重複して登録されてしまいます.これを防ぐため,当方は以下のような利用方法を想定しています.

  1. MHC のスケジュールを登録するだけのカレンダーを Google Calendar に追加する.
  2. このカレンダーは,Google Calendar のインタフェースなどからは閲覧するだけでイベント登録はしないようにします.
  3. その上で,そのカレンダーの個人用 URL を GCAL_FEED に, GCAL_DEL の値を true に設定して使用する.

当方では上記のような利用方法で,特に問題なく動作しています.

次に,コマンドラインオプションの一覧.

  --help               show this message.
  --category=CATEGORY  pick only in CATEGORY.
                       '!' and space separated multiple values are allowed.
  --secret=CATEGORY    change the title of the event to 'SECRET'
                       space separated multiple values are allowed.
  --date={string[+n],string-string}
                       set a period of date.
                       string is one of these:
                         today, tomorrow, sun ... sat, yyyymmdd, yyyymm, yyyy
                         yyyymm lists all days in the month and yyyy lists all
                         days in the year.
                         list n+1 days of schedules if +n is given.
                         default value is 'today+0'

ベースとなった mhc2ical と同じ部分が多い.新たに追加した機能として,スケジュールを他人と共有することを目的として作成したので,あるイベントの詳細は隠したいけど,時間が埋まっていますよ,という部分を示すために,特定のカテゴリのイベントを SECRET というタイトルのイベントで登録するようにした.コマンドラインオプションでは –secret オプションで指定する.

最後に,使い方の例.

$ ruby mhc2gcal.rb --date=today+90 --category="!todo !done !holiday" --secret="private"

上記のようなオプション指定で,以下のように動作する.
 ・実行当日から90日分のスケジュールを登録する.
 ・カテゴリが todo done holiday のイベントは含めない.
 ・カテゴリが private のイベントを secret に指定してタイトルを隠す.

とまぁ,こんな感じ.本来であれば,両方向の同期を実現したいところだが,自分の利用方法としては今の仕様で十分だったので,とりあえず開発終了.

なお,このスクリプトを使用する際は,使用方法などをよく把握し,またスクリプト内で何が行われるのかを理解した上で,ご利用いただけますよう,お願い申し上げます.このスクリプトを使用して何らかの問題が生じた場合,当方は責任を負いませんので,ご了承下さい.自己責任でお願いします.

2007年04月13日01時14分 | Permalink
Trackback URL
Comment

GCALDaemonを使ってみました。

Todoリストが文字化けすること以外に文句はないです。
iCalのデータはシェルスクリプトでバックアップ。cronでまわしておけばおけーなはず。「はず。」

P.man at 2007年04月13日15時36分

iCalを使うと決めたら,いろいろと選択肢も多そうですね.
僕の場合は,MacでもWindowsでもMHCを使うと決めたので,
そっちに対応する方を優先する形となりました.
とは言っても,Windows環境で動くかどうか,確認はしていません:)

りばにし at 2007年04月14日08時15分

MHC の開発者の一人の白井と申します。

mhc2gcal 使ってみました。すばらしい!!
ちなみに、Windows (cygwin な Ruby) でも動作しましたのでご報告しておきますね。当然ですが、Linux Zaurus でも OK。

あと、強いて言うなら、今何やっているのか全然わからないので –verbose オプションつけたり、http proxy の設定(ソース埋め込みでも良いし、とか、環境変数 $http_proxy の対応)ができると、なお、良いと思われます。

白井 at 2007年05月31日12時54分

白井さん:

コメントありがとうございます.
Windowsでも動作したんですね.よかったです.

–verboseオプションと,http proxy対応,ご提案ありがとうございます.
まだRubyプログラムを始めたばかりで自信ないですが,挑戦してみたいと思います.

りばにし at 2007年06月04日00時52分

白井です。

よろしくお願いします (__)
ちなみに、”詳細” が寂しいので、手元ではこんなの↓も入れてみました。

headers = mev .non_xsc_header
headers .gsub!(/^message-id:.*\n/i, “”)
headers .gsub!(/^mime-version:.*\n/i, “”)
headers .gsub!(/^content-.*\n/i, “”)
headers .gsub!(/^x-m.*\n/i, “”)
headers .gsub!(/^references:.*\n/i, “”)
headers .gsub!(/^in-reply-to:.*\n/i, “”)

gev.desc = NKF.nkf(“-w”, headers + “\n” + mev .description .to_s)

ライン数制限とかは入れておいた良いかもですけど、ご参考まで。
こうやって消すよりも Subject:, From:, To:, Cc:, X-Ur[il] などを残すようにした方が良いかな?と、今思ったのですが、ぼくも Ruby は苦手なので ^^;

白井 at 2007年06月12日17時00分

連続でごめんなさい。やっぱりこの方が良さそうです。

headers = “Category: ” + mev .category_as_string + “\n”
switch = false
mev .non_xsc_header .split(“\n”) .each{|line|
if line =~ /^(subject|from|to|cc|x-ur[il]):/i
headers += line + “\n”
switch = true
elsif switch && line =~ /^[ \t]/
headers += line + “\n”
else
switch = false
end
}
gev.desc = NKF.nkf(“-w”, headers + “\n” + mev .description .to_s)

白井 at 2007年06月12日20時00分

mhc2gcalがあって非常に助かりました。
職場を移ったら、そこはGoogle Calendarな世界でしたので。

kuboaki at 2007年09月10日10時17分

白井さん:

詳細表示のコード,ありがとうございます.
自分の利用目的としては詳細は必要なかったので消してしまっていましたが,
現実的な利用シーンを考えると,必要な機能でしたね.
今度http_proxyなどに対応させるときに,一緒にさせていただければと思います.
# 全然作業できてなくてすみません・・・.

kuboakiさん:

コメントありがとうございます.
現状のmhc2gcalでは,たぶん「X-SC-Duration」に対応していないなど,
まだまだ機能不足なところも多いのですが,
折を見て発展させていきたいなと思っております.

りばにし at 2007年09月11日13時49分

mhc2gcal 0.2.0 リリース

リリースしてからすっかり放置プレイ状態の mhc2gcal ですが,ご要望いただ…

HeavenWolf at 2008年02月15日02時34分
Comment Form

▶次の記事:柴咲コウ – 蜜
◀前の記事:痙攣