我正在尝试在共享日历上搜索约会。第一步是我使用自定义属性 twMeetingId 将约会保存在共享日历中。这工作正常:
Outlook.AppointmentItem nurseAppointment = Globals.ThisAddIn.Application.GetNamespace("MAPI").GetSharedDefaultFolder(recepient, Outlook.OlDefaultFolders.olFolderCalendar).Items.Add();
nurseAppointment.UserProperties.Add("twMeetingId", Outlook.OlUserPropertyType.olText, false, 1);
nurseAppointment.UserProperties["twMeetingId"].Value = appointmentData.meetingId;
nurseAppointment.Save();
然后我试图根据自定义属性 twMeetingId 在同一个共享日历中查找任何约会
var filter = $"@SQL =\"http://schemas.microsoft.com/mapi/string/{{00020329-0000-0000-C000-000000000046}}/twMeetingId/0000001f\" = '{appointmentData.meetingId}'";
Outlook.Items items = Globals.ThisAddIn.Application.GetNamespace("MAPI").GetSharedDefaultFolder(recepient, Outlook.OlDefaultFolders.olFolderCalendar).Items.Restrict(filter);
此时我收到错误“条件无效”。我已经检查了过滤器中的 meetingId value 是否正确。我也尝试过如下使用 Jet 查询,但它也不起作用:
nurseAppointment = Globals.ThisAddIn.Application.GetNamespace("MAPI").GetSharedDefaultFolder(recepient, Outlook.OlDefaultFolders.olFolderCalendar).Items.Find(String.Format("[twMeetingId] = '{0}'", appointmentData.meetingId));
我在这里想念什么?
回答1
@SQL
和 =
之间有一个错误的空格。以下条件对我来说没有错误:
@SQL="http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/twMeetingId/0000001f" = 'test'
还要确保 appointmentData.meetingId
不包含任何需要编码的字符。
回答2
看起来您的代码中有一个错误组合的搜索字符串:
var filter = $"@SQL=\"http://schemas.microsoft.com/mapi/string/{{00020329-0000-0000-C000-000000000046}}/twMeetingId\" = '{appointmentData.meetingId}'";
首先,如您所见,您需要在搜索字符串中使用一个花括号。
其次,您需要删除 DASL 属性名称末尾的属性类型。
如果您想使用没有 DASL 命名空间的属性名称,如下所示:
"[twMeetingId] = '{0}'"
您需要确保在调用 UserProperties.Add
方法时将该属性添加到文件夹字段中。如果属性将作为自定义字段添加到项目所在的文件夹中,则 AddToFolderFields
参数为 true
。此字段可以显示在文件夹的视图中。 alse
如果属性将作为自定义字段添加到项目而不是文件夹。默认 value 为 True。
您可能会发现https://docs.microsoft.com/en-us/office/vba/outlook/How-to/Search-and-Filter/filtering-items-using-query-keywords一文很有帮助。