higuchi.com blog

The means justifies the ends

手段と目的が逆転しているかも [Cybozu2ICalの改造 その2]

[PR] 本ブログの商品紹介リンクには広告が含まれています

先日のCybozu2ICalのパッチを大満足で使っていたのですが、サイボウズで「毎月第○週の×曜日」と、月の第何週かだけ繰り返すように指定したスケジュールがiCalendarファイルに現れてこないことに気がつきました。
定例の取締役会など、こういうルールで行われる月例の会議が結構多いので、これはちょっと困っちゃう。
しかたがないので、Cybozu2ICalをさらに改造。 まず、lib/WWW/CybozuOffice6ディレクトリの中にあるCalendar.pmの217行目あたり。
return unless $freq && exists $FREQUENCY{$freq};

$this->{frequency} = $FREQUENCY{$freq};
$this->{frequency_value} = $param{freq_value} || 0;
という部分を
return unless $freq && (exists $FREQUENCY{$freq} || $freq =~ /^[1-5]$/);

if ($freq =~ /^[1-5]$/) {
$this->{frequency} = 'MONTHLY';
my @week_str = ('SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA');
$this->{frequency_value} = $freq . $week_str[$param{freq_value}];
} else {
$this->{frequency} = $FREQUENCY{$freq};
$this->{frequency_value} = $param{freq_value} || 0;
}
に変更。これは、月の第何週の何曜日という指定形式もちゃんと変換するようにする変更。

そして、cybozu2icalの本体の84行目あたり、
my %rrules = $freq ne 'WEEKDAYS' ?
( FREQ => $freq, WKST => 'SU' ) :
( FREQ => 'WEEKLY', WKST => 'SU', BYDAY => 'MO,TU,WE,TH,FR' );
$rrules{UNTIL} = to_icaldate($item->until, $item->is_full_day)
if $item->until;
$args{rrule} = join ';', map { $_ . '=' . $rrules{$_} } keys %rrules;
という部分を、
my @rrules = $freq ne 'WEEKDAYS' ?
("FREQ=$freq") :
('FREQ=WEEKLY', 'BYDAY=MO,TU,WE,TH,FR');

if($item->frequency_value =~ /^\d(SU|MO|TU|WE|TH|FR|SA)$/) {
push @rrules, 'BYDAY=' . $item->frequency_value;
push @rrules, 'INTERVAL=1';
}
push @rrules, 'UNTIL=' . to_icaldate($item->until, $item->is_full_day)
if $item->until;
$args{rrule} = join ';', @rrules;
と、大胆に変更。これは、先日の改造でもちょっとひっかかった、RRULEの中の指定順序によってiCalがうまく読み込んでくれないのを回避するための変更。これによって、かならずFREQ=xxxから始まって、UNTIL=xxxxで終わるようになります(ハッシュテーブルだと順番がどうなるか分からないんだよね)。

だんだん汚くなってきたけど(苦笑)動きます。よしとしよう。Quick Hackとはそーゆーものだ(開き直り)。
Nokia N73 (Softbank 705NK)ともBluetooth経由のiSyncで一発同期できるし。便利です。

コメント

(o)さんのコメント:

うちのサイボウズでは「毎月第○週の×曜日」みたいな入力はできないのでデバッグできないのですが、樋口さんのhackを組み込んでみたつもりです。

http://code.as-is.net/publi...
2007/10/16 01:38

樋口 理さんのコメント:

うわ、ご本尊!
ありがとうございます。
早速、動作確認してみます。
2007/10/16 07:50

コメントを書く

関連するかもしれない記事

これは Web のほんやくコンニャクになるかもしれない

これは Web のほんやくコンニャクになるかもしれない

Google の機械翻訳サービス「Google 翻訳」が飛躍的に進化して、一部のみなさんがざわついています...

この記事を読む »

iPod Touch

Quick Hack [サイボウズのスケジュールをiPod touchに同期させてみた]

私が活動の拠点にしている会社では、スケジュール管理にサイボウズ Office 6を使っています。 実は、...

この記事を読む »