是否可以使用通过Lists.aspx公开的Web服务从Sharepoint的日历中获取事件列表(扩展重复事件)?
如果您正在使用C#或VB,这显然是可能的,如here所述,使用这样的代码段:
SPQuery query = new SPQuery();
query.ExpandRecurrence = true;
query.Query = "<Where><DateRangesOverlap><FieldRef Name=\"EventDate\" /><FieldRef Name=\"EndDate\" /><FieldRef Name=\"RecurrenceID\" /><Value Type=\"DateTime\"><Month /></Value></DateRangesOverlap></Where>";
我试图通过cURL使用普通XML来执行相同的查询:
<GetListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/">
<listName>{my guid goes here}</listName>
<query>
<Query xmlns="">
<Where>
<DateRangesOverlap>
<FieldRef Name="EventDate" />
<FieldRef Name="EndDate" />
<FieldRef Name="RecurrenceID" />
<Value Type="DateTime"><Month/></Value>
</DateRangesOverlap>
</Where>
</Query>
</query>
<queryOptions>
<QueryOptions>
<ExpandRecurrence>TRUE</ExpandRecurrence>
</QueryOptions>
</queryOptions>
这种方法有效 - 它获取所有列表项,但不会扩展重复项。关键似乎是ExpandRecurrence属性。令人惊讶的是,除了几篇博文之外,谷歌似乎没有太多话要说。在网上搜索,我已经阅读了一些注释,表明ExpandRecurrence属性不起作用,但是其他人说它工作正常,我读过的任何内容都没有让我感到震惊。
有没有人试过这个并且在没有使用C#或VB的情况下让它工作 - 只是直接的XML?
答案 0 :(得分:5)
最后让它正常工作并返回SharePoint日历上的所有重复事件。以下是Web服务查询的XML:
<GetListItems xmlns='http://schemas.microsoft.com/sharepoint/soap/'>
<listName>{your GUID goes here}</listName>
<query>
<Query>
<Where>
<DateRangesOverlap>
<FieldRef Name=\"EventDate\" />
<FieldRef Name=\"EndDate\" />
<FieldRef Name=\"RecurrenceID\" />
<Value Type='DateTime'><Year/></Value>
</DateRangesOverlap>
</Where>
</Query>
</query>
<queryOptions>
<QueryOptions>
<ExpandRecurrence>TRUE</ExpandRecurrence>
</QueryOptions>
</queryOptions>
</GetListItems>
关键不仅是将ExpandRecurrence选项设置为true - 您还必须将DateRangeOverlap中的值包含在Year中。
答案 1 :(得分:2)
我认为我有类似的问题,它只是返回列表中的项目而不是实际扩展重复项目(即标记为每周一发生的项目仅显示为单个记录而不是多个记录)。
显然版本12.0.0.6421(2007 SP1)不会扩展项目,即使您通过Web服务API告诉它也是如此。当我们应用最新的累积更新(2011年8月)时,它按预期工作(即每周一返回多个预定的条目)。
以下是我们应用CU后的代码:
Query for ndQuery:
--------------------
<Where>
<DateRangesOverlap>
<FieldRef Name=""EventDate"" /><FieldRef Name=""EndDate"" /><FieldRef Name=""RecurrenceID"" />
<Value Type=""DateTime""><Month/></Value>
</DateRangesOverlap>
</Where>>
<OrderBy><FieldRef Name='ID' /></OrderBy>
query options for ndQueryOptions:
-----------------------------------------------
<IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns>
<DateInUtc>TRUE</DateInUtc>
<ViewAttributes Scope=\"Recursive\" />
<RecurrencePatternXMLVersion>v3</RecurrencePatternXMLVersion>
<ExpandRecurrence>True</ExpandRecurrence>
<CalendarDate>2011-10-16T00:00:00Z</CalendarDate>
<RecurrenceOrderBy>TRUE</RecurrenceOrderBy>
<ViewAttributes Scope=\"RecursiveAll\"/>
Web service call:
------------------------
XmlNode results = wsList.GetListItems("Events", String.Empty, ndQuery, ndViewFields, String.Empty, ndQueryOptions, "F43559AF-C643-4FF3-AAA3-77471A2D1979");
答案 2 :(得分:0)
我追踪这个问题的方法是使用类似TcpTrace(http://www.pocketsoap.com)之类的东西来查看正在发送的XML数据包。然后,确保手工制作的XML数据包看起来一样。我希望当你看到XML数据包时,差异应该是显而易见的。然后你可以用答案更新这个问题。
答案 3 :(得分:0)
是的,您可以在sharepoint日历中拆分重复发生的事件,并可以从列表中下载特定时间段。
我为此创建了一个自定义dll。
https://github.com/shafeequealipt/Share-Point-Recurrance-event-splitter
答案 4 :(得分:-2)
不可能。您需要使用SP对象模型,例如SPQuery对象。但这意味着您必须直接在sharepoint服务器上运行该代码,而不是从客户端调用。