使用REST API从SharePoint日历中检索事件

问题描述:

我有剩余的端点用于在工作时从内部网络访问SharePoint共享日历。它看起来像这样: https://teamsites {COMPANY}的.com /网站/ {SITE_URI}/_ AP​​I /网页/列表/ getbytitle({TITLE-OF-日历})/项目使用REST API从SharePoint日历中检索事件

当我做授权的GET请求。上面的url,它给了我日历中4个事件的列表,但日期是随机的。我需要指定什么端点才能检索当月的所有事件?

另外,我猜测我每次请求只得到4个事件的原因是由于某些分页事件,我没有处理...如果你知道如何检索一个请求中的所有事件,这将是一个奖金。

在此先感谢!

对于当前月的事件可能通过以下CAML查询来检索:

<Where> 
    <DateRangesOverlap> 
     <FieldRef Name='EventDate' /> 
     <FieldRef Name='EndDate' /> 
     <Value Type='DateTime'> 
      <Month /> 
     </Value> 
    </DateRangesOverlap> 
</Where> 

对于这个问题GetItems method可以利用如下面所示:

var query = ` 
<Where> 
    <DateRangesOverlap> 
     <FieldRef Name='EventDate' /> 
     <FieldRef Name='EndDate' /> 
     <Value Type='DateTime'> 
      <Month /> 
     </Value> 
    </DateRangesOverlap> 
</Where>` 


getListItems(_spPageContextInfo.webAbsoluteUrl,'TeamCalendar',query) 
.done(function(data){ 
    var items = data.d.results; 
    for(var i = 0; i < items.length;i++) { 
     console.log(items[i].Title); 
    }  
}) 
.fail(function(error){ 
    console.log(JSON.stringify(error)); 
}); 

其中

function getListItems(webUrl,listTitle, queryText) 
{ 
    var viewXml = '<View><Query>' + queryText + '</Query></View>'; 
    var url = webUrl + "/_api/web/lists/getbytitle('" + listTitle + "')/getitems"; 
    var queryPayload = { 
       'query' : { 
         '__metadata': { 'type': 'SP.CamlQuery' }, 
         'ViewXml' : viewXml 
       } 
    }; 
    return $.ajax({ 
      url: url, 
      method: "POST", 
      data: JSON.stringify(queryPayload), 
      headers: { 
       "X-RequestDigest": $("#__REQUESTDIGEST").val(), 
       "Accept": "application/json; odata=verbose", 
       "content-type": "application/json; odata=verbose" 
      } 
    }); 
} 

但有一个限制使用此方法,REST和CSOM/JSOM API都不支持而不支持支持扩展循环事件(这意味着只有单个事件项目才会返回以发生重复事件)。请参阅这些要求的更多详细信息:

对于场景遗留的SharePoint Web服务就派上用场了,特别是Lists Web Service

下面的例子演示了如何检索了当月的所有活动和扩大重复事件(SPServices library在这里使用):

$().SPServices({ 
    operation: "GetListItems", 
    async: false, 
    listName: "TeamCal", 
    CAMLViewFields: "<ViewFields>" + 
      "<FieldRef Name='Title' />" + 
      "<FieldRef Name='EventDate' />" + 
      "<FieldRef Name='EndDate' />" + 
      "<FieldRef Name='Location' />" + 
      "<FieldRef Name='Description' />" + 
      "<FieldRef Name='fRecurrence' />" + 
      "<FieldRef Name='RecurrenceData' />" + 
      "<FieldRef Name='fAllDayEvent' />" + 
     "</ViewFields>", 
    CAMLQuery: "<Query>" + 
      "<Where>" + 
       "<DateRangesOverlap>" + 
        "<FieldRef Name='EventDate' />" + 
        "<FieldRef Name='EndDate' />" + 
        "<FieldRef Name='RecurrenceID' />" + 
        "<Value Type='DateTime'>" + 
         "<Month />" + 
        "</Value>" + 
       "</DateRangesOverlap>" + 
      "</Where>" + 
      "<OrderBy>" + 
       "<FieldRef Name='EventDate' />" + 
      "</OrderBy>" + 
     "</Query>", 
    CAMLQueryOptions: "<QueryOptions>" + 
      "<RecurrencePatternXMLVersion>v3</RecurrencePatternXMLVersion>" + 
      "<ExpandRecurrence>TRUE</ExpandRecurrence>" + 
     "</QueryOptions>", 
    completefunc: function (xData, Status) { 
     $(xData.responseXML).SPFilterNode("z:row").each(function() { 

      var $node = $(this); 
      var eventTitle = $node.attr("ows_Title"); 
      console.log(eventTitle); 

     }); 
    } 
}) 
+1

感谢您的详细答复!我能够查看您发送的api链接以及您的详细示例,以在我的代码中创建解决方案。似乎可能的重复事件问题在我的使用案例中不是问题。 –