Получить номер события из календаря SharePoint с помощью JS

У меня есть список календарей SharePoint, и я ищу скрипт для получения количества событий за день. Например, на сегодня, 10 августа, я хочу просто получить количество событий, хранящихся в моем календаре.

Любое предложение будет очень полезным.

1 ответ

Проблема с запросом календарей в JavaScript: повторение

Обычно извлечение данных из SharePoint с помощью JavaScript очень просто (по крайней мере, для версий, выходящих за пределы SharePoint 2007) с использованием REST или объектной модели JavaScript. Однако календари имеют функциональность для создания повторяющихся событий, которые могут усложнить ситуацию.

Например, повторяющееся событие может иметь начальную дату два года назад и конечную дату много лет в будущем, но, возможно, само событие происходит только в третий вторник каждого месяца. Если вы просто запросите список и попытаетесь сравнить сегодняшнюю дату с начальной и конечной датами, чтобы увидеть, не перекрываются ли они, это повторяющееся событие будет отображаться в ваших результатах (даже если сегодня не третий вторник месяца).

В серверном коде вы можете обойти это, установив для свойства ExpandRecurrence значение true для объекта SPQuery, используемого для запроса списка. Однако, начиная с SP2010 и SP2013, это свойство не отображается в эквивалентной объектной модели JavaScript.


Обходной путь: Использование веб-службы Lists.GetListItems **

Альтернативой является использование одного из старых веб-сервисов, которые все еще существуют... в частности, веб-сервис Lists, доступный по адресу /_vti_bin/Lists.asmx, Этот веб-сервис имеет GetListItems метод, который принимает сообщение SOAP, в котором вы можете указать опцию запроса для расширения повторения, как на стороне сервера.

Вот пример, демонстрирующий, как вы можете запрашивать веб-сервис Lists с помощью простого JavaScript:

// 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 />,

Неделя, месяц и год будут проверять события в течение той же недели, месяца или года текущей даты.

Чтобы проверить диапазон дат относительно некоторой даты, отличной от сегодняшней, вы можете добавить <CalendarDate> узел к <QueryOptions> узел запроса CAML, как показано ниже.

"<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 /> не уважать CalendarDate значение.

Другие вопросы по тегам