スケジュールの標準フォーマットである iCalendar を利用して、スケジュール データを様々なアプリケーション間で連携・活用できます。例えば、Web アプリケーションなどがわざわざ自前でカレンダー機能を実装提供せずとも、iCalendar を出力できるようにさえしておけば、Google Calendar や Microsoft Outlook、Mozilla Thunderbird など、iCalendar を読込める既存のクライアントを自由に選択して使ってもらえるので、ユーザにとってもメリットが大きいです。今回、Perl で組んだ Web アプリケーションにおいて iCalendar を生成する機会があったので、その覚書き。
ドキュメントにあるサンプルとほとんど同じですが、掲載しないのもアレなので。Web サーバ上に CGI として動作できるようにしておき、その URL を Mozilla Thundebird や Microsoft Outlook などに登録してやれば OK。予定を一方的に吐き出すだけなので、予定の追加などはできませんが、閲覧できるだけでもかなり便利です。
use utf8;
use Data::ICal;
use Data::ICal::Entry::Event;
my $calendar = Data::ICal->new;
{
my $new_event = Data::ICal::Entry::Event->new();
$new_event->add_properties(
summary => '大事な予定',
dtstart => '2015-12-31', # 終日の予定
description => "説明文\r\n改行もできるよ\r\n改行もできるよ",
);
$calendar->add_entry( $new_event );
}
print "Content-type: text/calendar; charset=utf8\n\n";
print $calendar->as_string;
as_string で出力。text/calendar で出力します。必要であれば charset も指定すれば OK。
use utf8;
use Data::ICal;
use Data::ICal::Entry::Event;
my $calendar = Data::ICal->new;
{
my $new_event = Data::ICal::Entry::Event->new();
$new_event->add_properties(
summary => '大事な予定',
dtstart => '2015-12-31', # 終日の予定
description => "説明文\r\n改行もできるよ\r\n改行もできるよ",
);
{ ### イベントに通知を追加する
my $valarm = Data::ICal::Entry::Alarm::Display->new();
$valarm->add_properties(
description => '!通知メッセージ!',
trigger => [ dt2offset( '2015-12-31', -3 ), { value => 'DATE-TIME' } ],
);
$new_event->add_entry( $valarm );
}
$calendar->add_entry( $new_event );
}
print "Content-type: text/calendar; charset=utf8\n\n";
print $calendar->as_string;
sub dt2offset { ... }
生成された iCalendar 形式のデータが RFC [5545][2446] の仕様通りであるか validation できる Web サービスがあります。実際、Mozilla Thunderbird の Lightning アドオンや Microsoft Outlook では取り込めても、Google Calendar で取り込めない、といった現象に遭遇したことがあります。