Net::Google::Calendarモジュールが便利そうだったので、 iCalendar(.ics)のファイルを Google Calendar にアップロードするプログラムを、 Perl で書いてみた。 今までは、Java で書かれたGCalDaemonを使っていたけど、カスタマイズもしづらかった。
繰り返しイベントについては、未対応のまま。 本当は同期させたいけど、Google側のEventのIDはURL形式で、iCal と互換性がない。 だから、アップロードの度に、一旦全イベントをチマチマ消しているのが、美しくない。 かといって、iCal と Google Calendar の ID の対応表をいちいち更新するのも面倒だし。
get_eventsとdelete_entryの使い方
# Google Calendar の登録情報 $url = 'http://www.google.com/' .'calendar/feeds/XXXX%40gmail.com/' .'private-XXXXXXXXXXX/basic' ; $user = 'XXXX@gmail.com'; $pass = 'PPPPPPPP'; $calname = Jcode->new( 'NNNN' )->utf8 ; my $cal = Net::Google::Calendar->new( url => $url ); # $cal->{_ua}->env_proxy; # (2) $cal->login($user, $pass) or die $@; # (3) # 指定されたカレンダーを選ぶ my $dest_cal ; foreach my $c ( $cal->get_calendars ) { $dest_cal = $c if ( $c->title eq '<カレンダーの名前>' ) ; } if ( $dest_cal ) { # 登録されていたイベントを全部消す $cal->set_calendar( $dest_cal ) ; my $start_index = 1 ; my $max_results = 20 ; my @ev ; while( 1 ) { # 指定件数しかイベントを返さないので少しづつ消す @ev = $cal->get_events( start-index => $start_index , max-results => $max_results ) ; last if ( @ev == 0 ) ; foreach my $e ( @ev ) { $cal->delete_entry( $e ) ; } $start_index += @ev ; } }