Archive for the ‘cybozu2ical’ Category

11月
21

仕事場のスケジュール管理としてサイボウズを使っているのですが、セキュリティの関係上、インターネットに公開しておらず仕事場からでないとスケジュールを確認できません。
サイボウズのスケジュールを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.32\cybozu2ical –output \cybozu2ical-0.32\Cybozu.ics
と入力して実行すると、–outputに指定したファイル名でスケジュールが出力されます。
このスケジュールファイルはGoogle カレンダーやMacのiCal、mozillaのSunbirdなど多くの
スケジュール管理ソフトにインポート可能です。

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

// 定数宣言
var olSave = 0;
var olAppointmentItem = 1;
var olFolderCalendar = 9;

var adTypeText = 2;
var adCRLF = -1;
var adReadLine = -2;

var strFileName = "C:\\cybozu2ical-0.32\\Cybozu.ics";

// 変数宣言
var strBuf;
var intReadFlg;
var strStartDate;
var strStartTime;
var strEndDate;
var strEndTime;
var strTitle;
var strBody;
var strBreakStartDate = "0";
var strBreakStartTime = "0";
var strBreakEndDate = "0";
var strBreakEndTime = "0";
var strBreakTitle = "0";
var strBreakBody = "0";

// Outlook用オブジェクト
var objOl = new ActiveXObject("Outlook.Application");
var objNs = objOl.GetNamespace("MAPI");
var objFd = objNs.GetDefaultFolder(olFolderCalendar);
var objItems = objFd.Items;
var objAppo;

// システム日付以降の予定表を削除
try {
	var i = 1;
	while (objItems.Count >= i) {
		objAppointment = objItems(i);
		if (getYYYYMMDD(String(objItems(i).Start)) < getYYYYMMDD()) {
			i++;
		} else {
			objItems(i).Delete();
			objItems = objFd.Items;
			i = 1;
		}
	}

	intReadFlg = 9;

	var objStream = OpeniCalFile(strFileName); 

	do {
		strBuf = objStream.ReadText(adReadLine);

	    if (strBuf == "BEGIN:VEVENT") {
			intReadFlg = 1;
		} else if (strBuf == "END:VEVENT") {
			intReadFlg = 0;
		} else if (strBuf == "BEGIN:VTIMEZONE") {
			intReadFlg = 9;
		}

		if (intReadFlg == 1) {
			// 予定開始日
			if (strBuf.indexOf('DTSTART;TZID=Asia/Tokyo', 0) >= 0) {
				strStartDate = strBuf.substring(strBuf.indexOf(":", 0) + 1, strBuf.indexOf("T", strBuf.indexOf(":", 0) + 1));
				strStartTime = strBuf.substring(strBuf.indexOf("T", strBuf.indexOf(":", 0)) + 1);
			} else if (strBuf.indexOf('DTSTART;VALUE=DATE', 0) >= 0) {
				strStartDate = strBuf.substring(strBuf.indexOf(":", 0) + 1);
			}
			// 予定終了日
			if (strBuf.indexOf('DTEND;TZID=Asia/Tokyo', 0) >= 0) {
				strEndDate = strBuf.substring(strBuf.indexOf(":", 0) + 1, strBuf.indexOf("T", strBuf.indexOf(":", 0) + 1));
				strEndTime = strBuf.substring(strBuf.indexOf("T", strBuf.indexOf(":", 0)) + 1);
			} else if (strBuf.indexOf('DTEND;VALUE=DATE', 0) >= 0) {
				strEndDate = strBuf.substring(strBuf.indexOf(":", 0) + 1);
			}
			// タイトル
			if (strBuf.indexOf("SUMMARY:", 0) >= 0) {
				strTitle = strBuf.substring(strBuf.indexOf(":", 0) + 1);
			}
			// 内容
			if (strBuf.indexOf("DESCRIPTION:", 0) >= 0) {
				strBody = strBuf.substring(strBuf.indexOf(":", 0) + 1);
			}
		} else if (intReadFlg == 0) {
			if (strStartDate &gt;= getYYYYMMDD()) {
				if (strBreakStartDate != strStartDate || strBreakStartTime != strStartTime || strBreakEndDate != strEndDate ||
					strBreakEndTime != strEndTime || strBreakTitle != strTitle || strBreakBody != strBody) {
					objAppo = objOl.CreateItem(olAppointmentItem);
					if (strStartTime != "") {
						objAppo.Start = getYYYYsMMsDD(strStartDate) + " " + getHHMMSS(strStartTime);
					} else {
						objAppo.Start = getYYYYsMMsDD(strStartDate);
					}
					if (strEndTime != "") {
						objAppo.End = getYYYYsMMsDD(strEndDate) + " " + getHHMMSS(strEndTime);
					} else {
						objAppo.End = getYYYYsMMsDD(strEndDate);
					}
					objAppo.Subject = strTitle;
					objAppo.Body = strBody;
					objAppo.ReminderSet = false;

					objAppo.Close(olSave);

	                strBreakStartDate = strStartDate;
					strBreakStartTime = strStartTime;
					strBreakEndDate = strEndDate;
					strBreakEndTime = strEndTime;
					strBreakTitle = strTitle;
					strBreakBody = strBody;
				}

	            strStartDate = "";
				strStartTime = "";
				strEndDate = "";
				strEndTime = "";
				strTitle = "";
				strBody = "";
			}
		}
	} while(strBuf != "END:VCALENDAR")
	objFile.Close();

} catch (ex) {
} finally {
	if (objStream) objStream = null;
	objItems = null;
	objFd = null;
	objNs = null;
	objOl = null;
}

function OpeniCalFile(pFileName) {
	var objStream = new ActiveXObject("ADODB.Stream");
	objStream.Type = adTypeText;
	objStream.Charset = "UTF-8";
	objStream.LineSeparator = adCRLF;
	objStream.Open();
	objStream.LoadFromFile(pFileName);

	return(objStream);
}

function Now() {
	var today = new Date();
	return(today);
}

function getYYYYMMDD(strDate) {
	var today;

	if (strDate) {
		today = new Date(strDate);
	} else {
		today = new Date();
	} 

	return(today.getFullYear().toString() + Right("0".toString() + (today.getMonth() + 1), 2).toString() + Right("0".toString() + today.getDate(), 2).toString());
}

function getYYYYsMMsDD(strDate) {
	return(strDate.substring(0, 4) + "/" + strDate.substring(4, 6) + "/" + strDate.substring(6, 8));
}

function getHHMMSS(strTime) {
	return(strTime.substring(0, 2) + ":" + strTime.substring(2, 4) + ":" + strTime.substring(4, 6));
}

function Right(str, n) {

	l = str.length;
	if (n &gt; l) n = l;

    return(str.substring(l - n, l));
}

仕様としましてはこのWSHを実行した日以降(実行日含む)の予定を一度削除してスケジュールファイルの予定を取り込み直します。
あとエラーハンドリングはほとんどやっていません(汗
これは今後の課題ですね。
今回はC:\cybozu2ical-0.32\c2o.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機を取り出して予定が確認できますネ。

  • Search:
  • flashcastとは?

    東京を中心に、現在フリーランスとして活動しているITエンジニア、および、かつてフリーランスとして活動していた起業家達が立ち上げたコミュニティーです。

    みんなで集まって面白いことをやろう!形に残そう!ということで、ブログをはじめました。

    技術情報や、フリーエンジニアに役立つ情報などを、ご紹介できたらと思っています。

    お問い合わせ:
    info@flashcast.jp
  • カレンダー

    2010年7月
    日曜日 月曜日 火曜日 水曜日 木曜日 金曜日 土曜日
    « 6月    
     123
    45678910
    11121314151617
    18192021222324
    25262728293031
  • メンバー紹介

    もじゃもじゃ
    flashcastのリーダー

    3年ほどフリーのITエンジニアとして活動。現在は、社員2名の株式会社を経営しています。

    一攫千金を夢見る野心家です。

    ライブキャスト

    yasu
    ダイバー

    自宅サーバーでホームページを作り始めました。

    少しずつ記事を増やしていきますので足を運んでください。

    よろしくお願いします。

    sa-sa-ki.jp

    のら
    たびびと

    ねこ好きに悪人はいなーいっ!!

    バイクや車も好きです。

    めぐ
    デザイナーのたまご

    音楽とデザインとお酒をこよなく愛する永遠のダイエッター。

    現在ペンタブレットでイラストを勉強中。

    Hiro
    コンサル

    PMやSEの案件を業務委託で請けることが多いですが、小規模案件も受託でやっています。

    得意な分野はマイクロソフト製品や関連技術によるシステム構築です。

    KEI
    取締役の風格

    最年少なのに、メンバーで1番の貫禄の持ち主!?

    C#や.netなどサーバ側の開発が得意。

    ろっきー
    美食家★パパ

    自分にとっての息抜きは、ドライブして温泉に入って、美味しいご飯を食べる事。

    ココロとカラダのリフレッシュを大切にし、日々の仕事に励む一児の父親です。

    郵便番号検索

    my-hobby

    とのさま
    げーむのおうさま

    大人なのに好きなことしかやらない駄目人間。

    Web系が得意、アクセスは苦手><

    tonosamart.com

    セクレタリアト
    ギャンブラー

    フリーランス時代は仲間の現場を探すことが多く、それをきっかけに会社を設立。

    現在はSI業に特化せず、他の業種にも興味を持ち始めています。

    メドレー株式会社

  • 広告