Получить номер события из календаря 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
значение.