2

我有一个 SharePoint 日历列表,我正在寻找一个脚本来检索一天中的事件数。例如,对于今天 8 月 10 日,我只想检索存储在我的日历中的事件数。

任何建议都会非常有帮助。

4

1 回答 1

2

在 JavaScript 中查询日历的问题:重复

通常使用 REST 或 JavaScript 对象模型使用 JavaScript 从 SharePoint 检索数据非常简单(至少对于 SharePoint 2007 之后的版本)。但是,日历具有创建可能使事情复杂化的重复事件的功能。

例如,重复事件的开始日期可能是两年前,结束日期可能是多年后,但可能事件本身实际上只发生在每个月的第三个星期二。如果您只是查询列表并尝试将今天的日期与开始日期和结束日期进行比较以查看它们是否重叠,那么该重复事件将显示在您的结果中(即使今天不是该月的第三个星期二)。

在服务器端代码中,您可以通过在用于查询列表的SPQuery对象上将 ExpandRecurrence属性设置为 true 来解决此问题。但是,从 SP2010 和 SP2013 开始,该属性不会在等效的 JavaScript 对象模型上公开。


解决方法:使用 Lists.GetListItems Web 服务**

一种替代方法是使用仍然存在的旧 Web 服务之一……特别是/_vti_bin/Lists.asmx. 此 Web 服务有一个GetListItems接受 SOAP 消息的方法,您可以在该方法中指定一个查询选项来扩展重复周期,就像在服务器端一样。

下面是一个示例,展示了如何使用纯 JavaScript查询Lists Web 服务:

// Set webUrl and listGuid to values specific to your site and list
var webUrl = "http://server/sitewhereyourlistexists";
var listGuid = "{000000000-0000-0000-0000-000000000000}"

// An XMLHttpRequest object is used to access the web service
var xhr = new XMLHttpRequest();
var url = webUrl + "/_vti_bin/Lists.asmx";
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-Type","text/xml; charset=utf-8");
xhr.setRequestHeader("SOAPAction","http://schemas.microsoft.com/sharepoint/soap/GetListItems");

// The message body consists of an XML document 
// with SOAP elements corresponding to the GetListItems method parameters
// i.e. listName, query, and queryOptions
var data = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"+
    "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" + 
        "<soap:Body>" +
        "<GetListItems xmlns=\"http://schemas.microsoft.com/sharepoint/soap/\">" + 
                "<listName>"+listGuid+"</listName>" + 
                "<query>" + 
                    "<Query><Where>" +
                        "<DateRangesOverlap>" + 
                            "<FieldRef Name=\"EventDate\"/>"+
                            "<FieldRef Name=\"EndDate\"/>"+
                            "<FieldRef Name=\"RecurrenceID\"/>"+
                            "<Value Type=\"DateTime\"><Today/></Value>"+
                        "</DateRangesOverlap>"+
                    "</Where></Query>"+
                "</query>" +
                "<queryOptions>"+
                    "<QueryOptions>"+
                        "<ExpandRecurrence>TRUE</ExpandRecurrence>"+
                    "</QueryOptions>"+
                "</queryOptions>" +
        "</GetListItems>" +
        "</soap:Body>" +
    "</soap:Envelope>";

// Here we define what code we want to run upon successfully getting the results
xhr.onreadystatechange = function(){
    if(xhr.readyState == 4){
        if(xhr.status == 200){
            var doc = xhr.responseXML;
            // grab all the "row" elements from the XML results
            var rows = doc.getElementsByTagName("z:row");
            var results = "Today's Schedule ("+rows.length+"):\n\n";
            var events = {};
            for(var i = 0, len = rows.length; i < len; i++){
                var id = rows[i].getAttribute("ows_FSObjType"); // prevent duplicates from appearing in results
                    if(!events[id]){ 
                        events[id] = true;
                        var allDay = rows[i].getAttribute("ows_fAllDayEvent"),
                            title = rows[i].getAttribute("ows_Title"),
                            start = rows[i].getAttribute("ows_EventDate"); 
                        var index = start.indexOf(" "); 
                        var date = start.substring(5,index)+"-"+start.substring(2,4); // get the date in MM-dd-yyyy format
                        start = start.substring(index, index+6); // get the start time in hh:mm format
                        var end = rows[i].getAttribute("ows_EndDate"); 
                        index = end.indexOf(" "); end = end.substring(index,index+6); // get the end time in hh:mm format
                        results += date + " " + (allDay == "1" ? "All Day\t" : start + " to " + end ) + " \t " + title + "\n";
                    }
                }
                alert(results);
            }else{
                alert("Error "+xhr.status);
            }   
    }
};

// Finally, we actually kick off the query
xhr.send(data);

检查今天日期以外的范围

在节点的<Value>子节点中<DateRangesOverlap>,可以指定<Now /><Today /><Week /><Month />、 或<Year />

周、月和年将检查当前日期的同一周、同一月或同一年的事件。

要检查相对于今天以外的某个日期的日期范围,您可以向 CAML 查询<CalendarDate>的节点添加一个节点<QueryOptions>,如下所示。

"<query>" + 
    "<Query><Where>" + 
        "<DateRangesOverlap>" + 
            "<FieldRef Name=\"EventDate\"/>"+ 
            "<FieldRef Name=\"EndDate\"/>"+ 
            "<FieldRef Name=\"RecurrenceID\"/>"+ 
                "<Value Type=\"DateTime\"><Week /></Value>"+ 
        "</DateRangesOverlap>"+ 
    "</Where></Query>"+ 
"</query>" + 
"<queryOptions>"+ 
    "<QueryOptions>"+ 
        "<ExpandRecurrence>TRUE</ExpandRecurrence>"+ 
        "<CalendarDate>2017-03-10</CalendarDate>" +
    "</QueryOptions>"+ 
"</queryOptions>" + 

请注意,<Now />and的值<Year />似乎不尊重该CalendarDate值。

于 2016-08-10T21:32:47.577 回答