Cybozu Office 6のカレンダーをGoogle Calendarで表示する
ちょっとコードを書いてみたら、Cybozu Office 6のカレンダーをGoogle Calendarで表示させることができたのでご報告。
Google Calendar - Ogawa::Memorandaの後半でも述べたように、Google Calendarでは、Web上に公開してあるiCalファイルのURLをOther Calendarsに登録することで、任意のiCalファイルをインポート&表示できる。
したがって、Cybozu Office 6の外部連携用のインタフェースを(リバースエンジニアリングして)叩くか、scrapingするかしてスケジュール情報を取得し、それをiCal形式で出力してWebから参照できるようにしておきさえすれば、Google Calendarと連携できる。もちろんread-onlyだけど。
Cybozuカレンダーをscrapingするスクリプトは以下を参照。
Cybozu2ICal.ja JP - Ogawa Code
開発版をsubversionで取得するには、コマンドラインから以下のように実行する。
$ svn co http://code.as-is.net/svn/public/cybozu2ical/trunk cybozu2ical
config.yamlにCybozu Office 6のURL、ログインユーザ名、パスワードを設定した上で、以下のようにコマンドラインから実行すれば、リモートにあるCybozu Office 6の公開状態のスケジュールアイテムがiCal形式で保存される。
$ ./cybozu2ical > cybozu.icsあるいは
$ ./cybozu2ical --conf /path/to/config.yaml > cybozu.ics
こうして生成されたiCalファイルをWeb reachableなディレクトリに置こう。念のために予測されにくいファイル名にしておくことを勧める。
さて、Google Calendarでは以下の操作でこのURLをカレンダーに登録することができる。
- まず、左側のカレンダーリストのOther Calendarsの横の「+」をクリックする。
- 「Add Other Calendar」という画面が表示されるので、「Public Calendar Address」というタブをクリックする。
- 「Public Calendar Address」を入力するフィールドが表示されるので、iCalファイルのURLを入力して「Add」をクリックする。「Allow others to find this public calendar via Google Calendar search?」にチェックを入れておくとこのカレンダーが他のユーザの検索対象に加えられてしまうので要注意。
- しばらく待つと(結構時間がかかる場合もある)、追加したカレンダーの情報が左側のカレンダーリストやカレンダー本体に表示されるはず。
以上で設定は終了。あとは、cronなどでcybozu2icalを定期的に実行するようにしておけば、Google Calendarが定期的にクロールして同期を取ってくれる。ちなみにクローラのUserAgentは、「Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)」。
追記: 定期的にクロールするというのは勘違いだった。Troubleshootingのスレでも話題になっていた。追加時に一回だけクロールするというのは明らかにおかしな仕様なので中の人の対応を期待している。
Google グループ : Users - Troubleshooting
2005-04-26追記: 昨日の昼過ぎから3時間ごとにクロールされるようになっていた。テスト用に登録して動作確認後削除したicsファイルもクロールしに来ていてにんとも。
さて、奥一穂さんのWWW-CybozuOffice6というPerl Moduleがある。今のところ新着情報しかフェッチできないため、このエントリーの目的には役に立たないのだが、cybozu2ical.plの作成上大いに参考にさせていただいた。
Kazuho@Cybozu Labs: サイボウズ Office に Perl でアクセス
このモジュールは放置されているような気もするけど…、この機会に機能が充実するとよいなあ。
このエントリーのトラックバックURL: http://as-is.net/mt/mt-tb.cgi/391
便利なhack、ありがとうございます。
4/18に試してみたら、日本語(utf8)を含むiCalデータがうまくインポート・Public Calendar Address登録できない感じでしたが、本日試したら日本語もうまくインポートできました。(google側で修正されたのでしょうか。)
現状、サイボウズ側で「繰り返し予定」として入力したものがgoogle側で「バナー予定」として登録されてしまっている問題があります。google側でもうまく「Repeats」として登録できればよいのですが。
ゴールデンウィークにでもソースを眺めてみたいと思います。
recurrenceのあるデータですね。私があまり使わない機能なので失念していました。iCalendar形式でも表現できると思うので時間があれば対応したいと思います。
かなり欲しかったスクリプトでした。今後がんがん活用させていただきたいと思います。
2点ほど気になる点がありましたので報告させていただきます。
iCalで使用しようしましたがインポート出来ませんでした。
VERSIONでソフトのバージョンを出力していますがiCalendarファイルのバージョンである"2.0"にしないと読み込んでくれないようです。
もう1点はutaaniさんも指摘されていますが繰り返し予定があるとDateTimeを利用するdt2icalの中でエラーになります。
65行目あたりにnext if $fields[2];をいれてみました。
ご指摘ありがとうございます。0.04で対応してみました。
はじめまして。サイボウズから簡単にアウトプットできるので、とても感激しています。
1つ修正できたらうれしい箇所がありましたので、報告させていただきます。
SUMMARY(予定)、DESCRIPTION(メモ)の文字列が長い場合、途中で改行されてしまいます。$fields[13]でcsvをカットする部分では、まだ改行は入っていないようです。
あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやいゆえよらりるれろわゐうゑを
↓
DESCRIPTION:あいうえおかきくけこさしすせそたちつてとな
_にぬねのはひふへほまみむめもやいゆえよらりるれろ
_ゐうゑを
('_'の部分は半角スペースです)
ご指摘ありがとうございます。
iCalendarの仕様で75 octetを超える行はfoldせよと書かれています。このため、Data::ICalの内部でfoldingを行い、iCalendar形式を扱うスケジューラソフトウェアがfoldingされた行を連結するというのがお約束です。ちょうど電子メールのヘッダも同様にfoldされますが、それを連結するのはメーラの責任で行うのと同じことですね。
とは言え、まったく連結しないスケジューラや、途中でぶった切られたUTF-8文字が正しく連結できないスケジューラが存在するのであれば、何らかの対処は必要かもしれません。
iCalendarの仕様とのこと、ありがとうございます。
アウトプットをGoogleCalendarにaddすると、その部分が文字化けしたものですから、気になって投稿してしまいました。勉強不足、申し訳ありませんでした。
私の方のperl環境もチェックしてみたいと思います。
開発版では、decode_utf8, encode_utf8を使ってUTF-8文字の途中でぶった切られないようにしてみました。ただし、行の長さが75 octetではなく75文字でfoldされるため、iCalendarの仕様的にはvalidではなくなっています。
http://code.as-is.net/public/changeset?new=cybozu2ical%2Ftrunk%2Fcybozu2ical%40318&old=cybozu2ical%2Ftrunk%2Fcybozu2ical%40316
はじめまして。サイボウズから簡単に取り込めるので、とても便利に使わせてもらっています。
相変わらずの文字化けの件は、一時大丈夫な時期もあったようですし、そのうち google 側で対処されるのを期待していますが、ひとつ、ちょっと悩んでしまったことがあるのでご報告です。
サイボウズで、開始時刻だけで終了時刻を登録していないスケジュールデータが、google calendar に取り込まれないようです。ics を覗いてみると、DTSTART: が年月日のみでなく時刻まで入っていて、かつ DTEND: が DTSTART: の翌日(年月日のみで時刻なし)になっていると無視されてしまうようです。
サイボウズで終了時刻を省略すると、1時間の6分の1目盛(=10分)使って表示されるようなので、下記のように変更してみたところ、うまく google calendar に取り込まれるようになりました。
--- cybozu2ical.org 2006-04-21 16:10:01.000000000 +0900 +++ cybozu2ical 2006-05-22 13:15:33.000000000 +0900 @@ -71,9 +71,11 @@ my $dt = cydate2dt($fields[3], $fields[5], $tz); my $dtstart = ($fields[5] !~ /^:$/) ? dt2ical($dt) : $dt->ymd(''); + my $dt0 = $dt; $dt = cydate2dt($fields[4], $fields[6], $tz); my $dtend = ($fields[6] !~ /^:$/) ? - dt2ical($dt) : $dt->add(days => 1)->ymd(''); + dt2ical($dt) : dt2ical($dt0->add(minutes => 10)); +# dt2ical($dt) : $dt->add(days => 1)->ymd(''); $vevent->add_properties(dtstart => $dtstart, dtend => $dtend); }ご指摘ありがとうございます。たしか随分前に試したときには、Google Calendarに取り込まれているけれどカレンダー上には表示されない現象が見られたと記憶しています。
さて、chifumiさんのパッチをそのまま当てると、こんどは終日イベントがちゃんとハンドルできなくなります。試してみていませんが、
の部分は下のようにする必要があると思います。
($fields[5] =~ /^:$/ ? $dt->add(days => 1)->ymd('') : dt2ical($dt0->add(minutes => 10)))あ、そうですね、確かに終日イベントが抜けてしまっていました。
ご指摘のように修正したところ、どちらも表示されるようになったのが確認できました。
いじるついでに(?)、文字化けの件、ひょっとして。。。と思って 「use URI::Escape;」
「$fields[12] = uri_escape($fields[12]);」「$fields[13] = uri_escape($fields[13]);」を
追加して URLエンコードしてみたのですが、ダメでした。 (;^_^A
えーと、
svn co http://code.as-is.net/svn/public/cybozu2ical/trunk cybozu2ical
するとゲットできる開発版でも文字化けしますか?
ダメならquoted-printableにするのがよいのかもしれません。仕様的にOKかどうか確認する必要がありますけど。
開発版の文字化け対応というのは、長い行対策だし、その対策を行なった4月時点ではだいたい文字化けなく見えていたらしいということで、現在の「アスキー文字のみ見えて日本語部分はすべて ? にしか見えない」という状況(ググると5月初めあたりからの現象らしいですね)とは違うしなぁ、と思いながらも、一応試してみました。
結果、やはりダメでした。相変わらず ? だらけでした。
quoted-printable ですが、開発版をもとに「use MIME::QuotedPrint;」を追加して print 文を
「print MIME::QuotedPrint::encode_qp(Encode::encode_utf8($vcalendar->as_string));」としてみましたが、今度は何と、google calendar が更新されなくなってしまいました。サイボウズでイベント追加し、ics にも更新され、apache の access_log を覗いても googlebot から正常に読まれているのに、calendar は相変わらず ? だらけだし追加したイベントは表れて来ません。
開発版への変更でなく、「print MIME::QuotedPrint::encode_qp($vcalendar->as_string);」としてみても同じです。
ふと http://www.digitalistblog.com/060414194402.html に、ics でなく csv ですが、数値文字参照によってエンコードしたらうまくいった、というのをみつけ、$fields[12] $fields[13] を
「$str = "" . join("",grep($_=ord, split(//, $str))) if $str;」といったフィルタで変換してみましたが、これは URLエンコードと同様に、変換した(デコードされない)文字列がそのまま表示されるだけでした。
という具合で行き詰まってしまい、開発版(+終了時刻省略dtend対応)に戻して、google 側の対応期待状態です。
済みません、ちょっと勘違いしていて、数値文字参照のフィルタがダメダメでした。直して確認中です。
数値文字参照の変換ルーチンを
http://oshiete1.goo.ne.jp/kotaeru.php3?q=975225
からもらって来て encode_cr という名前にして、print 文を
print encode_cr(Encode::encode_utf8($vcalendar->as_string));
としたところ、うまく日本語が文字化けせずに表示できました。
--- cybozu2ical.org 2006-05-24 15:12:42.000000000 +0900 +++ cybozu2ical 2006-05-26 21:51:54.000000000 +0900 @@ -111,7 +114,8 @@ $vcalendar->add_entry($vtimezone); -print Encode::encode_utf8($vcalendar->as_string); +#print Encode::encode_utf8($vcalendar->as_string); +print encode_cr(Encode::encode_utf8($vcalendar->as_string)); sub cydate2dt { my($date, $time, $tz) = @_; @@ -131,6 +135,26 @@ $dt->ymd('') . 'T' . $dt->hms('') . ($dt->time_zone->is_utc ? 'Z' : ''); } +# http://oshiete1.goo.ne.jp/kotaeru.php3?q=975225 +sub encode_cr { + my($inline) = @_; + my(@chars) = (); + my($char, $unival, $outline) = ""; + (@chars) = ($inline =~ m/([\x01-\x7f]|[\xc0-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf][\x80-\xbf])/xg); + foreach $char (@chars) { + if(length($char) == 1){ + $outline .= $char; + }elsif(length($char) == 2){ + $unival = (vec($char, 0, 8) & 0x1f) * 0x40 + (vec($char, 1, 8) & 0x3f); + $outline .= "$unival;"; + }elsif(length($char) == 3){ + $unival = (vec($char, 0, 8) & 0x0f) * 0x1000 + (vec($char, 1, 8) & 0x3f) * 0x40 + (vec($char, 2, 8) & 0x3f); + $outline .= "$unival;"; + } + } + return $outline; +} + 1; =head1 NAMEどうせPerl 5.8.1以降が必須なので以下のように書くこともできます。
print encode_ncr($vcalendar->as_string); sub encode_ncr { my $text = shift; $text =~ s/(\P{ASCII})/sprintf("&#%d;", ord($1))/eg; $text; }最近、Google Calendarで遊んでいなかったので気が付いていなかったのですが、私のカレンダーは、utf-8でも数値文字参照でも「Warning: did not successfully merge all events.」というメッセージが出て、読み込まれなくなってしまいました。件数が多いのか、brokenなのか。Google Calendarの完成度が上がらないうちに深追いしてもしかたがないのですけど。
あと、非ASCII文字を数値文字参照に変換しておけば読み込めるというのは、iCalendarの仕様的にかなり嫌な感じです。iCalendarでは「;」は「\;」にエスケープすることになっているんですよね。
私も数値文字参照は、反則技、最後の手段、google 側で対応してくれるまでの暫定手段かな、という気はします。
RedHat EL 3 だと perl 5.8.1 だからなのかもしれませんが、
たとえば「あいうabc」を Comments 13 15 16 の数値文字変換ルーチンで変換するとそれぞれ
13 … ¤¢¤¤¤¦abc
15 … あいうabc
16 … ¤¢¤¤¤¦abc
になり、google calendar で文字化けしないのは 15 のみです。
もちろん、16で示したコードは、引数がPerlの内部Unicode表現になっている必要があります。例えば、以下の開発版のように利用するとうまく機能すると思います。
http://code.as-is.net/svn/public/cybozu2ical/trunk/cybozu2ical
もしこれで駄目なんだとすると(他のモジュール内で勝手にUTF-8などに再エンコードされてしまっているのでしょう)、
encode_ncr(Encode::decode_utf8($vcalendar->as_string));
とかすれば機能するはずです。
引数の条件が合っていなかっただけですね。
ご報告が遅れましたが、開発版の revision 39 は、そのまま(DTEND 問題も変更済み) $ENCODE_NCR=0 を 1 に変更するだけで数値文字参照で出力されて、google calendar で文字化けせず快調に使えています。0 のまま utf-8 で出力したものを取り込むと化けてしまうのは相変わらずですが。
それから、メールサーバ管理者に指摘されて気付いたのですが、cybozu2ical を動かすたびに、(サイボウズの設定で「新着メールチェックをする」にはしていないのに)サイボウズから新着メールチェックが行なわれるようですが、そういうものなのでしょうか?
最後の件については正直なところよく分かりません。私はCybozuの外部APIドキュメントを持っているわけでもなんでもなくて、リバースエンジニアリングしてみてたまたまうまくいっているだけなので。
メールチェックを抑制したり、取得するスケジュール情報を指定日以降の分だけにしたりできた方がツールとしての完成度は高まりますが、このあたりは今後の課題ですね。
ふと気がついたら、いつの間にか、イベント終了時刻がサイボウズの記述を無視して
すべて開始時刻+1時間後になっています! 5月末にはサイボウズに書いた通りになっていたのに。
Google calendar で入力したのを export したものと比較してみて、DTSTART: と DTEND: を
DTSTART;TZID=Asia/Tokyo: (時間範囲指定の場合) か
DTSTART;VALUE=DATE: (日付範囲指定の場合) か
に変更すると、昔のように期待どおりサイボウズで入力した値が生かされるようです。
残念ながら cybozu2ical のどこをどういじればそのようにできるのかわからなかったので、
perl -pi -e 's/^(DTSTART|DTEND):(.*T.*)/\1;TZID=Asia\/Tokyo:\2/; s/^(DTSTART|DTEND):([^T]*)/\1;VALUE=DATE:\2/;'
というフィルタを cybozu2ical の後に追加して凌いでいます。
7月25日(火)午前中に、google 側で2点変化があったようです。
1. utf-8 がそのまま表示されるようになったが、かわりに(?)数値文字参照はそのまま日本語変換されずにコードのまま表示されるようになってしまった。(今朝まできれいに日本語表示できていた http://weather.livedoor.com/forecast/ical-charref/13/63.ics がダメになって、かわりに http://weather.livedoor.com/forecast/ical/13/63.ics が使えるようになったりしています。)
2. timezone を正しく認識させるために
などと指定してやらないといけなくなった。ということで、$ENCODE_NCR=0 のまま動かし、cybozu2ical 後のフィルタを
としています。7月25日(火)午前中に、google 側で2点変化があったようです。
1. utf-8 がそのまま表示されるようになったが、かわりに(?)数値文字参照はそのまま日本語変換されずにコードのまま表示されるようになってしまった。(今朝まできれいに日本語表示できていた http://weather.livedoor.com/forecast/ical-charref/13/63.ics がダメになって、かわりに http://weather.livedoor.com/forecast/ical/13/63.ics が使えるようになったりしています。)
2. timezone を正しく認識させるために
などと指定してやらないといけなくなった。ということで、$ENCODE_NCR=0 のまま動かし、cybozu2ical 後のフィルタを
としています。ありがとうございます。trunk版を更新してみました。
うまく行くようであれば0.5としてリリースしようと思います。
開発版 revision 48 で、output_encoding: utf8 で何もフィルタ使わず、快調に使えています。ありがとうございます。
で今ごろ何ですが、約4ヶ月先くらいまでのスケジュールしか取れないのですね! (期間でなく数かもしれませんけれど) 来年の予定入れてみてうまくいくかな? と試したらいつまで経っても反映されずに焦ってしまいました。(;^_^A
サイボウズのログイン設定がプルダウン選択式になってる場合にも対応して頂けるとありがたいです.
奥一穂さんのコードに対するパッチは以下で発見しました.
http://d.hatena.ne.jp/boxphere/20060825/1156498432
0.06でサポートしてみました。
私の環境では確認できないので、動作確認よろ
>>27
ありがとうございます.うまく動きました.
プルダウンで選択できる予定の先頭部分(http://office.cybozu.co.jp/cb6/manual/system/schedule/system_schedule0401.html)が反映されない(空白の予定ができて気付いた)ようですが,これは仕様でしょうか.
さあ分かりませんね。
Cybozu Office 6のインタフェースを叩いたときにどういうものが得られる「仕様」になっているのか自体、私には分からないわけですから。
はじめまして。いつも便利に使わせて頂いてます。
mkishiさん?mkshiさん?のおっしゃるプルダウンメニューの件について気がついた事を報告させて頂きます。
プルダウンの内容はcybozuが吐くCSVデータ内の一般予定の一つ前に書き込まれているようです。言葉でうまく説明できないのでコードを載せておきます。
以下の場合では、「直接書き込む予定」欄には何も書き込まず「プルダウンメニューの予定」を選択した場合のみ「プルダウンの予定」を出力するようにしています。少なくとも空白の予定は出来なくなると思います。
--- cybozu2ical (リビジョン 57) +++ cybozu2ical (作業コピー) @@ -93,8 +93,8 @@ my $created = dt2ical(DateTime->from_epoch(epoch => $epoch)); $vevent->add_properties( - summary => decode_utf8($fields[12] || ''), - description => decode_utf8($fields[13] || $fields[12] || ''), + summary => decode_utf8($fields[12] || $fields[11] || ''), + description => decode_utf8($fields[13] || $fields[12] || $fields[11] || ''), dtstamp => $dtstamp, created => $created );「プルダウンの予定」も「直接書き込む予定」も両方書かれている時は、
『プルダウン:直接』のように両方反映させるべきなんでしょうけど・・・
perlはよく分かりません^^;
情報ありがとうございました。0.07でサポートしてみました。多分期待したような動作をすると思います。
プルダウンの予定も、直接書き込む予定も反映されるのを確認しました。
一段と便利になりました。ありがとうございます。
ほとんどPerlを知らない身にも関わらず、かなり便利なので、つかわせていただいておりました。
が・・・セキュリティ強化(ログイン画面が検索エンジンに引っかかる)対策で、通常のログインID,PASS以外にBasic認証をかけられてしまいました。(最近そういうところ多いみたいですが)
これに対応していただくことって可能でしょうか?
ちなみ自分でやろうとしたところ、エラー大量に出て失敗におわりました。。(泣)
やろうと思えばすぐできますが、非標準的な環境なので対応する予定はありません。下記URLを参照して自分でやってみてください。
http://www.google.com/search?hl=ja&q=LWP+BASIC%E8%AA%8D%E8%A8%BC
返答ありがとうございます。
おっしゃるとおり非標準な環境ですね。。
Calendar.pmに LWP::UserAgentのauthorization_basicつかうんだろうというところまでは行き着いていたのですが、
如何せんうまく行かず。
もう少し、自力であれこれやってみようかとおもいますが、
my $res = $this->_request();
前後にいただいたURLのような形でbasic認証の処理を入れる
という考え方はそもそも認識として間違ってますでしょうか?
authorization_basicなんてmethod知らないとエラーで言われまして。
お忙しいところすみません。。
sub _requestの$this->{ua}->postの前に$this->{ua}->credentialsを入れればよいと思います。また、そういう変更をせずに単にconfig.yamlのcybozu_urlで
cybozu_url: http://username:password@www.example.com/cbag/ag.cgi
とか指定するだけでうまくいくかもしれません。
返答ありがとうございます!
credentialsでうまく行きました!おっしゃるようにURLに書き込む方法でもうまく行くかもしれませんね。その方法あるの忘れてました。
また、実際に久しぶりに取り込んでみたところ、繰り返しスケジュールで、上手く取り込めない箇所があったりしました。
サイボウズ、過去を基点にして繰り返しスケジュールを入力できないので、何とも類推でしか確かめられてないのですが、
本来、サイボウズ上で今年の年明けから
・毎週火曜日、10:00~20:00、期限無し
というように設定していたものが、取り込むと10:00~11:00というように強制的に1時間になってしまうようです。
週にこの手のスケジュールが複数あるのですが、全部1時間になってました。(設定した時期もバラバラなので過去に繰り返し設定をしたものがアウト?)
設定しなおして、今日を基点にしたら直ったのですが。特に他にそうなる条件は無いようです。
また、取り込めるのか、通信インターフェイスがわからないですが、個人的には、
google上のメモ欄にサイボウズ上の
・参加者
・設備
も入れられるとうれしかったりしますね。。(^^;
それがなくとも、便利な生活がもどってきたので、大変助かります!
前者の問題に関しては分かりません。開発版に--debugオプションを追加しておきました。このオプションを指定すると、サイボウズから取得した情報をデバッグ情報として含めたiCalendarファイルを生成します。
http://code.as-is.net/public/changeset/363
このバージョンを使って問題があるVEVENTエントリーを見せてもらえれば判断できるかもしれません。
後者に関しては不可能です。サイボウズから取得できる情報に施設などの情報は含まれません。
繰り返し予定の終了時間が正しく表示されません。
必ず1時間で表示されるようです。
生成された ics ファイルを見ると、終了時間の日付が開始時間の日付よりも前になっています。これが問題かも。
使っているcybozu2icalのバージョンと、繰り返し予定のスペックを書いてください。
cybozu2ical-0.12.zip を使っています.
出力されたicsから抜き出すと,
----表示がおかしい↓---------
BEGIN:VEVENT
CREATED:20070610T074335Z
DESCRIPTION:予定1
DTEND;TZID=Asia/Tokyo:20070417T121000
DTSTAMP:20070612T153112Z
DTSTART;TZID=Asia/Tokyo:20070508T104000
RRULE:WKST=SU;UNTIL=20070723T031000Z;FREQ=WEEKLY
SUMMARY:予定1
END:VEVENT
----表示が正しい↓---------
CREATED:20070612T153555Z
DESCRIPTION:お試し
DTEND;TZID=Asia/Tokyo:20070613T184000
DTSTAMP:20070612T153603Z
DTSTART;TZID=Asia/Tokyo:20070613T170000
RRULE:WKST=SU;UNTIL=20070913T094000Z;FREQ=WEEKLY
SUMMARY:お試し
END:VEVENT
--------------------------------------------
どうも正しく表示されない方は,cybozeで繰り返し予定を入力した後に途中の予定を削除(休日などのため,その日だけ削除)したもののようです.
cybozuで繰り返し予定を入れてその途中の予定を削除した場合、現状のcybozu2icalの仕様では「削除が無視」されると思います。つまり、iCalendarのデータ上はそのまま表示されるはずです。
ですのでTakumi.Kさんの繰り返しイベントはそうやって作られたわけではないみたいです。
可能であれば、http://code.as-is.net/svn/public/cybozu2ical/trunk/ に置いてあるバージョンを使って、--debugオプション付きで実行してみてください。
> COMMENT:134946\,ts.1181674027\,2007/6/9\,2007/6/9\,2007/9/9\,23:0\,24:0\,w\
> ,6\,\,\,""\,"test"\,""\,2007/6/16\,2007/6/23
みたいな行が表示されますから差し支えない範囲で教えてください。Cybozuのデータ自体に問題があったらちょっと如何ともし難いところですが。
(1)よくわからずやってみましたが,
Can't call method "summary" on unblessed reference at ./cyboze2ical line 42.
といわれました.
(2)Cybozeに仮の予定を入れて再現してみました.
予定の時間が正しく表示されないのは,繰り返し予定の*途中*の予定をcyboze上で削除したものではなく,繰り返し予定の1回目の予定を削除した場合でした.
(1)はlib以下を更新していないせいですね。
今回仮に入れてみた繰り返し予定の部分です.
BEGIN:VEVENT
COMMENT:31336\,ts.1181706935\,2007/6/20\,2007/6/13\,2007/9/13\,17:0\,18:40\
,w\,3\,\,\,""\,"お試しIII"\,""\,2007/6/27\,2007/6/13
CREATED:20070613T035535Z
DESCRIPTION:お試しIII
DTEND;TZID=Asia/Tokyo:20070613T184000
DTSTAMP:20070613T132349Z
DTSTART;TZID=Asia/Tokyo:20070620T170000
RRULE:WKST=SU;UNTIL=20070913T094000Z;FREQ=WEEKLY
SUMMARY:お試しIII
UID:20070613T035535Z-31336@domain.name
END:VEVENT
UID:行はよけいでした.削除できませんでしょうか.
下記のようにDTENDの日付を,DTSTARTの日付に強制的に変更したらちゃんと表示されるようになりました.
こんなことしていいのだろうか?
-----------------------------------
#! /bin/gawk -f
{
if( $0 ~ /^DTEND/){
dtend = $0 # この行はたぶんDTEND
# print dtend
getline dtstamp # この行はたぶんDTSTAMP
if( dtstamp !~ /^DTSTAMP/)
printf stderr, "Error:This line might be DTSTAMP:", dtstamp;
# print dtstamp
getline dtstart # この行はたぶんDTSTART
if( dtstart !~ /^DTSTART/)
printf stderr, "Error:This line might be DTSTART:", dtstart;
# print dtstart
if( dtstart !~ /DTSTART;VALUE=DATE/){
split( dtstart, sa, ":")
split( dtend, ea, ":")
split( sa[2], sd, "T")
split( ea[2], ed, "T")
if( ed[1] != sd[1]){
dtend = ea[1] ":" sd[1] "T" ed[2]
# print dtstart
# print dtend
}
}
print dtend
print dtstamp
print dtstart
}
else
print $0;
}
0.13ではこのあたりをケアしたつもりですが、問題があればご連絡ダサい。
使ってみました.
--debug オブションをつけた出力結果の一部です.
この予定は5月7日にはじめて登録された無期限の繰り返し予定で,毎週金曜日(5/11が初日)の予定です.
サイボウズ上では6/1,6/8の予定が削除されています.
これがgoogleカレンダでは月曜日に表示されるので,見てみると下記のように,スタート日付が登録日になっているため,金曜日に表示されないようです.
BEGIN:VEVENT
COMMENT:30134\,ts.1181254972\,2007/5/11\,2007/5/7\,//\,10:40\,12:10\,w\,5\,
\,\,"カテゴリ"\,"予定1"\,""\,2007/6/1\,2007/6/8
CREATED:20070607T222252Z
DESCRIPTION:カテゴリ: 予定1
DTEND;TZID=Asia/Tokyo:20070507T121000
DTSTAMP:20070625T021707Z
DTSTART;TZID=Asia/Tokyo:20070507T104000
EXDATE;TZID=Asia/Tokyo:20070601T104000,20070608T104000
RRULE:WKST=SU;FREQ=WEEKLY
SUMMARY:カテゴリ: 予定1
UID:20070607T222252Z-30134@domain.name
END:VEVENT
うーん、私の環境だと、CSVの2007/5/7のところが2007/5/11と入るんですよね。バージョンによって違うのかもしれません。
lib/WWW/CybozuOffice6/Calendar.pmの84行目あたりの@fields[3,3,4]を@fields[2,2,4]に書き換えて試してみてください。
やってみました.
変わらないみたいです.
BEGIN:VEVENT
COMMENT:30134\,ts.1181254972\,2007/5/11\,2007/5/7\,//\,10:40\,12:10\,w\,5\,
\,\,"カテゴリ"\,"予定1"\,""\,2007/6/1\,2007/6/8
CREATED:20070607T222252Z
DESCRIPTION:カテゴリ: 予定1
DTEND;TZID=Asia/Tokyo:20070507T121000
DTSTAMP:20070625T070730Z
DTSTART;TZID=Asia/Tokyo:20070507T104000
EXDATE;TZID=Asia/Tokyo:20070601T104000,20070608T104000
RRULE:WKST=SU;FREQ=WEEKLY
SUMMARY:カテゴリ: 予定1
UID:20070607T222252Z-30134@domain.name
END:VEVENT
それはない。修正し損なっているはずです。
もしかしてファイルを書き直しただけではだめなんでしょうか.
ファイルの変更はできてます.
[user@host CybozuOffice6]$ diff Calendar.pm.org Calendar.pm
84c84
@param{qw(start_date end_date until_date)} = @fields[2,2,4];