2007年04月13日(金)
mhc2gcal : MHC のスケジュールを Google Calendar にアップロード
スケジュールの共有に 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 に登録されているイベントを考慮しないため,何度も実行するとイベントが重複して登録されてしまいます.これを防ぐため,当方は以下のような利用方法を想定しています.
- MHC のスケジュールを登録するだけのカレンダーを Google Calendar に追加する.
- このカレンダーは,Google Calendar のインタフェースなどからは閲覧するだけでイベント登録はしないようにします.
- その上で,そのカレンダーの個人用 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 に指定してタイトルを隠す.
とまぁ,こんな感じ.本来であれば,両方向の同期を実現したいところだが,自分の利用方法としては今の仕様で十分だったので,とりあえず開発終了.
なお,このスクリプトを使用する際は,使用方法などをよく把握し,またスクリプト内で何が行われるのかを理解した上で,ご利用いただけますよう,お願い申し上げます.このスクリプトを使用して何らかの問題が生じた場合,当方は責任を負いませんので,ご了承下さい.自己責任でお願いします.
GCALDaemonを使ってみました。
Todoリストが文字化けすること以外に文句はないです。
iCalのデータはシェルスクリプトでバックアップ。cronでまわしておけばおけーなはず。「はず。」
iCalを使うと決めたら,いろいろと選択肢も多そうですね.
僕の場合は,MacでもWindowsでもMHCを使うと決めたので,
そっちに対応する方を優先する形となりました.
とは言っても,Windows環境で動くかどうか,確認はしていません:)
MHC の開発者の一人の白井と申します。
mhc2gcal 使ってみました。すばらしい!!
ちなみに、Windows (cygwin な Ruby) でも動作しましたのでご報告しておきますね。当然ですが、Linux Zaurus でも OK。
あと、強いて言うなら、今何やっているのか全然わからないので –verbose オプションつけたり、http proxy の設定(ソース埋め込みでも良いし、とか、環境変数 $http_proxy の対応)ができると、なお、良いと思われます。
白井さん:
コメントありがとうございます.
Windowsでも動作したんですね.よかったです.
–verboseオプションと,http proxy対応,ご提案ありがとうございます.
まだRubyプログラムを始めたばかりで自信ないですが,挑戦してみたいと思います.
白井です。
よろしくお願いします (__)
ちなみに、”詳細” が寂しいので、手元ではこんなの↓も入れてみました。
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 は苦手なので ^^;
連続でごめんなさい。やっぱりこの方が良さそうです。
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)
mhc2gcalがあって非常に助かりました。
職場を移ったら、そこはGoogle Calendarな世界でしたので。
白井さん:
詳細表示のコード,ありがとうございます.
自分の利用目的としては詳細は必要なかったので消してしまっていましたが,
現実的な利用シーンを考えると,必要な機能でしたね.
今度http_proxyなどに対応させるときに,一緒にさせていただければと思います.
# 全然作業できてなくてすみません・・・.
kuboakiさん:
コメントありがとうございます.
現状のmhc2gcalでは,たぶん「X-SC-Duration」に対応していないなど,
まだまだ機能不足なところも多いのですが,
折を見て発展させていきたいなと思っております.
mhc2gcal 0.2.0 リリース
リリースしてからすっかり放置プレイ状態の mhc2gcal ですが,ご要望いただ…