使用 GlobalAppointmentID 获取 Outlook AppointmentItem
Get Outlook AppointmentItem using GlobalAppointmentID
我正在为我的公司开发与 Outlook 日历同步的日历。
大气压我可以:
- 从 Outlook 导入约会并在我的日历中显示它们
- 在 Outlook 约会更新时更新我的约会
- 在我的日历中创建约会时创建 Outlook 约会
我遇到的唯一问题是 updating/deleting Outlook 约会时我的约会 update/delete。
我有相应约会的 GlobalAppointmentID,但我似乎无法搜索该 ID。
我试过了:
using Microsoft.Office.Interop;
private void GetAppointment(string myGlobalAppointmentID)
{
Outlook.Application oApp = new Outlook.Application();
Outlook.NameSpace mapiNamespace = oApp.GetNamespace("MAPI");
Outlook.MAPIFolder calendarFolder = mapiNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
Outlook.Items outlookCalendarItems = calendarFolder.Items;
Outlook.AppointmentItem appointmentItem = (Outlook.AppointmentItem)outlookCalendarItems.Find("[GlobalAppointmentID] = '{0}'", myGlobalAppointmentID));
//update or delete appointmentItem here (which I know how to do)
}
我一直收到 'Condition is not valid' 异常。
显然 Outlook 不允许搜索二进制属性(例如 GlobalAppointmentID)。
我在其他情况下使用相同的 outlookCalendarItems.Find() 和 calendarFolder.Items.Restrict() 没有问题。
我尝试使用 Redemption,但我也无法使用它。
有没有人有经验或建议?
是的,OOM 不允许您搜索二进制属性(以及收件人或附件),但 Redemption(我是它的作者)应该可以。以下脚本 (VBA) 对我来说工作得很好:
set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set Folder = Session.GetDefaultFolder(olFolderCalendar)
set appt = Folder.Items.Find("GlobalAppointmentID = '040000008200E00074C5B7101A82E00800000000D0FECEE58FEAD70100000000000000001000000041C887A3FA12694F8A0402FEFFAD0BBB'")
MsgBox appt.Subject
Outlook 对象模型不支持使用 Items.Find
/Items.FindNext
搜索二进制属性,例如 GlobalAppointmentId
(任何其他 PT_BINARY
属性) /Items.Restrict
.
唯一的解决方法是遍历 Calendar
文件夹中的所有项目(效率低下)或使用扩展 MAPI 进行搜索(或使用第三方包装程序,例如 Redemption。
经过进一步研究后我最终做了什么:
我在放置 GlobalAppointmentID("GAID") 的地方添加了文本 UserProperty。
你可以过滤那些。
它似乎可以解决问题。
private void AddGAIDIfNeeded(Outlook.AppointmentItem app)
{
bool GAIDexists = false;
if (app.UserProperties.Count != 0)
{
foreach (UserProperty item in app.UserProperties)
{
if (item.Name == "GAID")
{
GAIDexists = true;
break;
}
}
}
if (GAIDexists == false)
{
app.UserProperties.Add("GAID", Outlook.OlUserPropertyType.olText);
app.UserProperties["GAID"].Value = app.GlobalAppointmentID;
app.Save();
}
}
并查找特定的 AppointmentItem:
private void DeleteOutlookAppointmentByGAID(string globalAppointmentID)
{
Outlook.Application oApp = new Outlook.Application();
Outlook.NameSpace mapiNamespace = oApp.GetNamespace("MAPI");
Outlook.MAPIFolder calendarFolder = mapiNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
Outlook.Items outlookCalendarItems = calendarFolder.Items;
try
{
Outlook.AppointmentItem appointmentItem = null;
appointmentItem = outlookCalendarItems.Find(String.Format("[GAID] = '{0}'", globalAppointmentID));
if (appointmentItem != null)
{
appointmentItem.Delete();
}
}
catch (Exception ex)
{
classExecptionLogging.LogErrorToFolder(ex);
}
}
我正在为我的公司开发与 Outlook 日历同步的日历。
大气压我可以:
- 从 Outlook 导入约会并在我的日历中显示它们
- 在 Outlook 约会更新时更新我的约会
- 在我的日历中创建约会时创建 Outlook 约会
我遇到的唯一问题是 updating/deleting Outlook 约会时我的约会 update/delete。
我有相应约会的 GlobalAppointmentID,但我似乎无法搜索该 ID。
我试过了:
using Microsoft.Office.Interop;
private void GetAppointment(string myGlobalAppointmentID)
{
Outlook.Application oApp = new Outlook.Application();
Outlook.NameSpace mapiNamespace = oApp.GetNamespace("MAPI");
Outlook.MAPIFolder calendarFolder = mapiNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
Outlook.Items outlookCalendarItems = calendarFolder.Items;
Outlook.AppointmentItem appointmentItem = (Outlook.AppointmentItem)outlookCalendarItems.Find("[GlobalAppointmentID] = '{0}'", myGlobalAppointmentID));
//update or delete appointmentItem here (which I know how to do)
}
我一直收到 'Condition is not valid' 异常。 显然 Outlook 不允许搜索二进制属性(例如 GlobalAppointmentID)。
我在其他情况下使用相同的 outlookCalendarItems.Find() 和 calendarFolder.Items.Restrict() 没有问题。
我尝试使用 Redemption,但我也无法使用它。 有没有人有经验或建议?
是的,OOM 不允许您搜索二进制属性(以及收件人或附件),但 Redemption(我是它的作者)应该可以。以下脚本 (VBA) 对我来说工作得很好:
set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set Folder = Session.GetDefaultFolder(olFolderCalendar)
set appt = Folder.Items.Find("GlobalAppointmentID = '040000008200E00074C5B7101A82E00800000000D0FECEE58FEAD70100000000000000001000000041C887A3FA12694F8A0402FEFFAD0BBB'")
MsgBox appt.Subject
Outlook 对象模型不支持使用 Items.Find
/Items.FindNext
搜索二进制属性,例如 GlobalAppointmentId
(任何其他 PT_BINARY
属性) /Items.Restrict
.
唯一的解决方法是遍历 Calendar
文件夹中的所有项目(效率低下)或使用扩展 MAPI 进行搜索(或使用第三方包装程序,例如 Redemption。
经过进一步研究后我最终做了什么: 我在放置 GlobalAppointmentID("GAID") 的地方添加了文本 UserProperty。 你可以过滤那些。 它似乎可以解决问题。
private void AddGAIDIfNeeded(Outlook.AppointmentItem app)
{
bool GAIDexists = false;
if (app.UserProperties.Count != 0)
{
foreach (UserProperty item in app.UserProperties)
{
if (item.Name == "GAID")
{
GAIDexists = true;
break;
}
}
}
if (GAIDexists == false)
{
app.UserProperties.Add("GAID", Outlook.OlUserPropertyType.olText);
app.UserProperties["GAID"].Value = app.GlobalAppointmentID;
app.Save();
}
}
并查找特定的 AppointmentItem:
private void DeleteOutlookAppointmentByGAID(string globalAppointmentID)
{
Outlook.Application oApp = new Outlook.Application();
Outlook.NameSpace mapiNamespace = oApp.GetNamespace("MAPI");
Outlook.MAPIFolder calendarFolder = mapiNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
Outlook.Items outlookCalendarItems = calendarFolder.Items;
try
{
Outlook.AppointmentItem appointmentItem = null;
appointmentItem = outlookCalendarItems.Find(String.Format("[GAID] = '{0}'", globalAppointmentID));
if (appointmentItem != null)
{
appointmentItem.Delete();
}
}
catch (Exception ex)
{
classExecptionLogging.LogErrorToFolder(ex);
}
}