通过WebServices从Sharepoint日历展开重复事件?

时间:2008-12-17 21:46:39

标签: web-services sharepoint

是否可以使用通过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?

5 个答案:

答案 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服务器上运行该代码,而不是从客户端调用。

请看我的这篇文章; http://social.msdn.microsoft.com/Forums/en-US/sharepointdevelopment/thread/3c399768-c492-4d7e-8f6e-fa304ed03131