使用REST API从SharePoint日历中检索事件
问题描述:
我有剩余的端点用于在工作时从内部网络访问SharePoint共享日历。它看起来像这样: https://teamsites {COMPANY}的.com /网站/ {SITE_URI}/_ API /网页/列表/ 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都不支持而不支持支持扩展循环事件(这意味着只有单个事件项目才会返回以发生重复事件)。请参阅这些要求的更多详细信息:
- Provide CSOM and REST API for recurring calendar events
- Add support for recurring events in the REST 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);
});
}
})
感谢您的详细答复!我能够查看您发送的api链接以及您的详细示例,以在我的代码中创建解决方案。似乎可能的重复事件问题在我的使用案例中不是问题。 –