Subscribed unsubscribe Subscribe Subscribe

ダメ人間オンライン

あまり信用しないほうがいい技術メモとか備忘録とかその他雑記

Cybozu2ICalを使ってGoogleカレンダーとサイボウズのスケジュールを同期

技術関連

なにやらサイボウズのスケジュールとGoogleカレンダーを同期するという記事をみかけたのでやってみた。

手元にはAndroid端末(HT-03A)があるのでここからもスケジュール見れるようになれば便利になるなーと。

ただ、やはりスケジュールといえど社内の情報になるのでセキュリティには気をつけないといけません。

やり方によるのかもしれませんが今回の方法だとセキュリティ面では不安なので一回やってみたというだけです。


環境

・サイボウズ(Office6)は社内イントラネット
・社外からサイボウズにアクセスする手段としてはVPN経由でのみ可能
・社内イントラ内にアクセスできるサーバー有り(LIPのみ)
・社内から外のネットワークには出ることができる

上記のような環境なのでGoogleカレンダーにデータをインポートするにはHTTPでアクセスできる箇所にカレンダーデータを置く必要が出てきます。(自動同期の場合)

サーバーから直接Googleカレンダーにpushできるような素敵APIとかが用意されてれば問題ないのですが、IPでのアクセス制御とかを入れてない場所にデータを置くのはやっぱり怖いです。

そんな感じなのですがモノは試しってことで下記の流れでやってみました。

・Cybozu2ICalでサイボウズオフィス6のカレンダーをiCalendar形式に変換
・出来上がったファイルをHTTPアクセス可能な外部サーバーに転送
Googleカレンダーから上記ファイルを読み込むよう設定

文字化けとかで地味に引っかかったりしたのでそれも踏まえてメモ。


Cybozu2ICal

Cybozu2ICalをインストールします。

詳細はこちら。
Cybozu2ICal - ogawa - サイボウズオフィス6のカレンダーをiCalendar形式に変換するスクリプト。

インストールは特に問題なく完了

ダウンロードしたソースの中にconfig.yamlのサンプルがあるのでそれを利用

設定した項目としては

cybozu_url: サイボウズのURL
calname: カレンダーの名称
userid: サイボウズにログインする時のID
password: サイボウズにログインする時のパスワード
time_zone: Asia/Tokyo
tzname: JST
input_encoding: 入力文字コード
output_encoding: 出力文字コード

usernameではなくuseridを使用するようにしたのはなんとなくです・・・

output_encodingはデフォルトではutf8なのですがURL指定でGoogleカレンダーから読み込ませた場合はうまくやらないと文字化けしてしまいます。(後述)

utf8ではなくncrを指定してやればURL指定でも文字化けしませんが、HT-03Aから見た時おかしくなります。

手動でutf8のファイルをインポートした場合は文字化けとかはしないです。


設定したconfig.yamlを指定してcronで定期的に起動させるようにします。

起動例

% cybozu2ical --conf ファイルパス/config.yaml --compat-google-calendar > ファイルパス/ical.ics
    • confオプションでconfig.yamlを指定し、--compat-google-calendarオプションはGoogleカレンダーと互換性のあるiCalendar形式で出力させるためにつけてます。

これでデータができました。


Googleカレンダーと同期

出来上がったデータをSCPなりFTPとかでHTTPアクセス可能な場所に置いときます。

次にGoogleカレンダーを開き左のメニューの他のカレンダーを選択し、追加→URLで追加と進みます。

URL入力画面が出てくるので上で置いておいたデータのURLを入力します。

これでGoogleカレンダーにデータがインポートされ、約3時間おきに自動的にGoogleから指定URLに対してデータをとりにいきます。
(約3時間おきというのは自分では確認していませんので確かな情報ではないです。)


文字化けについて

URL指定でデータをインポートする場合、レスポンスヘッダで文字コードを指定しないと文字化けするようです。

Content-Type: text/calendar; charset=utf-8

ですので、直接icsファイルを指定するのではなく、php等でicsファイルを読み込み上記ヘッダを返すようにしたものを指定してやればうまくできます。

いけた!