Mobile, WSH2008年12月8日yasu
前回サイボウズのスケジュールをOutlook2003を経由してWindows Mobile(Advanced/W-ZERO3[es])に自動同期する方法をご紹介しましたが、手順6でご紹介したWSHだとOutlookの削除済みアイテムに削除した予定が残ってしまっておりました。
OutlookはあくまでサイボウズとWindows Mobile(Advanced/W-ZERO3[es])のスケジュール橋渡し的な用途としているので、この際WSHで削除済みアイテムも全削除したいと思います。
※Outlookをメインのメーラーとして使われている方は削除済みアイテムが空になってしまいますので、導入しない方がいいかもしれません。
// 定数宣言
var olSave = 0;
var olAppointmentItem = 1;
var olFolderDeletedItems = 3;
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 objDust = objNs.GetDefaultFolder(olFolderDeletedItems);
var objItems = objFd.Items;
var objDItems = objDust.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;
}
}
// 削除済みアイテム全削除
objDItems = objDust.Items;
while (objDItems.Count >= 1) {
objDItems(1).Delete();
objDItems = objDust.Items;
}
// iCalファイルを読込み、予定表に書込み
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 >= 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;
objDItems = null;
objItems = null;
objDust = 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 > l) n = l;
return(str.substring(l - n, l));
}
以前作ったc2o.jsを今回ご紹介したコードに置き換えてください。
これで削除済みアイテムに削除された予定が残らなくなりましたね。