検索

カレンダー

2012年5月
« 4月    
 123456
78910111213
14151617181920
21222324252627
28293031  

広告

ブログランキング・にほんブログ村へ
にほんブログ村

東電電力供給情報

カテゴリー

最近のコメント

リンク

サイボウズのスケジュールをWindows Mobile(Advanced/W-ZERO3 [es])に自動同期する

投稿者:yasu 更新日時:2008年11月21日 19時52分00秒
カテゴリcybozu2ical, iPhone/iPod touch/iPad, Mobile

仕事場のスケジュール管理としてサイボウズを使っているのですが、セキュリティの関係上、インターネットに公開しておらず仕事場からでないとスケジュールを確認できません。
サイボウズのスケジュールをcsv形式で出力して、outlookにcsvファイルを手動インポートして、Active Syncで同期してWindows Mobileのスケジュールと同期をとることはできるのですが、めんどくさいです。
できれば手動作業なしにサイボウズのスケジュールをWindows Mobile(Advanced/W-ZERO3 [es])に同期してみたいと思います。

サイボウズからWindows Mobileの予定表にスケジュールを同期させる為には

小川宏高さんの作られたcybozu2icalでサイボウズのスケジュールをiCalendar形式で出力する
出力したiCalendar形式の予定表ファイルをOutlookの予定表に取り込む
Active SyncでOutlookからWindows Mobileの予定に自動同期する

を実施していきます。

1.cybozu2ical動かすのに必要なPerlを導入します。
ActiveStateのサイトから執筆開始日現在(2008年11月12日)最新版のActivePerl-5.10.0.1004-MSWin32-x86-287188.msi をダウンロードします。

ダウンロードが完了したらインストールを開始します。
[Next >]ボタンをクリックします。

[I accept the terms in the License Agreement]にチェックをつけて、[Next >]ボタンをクリックします。

[Next >]ボタンをクリックします。

[Next >]ボタンをクリックします。

[Install]ボタンをクリックします。

インストールが開始されます。

インストールが完了したら、[Display the release notes]のチェックを外して[Finish]ボタンをクリックします。

2.cybozu2icalをダウンロードします。
ダウンロードしたzipファイルは任意の場所に解凍します。
(今回はCドライブ直下に解凍します。)

3.Perl Package Managerを使ってcybozu2icalを動かすのに必要な外部モジュールを導入します。
Cybozu2ICal.ja_JP - Ogawa::Codeにも記載されているのですが

Text::CSV_XS または Text::CSV
DateTime
LWP::UserAgent
Class::Accessor::Fast
Data::ICal
YAML または YAML::Tiny

の6モジュールを追加します。
[スタート]-[プログラム]-[ActivePerl 5.10.0 Build 1004]-[Perl Package Manager]をクリックします。
Perl Package Managerが起動したらメニューバーの[View]-[All Packages]を選択して[F5]キーをクリックします。
未導入のモジュールが表示されますので対象のモジュールを選択して右クリックし[Install ライブラリ名 バージョン]をクリックします。
なお

Text-CSV_XS
LWP::UserAgent
Class::Accessor::Fast

は初期導入済みなのでそれ以外を選択していきます。

このままではモジュールが導入されていませんので、メニューバーの[File]-[Run Marked Actions]を選択します。
導入前の確認ダイアログが表示されるので[OK]ボタンをクリックします。

これで必要な外部モジュール導入は完了しました。

4.cybozu2icalの設定ファイルを設定します。
C:cybozu2ical-0.32にあるconfig.yaml.sampleファイルを同じフォルダにコピーしてconfig.yamlに名前を変えます。
テキストエディタでconfig.yamlファイルを開きます。
設定は適時変更します。

cybozu_url
サイボウズオフィスのURLを指定します。
calname
カレンダー名を指定します。X-WR-CALNAMEヘッダを利用するiCalendarアプリでは、ここで指定した文字列がカレンダーの名前として利用されることが期待されます。
username, userid
サイボウズオフィスのユーザ名もしくはユーザIDを指定します。
password
サイボウズオフィスのパスワードを指定します。
time_zone
サイボウズオフィスのTimeZoneを指定します(例: Asia/Tokyo)。
tzname
サイボウズオフィスのTimeZoneを指定します(例: JST)。
input_encoding
サイボウズオフィスのcharsetを指定します。デフォルトは「shiftjis」。
output_encoding
出力するiCalendarファイルのcharsetを指定します。デフォルトは「utf8」。マルチバイト文字を数値文字参照で出力する場合には「ncr」を指定します。
calendar_driver
使用するカレンダードライバーを指定します。
デフォルトでは「ApiCalendar」が使われます。
現在のところ、カレンダードライバーとしてApiCalendarとSyncCalendarの
2つが使用できます。
サイボウズオフィス6を使用している場合には
SyncCalendarを指定することを強く勧めます。
それ以外の場合はデフォルトで問題ありません。
date_range (experimental)
カレンダーの日付レンジを指定します。
date_range にNを指定すると、今日のN日前からN日後までの
日付レンジのアイテムのみをサイボウズオフィスから取得して処理します。
デフォルトの date_rangeは「30」です。
この機能はカレンダードライバーとしてApiCalendarを指定している場合のみ有効です。

なお自分が変更したのは

cybozu_url: 職場のサイボウズのURL
calname: 何でもいいはず(Cybozu6とかにしました)
username: コメント化(#username)
userid: コメントを解除してユーザID(ユーザIDはスケジュールで自分の名前のリンクをクリックすると表示されます)
password: ログイン時のパスワード

です。
それ以外は変更していません。

5.cybozu2icalを実行する。
コマンドプロンプトから
perl cybozu2ical-0.32cybozu2ical --output cybozu2ical-0.32Cybozu.ics
と入力して実行すると、--outputに指定したファイル名でスケジュールが出力されます。
このスケジュールファイルはGoogle カレンダーやMacのiCal、mozillaのSunbirdなど多くの
スケジュール管理ソフトにインポート可能です。

6.出力したスケジュールファイルをOutlookに取り込むWSHを作成します。

JavaScript:
  1. // 定数宣言
  2. var olSave = 0;
  3. var olAppointmentItem = 1;
  4. var olFolderCalendar = 9;
  5.  
  6. var adTypeText = 2;
  7. var adCRLF = -1;
  8. var adReadLine = -2;
  9.  
  10. var strFileName = 'C:\cybozu2ical-0.32\Cybozu.ics';
  11.  
  12. // 変数宣言
  13. var strBuf;
  14. var intReadFlg;
  15. var strStartDate;
  16. var strStartTime;
  17. var strEndDate;
  18. var strEndTime;
  19. var strTitle;
  20. var strBody;
  21. var strBreakStartDate = '0';
  22. var strBreakStartTime = '0';
  23. var strBreakEndDate = '0';
  24. var strBreakEndTime = '0';
  25. var strBreakTitle = '0';
  26. var strBreakBody = '0';
  27.  
  28. // Outlook用オブジェクト
  29. var objOl = new ActiveXObject('Outlook.Application');
  30. var objNs = objOl.GetNamespace('MAPI');
  31. var objFd = objNs.GetDefaultFolder(olFolderCalendar);
  32. var objItems = objFd.Items;
  33. var objAppo;
  34.  
  35. // システム日付以降の予定表を削除
  36. try {
  37.     var i = 1;
  38.     while (objItems.Count>= i) {
  39.         objAppointment = objItems(i);
  40.         if (getYYYYMMDD(String(objItems(i).Start)) <getYYYYMMDD()) {
  41.             i++;
  42.         } else {
  43.             objItems(i).Delete();
  44.             objItems = objFd.Items;
  45.             i = 1;
  46.         }
  47.     }
  48.  
  49.     intReadFlg = 9;
  50.  
  51.     var objStream = OpeniCalFile(strFileName);
  52.  
  53.     do {
  54.         strBuf = objStream.ReadText(adReadLine);
  55.  
  56.         if (strBuf == 'BEGIN:VEVENT') {
  57.             intReadFlg = 1;
  58.         } else if (strBuf == 'END:VEVENT') {
  59.             intReadFlg = 0;
  60.         } else if (strBuf == 'BEGIN:VTIMEZONE') {
  61.             intReadFlg = 9;
  62.         }
  63.  
  64.         if (intReadFlg == 1) {
  65.             // 予定開始日
  66.             if (strBuf.indexOf('DTSTART;TZID=Asia/Tokyo', 0)>= 0) {
  67.                 strStartDate = strBuf.substring(strBuf.indexOf(':', 0) + 1, strBuf.indexOf('T', strBuf.indexOf(':', 0) + 1));
  68.                 strStartTime = strBuf.substring(strBuf.indexOf('T', strBuf.indexOf(':', 0)) + 1);
  69.             } else if (strBuf.indexOf('DTSTART;VALUE=DATE', 0)>= 0) {
  70.                 strStartDate = strBuf.substring(strBuf.indexOf(':', 0) + 1);
  71.             }
  72.             // 予定終了日
  73.             if (strBuf.indexOf('DTEND;TZID=Asia/Tokyo', 0)>= 0) {
  74.                 strEndDate = strBuf.substring(strBuf.indexOf(':', 0) + 1, strBuf.indexOf('T';, strBuf.indexOf(':', 0) + 1));
  75.                 strEndTime = strBuf.substring(strBuf.indexOf('T', strBuf.indexOf(':', 0)) + 1);
  76.             } else if (strBuf.indexOf('DTEND;VALUE=DATE', 0)>= 0) {
  77.                 strEndDate = strBuf.substring(strBuf.indexOf(':', 0) + 1);
  78.             }
  79.             // タイトル
  80.             if (strBuf.indexOf('SUMMARY:', 0)>= 0) {
  81.                 strTitle = strBuf.substring(strBuf.indexOf(':', 0) + 1);
  82.             }
  83.             // 内容
  84.             if (strBuf.indexOf('DESCRIPTION:', 0)>= 0) {
  85.                 strBody = strBuf.substring(strBuf.indexOf(':', 0) + 1);
  86.             }
  87.         } else if (intReadFlg == 0) {
  88.             if (strStartDate>= getYYYYMMDD()) {
  89.                 if (strBreakStartDate != strStartDate || strBreakStartTime != strStartTime || strBreakEndDate != strEndDate ||
  90.                     strBreakEndTime != strEndTime || strBreakTitle != strTitle || strBreakBody != strBody) {
  91.                     objAppo = objOl.CreateItem(olAppointmentItem);
  92.                     if (strStartTime != '') {
  93.                         objAppo.Start = getYYYYsMMsDD(strStartDate) + ' ' + getHHMMSS(strStartTime);
  94.                     } else {
  95.                         objAppo.Start = getYYYYsMMsDD(strStartDate);
  96.                     }
  97.                     if (strEndTime != '') {
  98.                         objAppo.End = getYYYYsMMsDD(strEndDate) + ' ' + getHHMMSS(strEndTime);
  99.                     } else {
  100.                         objAppo.End = getYYYYsMMsDD(strEndDate);
  101.                     }
  102.                     objAppo.Subject = strTitle;
  103.                     objAppo.Body = strBody;
  104.                     objAppo.ReminderSet = false;
  105.  
  106.                     objAppo.Close(olSave);
  107.  
  108.                     strBreakStartDate = strStartDate;
  109.                     strBreakStartTime = strStartTime;
  110.                     strBreakEndDate = strEndDate;
  111.                     strBreakEndTime = strEndTime;
  112.                     strBreakTitle = strTitle;
  113.                     strBreakBody = strBody;
  114.                 }
  115.  
  116.                 strStartDate = '';
  117.                 strStartTime = '';
  118.                 strEndDate = '';
  119.                 strEndTime = '';
  120.                 strTitle = '';
  121.                 strBody = '';
  122.             }
  123.         }
  124.     } while(strBuf != 'END:VCALENDAR')
  125.     objFile.Close();
  126.  
  127. } catch (ex) {
  128. } finally {
  129.     if (objStream) objStream = null;
  130.     objItems = null;
  131.     objFd = null;
  132.     objNs = null;
  133.     objOl = null;
  134. }
  135.  
  136. function OpeniCalFile(pFileName) {
  137.     var objStream = new ActiveXObject('ADODB.Stream');
  138.     objStream.Type = adTypeText;
  139.     objStream.Charset = 'UTF-8';
  140.     objStream.LineSeparator = adCRLF;
  141.     objStream.Open();
  142.     objStream.LoadFromFile(pFileName);
  143.  
  144.     return(objStream);
  145. }
  146.  
  147. function Now() {
  148.     var today = new Date();
  149.     return(today);
  150. }
  151.  
  152. function getYYYYMMDD(strDate) {
  153.     var today;
  154.  
  155.     if (strDate) {
  156.         today = new Date(strDate);
  157.     } else {
  158.         today = new Date();
  159.     }
  160.  
  161.     return(today.getFullYear().toString() + Right('0'.toString() + (today.getMonth() + 1), 2).toString() + Right('0'.toString() + today.getDate(), 2).toString());
  162. }
  163.  
  164. function getYYYYsMMsDD(strDate) {
  165.     return(strDate.substring(0, 4) + '/' + strDate.substring(4, 6) + '/' + strDate.substring(6, 8));
  166. }
  167.  
  168. function getHHMMSS(strTime) {
  169.     return(strTime.substring(0, 2) + ':' + strTime.substring(2, 4) + ':' + strTime.substring(4, 6));
  170. }
  171.  
  172. function Right(str, n) {
  173.  
  174.     l = str.length;
  175.     if (n> l) n = l;
  176.  
  177.     return(str.substring(l - n, l));
  178. }

仕様としましてはこのWSHを実行した日以降(実行日含む)の予定を一度削除してスケジュールファイルの予定を取り込み直します。
あとエラーハンドリングはほとんどやっていません(汗
これは今後の課題ですね。
今回はC:cybozu2ical-0.32c2o.jsに保存します。

7.サイボウズスケジュールファイル出力とスケジュールファイルをOutlookに取り込みバッチを作って実行します。

cd cybozu2ical-0.32perl cybozu2ical --output Cybozu.icscscript c2o.js

バッチファイルはWindowsのタスクで定期実行するようにしておけばバッチリです。

8.WindowsXPを使っているので、Active Syncをダウンロードしてインストールします。
ダウンロードが終了したらsetup.msiファイルをダブルクリックします。
インストーラーが起動しますので、[次へ]ボタンをクリックします。

[使用許諾契約書の内容に同意します]を選択して、[次へ]ボタンをクリックします。

[次へ]ボタンをクリックします。

[次へ]ボタンをクリックします。

[インストール]ボタンをクリックします。

インストールが開始されます。

インストールが終了したら、[終了]ボタンをクリックします。

※Windowsの再起動を求められたら再起動します。

9.パソコンとWindows Mobile機をUSBで繋ぎます。
すると同期セットアップ ウィザードが起動しますので、[次へ]ボタンをクリックします。

[次へ]ボタンをクリックします。

パソコンとWindows Mobile機で同期を取る情報を選択します。
ここでは「予定表」以外はチェックを外します。

「デバイスがコンピュータに接続されている間の無線データ接続(MMS またはインターネット電話など)を許可します」にチェックを入れて、[次へ]ボタンをクリックします。

[完了]ボタンをクリックします。

するとActiveSyncが起動し、予定表の同期が始まります。

どうでしょうか?
手順が少し長いですが、ここまでやっておけばサッとWindowsMobile機を取り出して予定が確認できますネ。