使用JS从SharePoint日历中检索事件编号

时间:2016-08-10 14:39:33

标签: javascript sharepoint csom sharepoint-jsom

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

任何建议都会非常有用。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

另一种方法是使用其中一个仍然存在的旧Web服务...特别是/_vti_bin/Lists.asmx访问的列表 Web服务。此Web服务具有GetListItems方法,该方法接受SOAP消息,您可以在其中指定查询选项以扩展重复发生,就像在服务器端一样。

以下是演示如何使用纯JavaScript查询列表 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 />或{ {1}}。

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

要检查相对于今天以外的某个日期的日期范围,您可以将<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 />的值似乎不尊重<Year />值。