2012-11-03

rubyでicalendar形式のファイルを読み込んでgoogleカレンダーに登録する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
スケジュールソフトで他のソフトと連携できるようにするためにicalendar形式でデータを出力できるものがあります。
そのファイルをgoogleカレンダーで取り込むことができます。
以下に具体的に説明があります。
http://support.google.com/calendar/bin/answer.py?hl=ja&answer=37118

これと似たようなことをrubyでやる方法です。

条件としては、以下のような感じです。
・icalendarのデータを取り込むための他のデータが入っていない専用のgoogleカレンダーが一つ必要
・取り込む際に、一定期間の登録済みデータを削除する
・単純な繰り返し予定は登録可能

sample.icsファイルを読み込む場合は以下のような感じです。
gclapi
icalendar
vpim
simple-rss
が必要ですのでgemでインストールしてください。

# -*- encoding: utf-8 -*-

require 'rubygems'
require 'date'
require 'gcalapi'
require 'icalendar'
require 'simple-rss'
require 'vpim/icalendar'

GACCOUNT = "googleアカウント"
GPASSWD  = "googleアカウントのパスワード"
GCALNAME = "データ登録するgoogleカレンダーの名前"
DEL_TERM = 31 #登録済みデータを削除する期間

service = GoogleCalendar::Service.new(GACCOUNT,GPASSWD)
g_cals = SimpleRSS.parse( service.calendars.body ).entries

gcal_link = nil
g_cals.each do |c|
  if c[:title].encode('utf-8','utf-8') == GCALNAME
    gcal_link = c[:link]
    break
  end
end

gcal = GoogleCalendar::Calendar::new(service, gcal_link)

today  = Date.today
endday = Date.today + DEL_TERM

conditions = {}
conditions['start-min'] = today
conditions['start-max'] = endday
gcal.events(conditions).each do |e|
  e.destroy!
end

f = open("sample.ics")
ics = f.read
f.close

ical = Icalendar::parse(ics,true)
ical.events.each do |ie|
  if ie.recurrence_rules?
    fs = Time.parse(ie.dtstart.to_s.sub(/\+.*/, ''))
    fe = Time.parse(ie.dtend.to_s.sub(/\+.*/, ''))
    diff = fe -fs
    Vpim::Rrule.new(fs,ie.recurrence_rules.first.orig_value).each(endday.to_time) do |time|
      ge        = gcal.create_event
      ge.title  = ie.summary
      ge.st     = time
      ge.en     = time + diff
      ge.allday = ge.st.hour == 0 and ge.st.min == 0 and ge.en.hour == 0 and ge.en.min == 0
      ge.save!
    end
  else
    ge        = gcal.create_event
    ge.title  = ie.summary.encode("utf-8") 
    ge.st     = Time.parse(ie.dtstart.to_s.sub(/\+.*/, ''))
    ge.en     = Time.parse(ie.dtend.to_s.sub(/\+.*/, ''))
    ge.allday = ge.st.hour == 0 and ge.st.min == 0 and ge.en.hour == 0 and ge.en.min == 0
    ge.save!
  end
end


GACCOUNT
GPASSWD
GCALNAME
を利用する環境にあわせて変更すれば利用できるはず。

以下のサイトを参考にさせていただきました。
https://github.com/wtnabe/ical2gcal
http://www.func09.com/wordpress/archives/168
コメントを投稿