获取列表项目数

问题描述:

我有一个SharePoint日历,事件类别(“访问”,“会议”...) 我想检索当天事件女巫的类别是“访问”的计数。 这里是我的脚本:获取列表项目数

var clientContext = SP.ClientContext.get_current(); 
    var list = clientContext.get_web().get_lists().getByTitle("Artdesk-calendrier"); 
    var caml = new SP.CamlQuery(); 
caml.set_viewXml("<View><Query>"+ 
    "<Where>"+ 
     "<And>"+ 
      "<Eq><FieldRef Name=\"Category\" /><Value Type=\"Choice\">Visite</Value></Eq>" + 
      "<And>"+ 
       "<Leq><FieldRef Name=\"EventDate\"/><Value Type=\"DateTime\" IncludeTimeValue=\"False\"><Today Offset=\"1\"/></Value></Leq>"+ 
       "<Geq><FieldRef Name=\"EndDate\"/><Value Type=\"DateTime\" IncludeTimeValue=\"False\"><Today /></Value></Geq>"+ 
      "</And>"+ 
     "</And>"+ 
    "</Where>"+ 
"</View></Query>"); // empty query also works 

var listItemCollection = list.getItems(caml); 

clientContext.load(listItemCollection); 
clientContext.executeQueryAsync(function() { 
    var listItemEnumerator = listItemCollection.getEnumerator(); 
    var count = 0; 
var eventsToday = []; 
var eventsTomorrow = []; 
var today = new Date(); 
today.setHours(0); today.setMinutes(0); today.setSeconds(0); today.setMilliseconds(0); 
var tomorrow = new Date(today); 
tomorrow.setDate(tomorrow.getDate()+1); 
while (listItemEnumerator.moveNext()) { 
    count++; 
    var item = listItemEnumerator.get_current(); 
    var startDate = item.get_item("EventDate"); 
    var endDate = item.get_item("EndDate"); 
    var title = item.get_item("Title"); 
    if(endDate < tomorrow || eventDate < tomorrow){ 
     eventsToday.push(title); 
    }else{ 
     eventsTomorrow.push(title); 
    } 
} 
document.getElementById("TodaysEvents").innerHTML = eventsToday.join("\n"); 
document.getElementById("TomorrowsEvents").innerHTML = eventsTomorrow.join("\n"); 
document.getElementById("alerte1").innerHTML = count; 
}, function(sender, args) { 
    window.console && console.log(args.get_message()); 
}); 

它工作得很好,但我检索类别“访问”的最后一个事件的标题。 我想要的是:检索当天的事件的类别是“访问”的计数。

任何帮助将受到欢迎。

喜iv'e找到了解决方案,使天+ 1计: 我有变化,它工作得很好,这里是整个脚本:

function getevents() 
{ 
var clientContext = SP.ClientContext.get_current(); 
    var list = clientContext.get_web().get_lists().getByTitle("Artdesk-calendrier"); 
    var caml = new SP.CamlQuery(); 
caml.set_viewXml("<View><Query>"+ 
    "<Where>"+ 
     "<And>"+ 
      "<Eq><FieldRef Name=\"Category\" /><Value Type=\"Choice\">Visite</Value></Eq>" + 
      "<And>"+ 
       "<Leq><FieldRef Name=\"EventDate\"/><Value Type=\"DateTime\" IncludeTimeValue=\"False\"><Today OffsetDays='1'/></Value></Leq>"+ 
       "<Geq><FieldRef Name=\"EndDate\"/><Value Type=\"DateTime\" IncludeTimeValue=\"False\"><Today /></Value></Geq>"+ 
      "</And>"+ 
     "</And>"+ 
    "</Where>"+ 
"</View></Query>"); // empty query also works 

var listItemCollection = list.getItems(caml); 

clientContext.load(listItemCollection); 
clientContext.executeQueryAsync(function() { 
    var listItemEnumerator = listItemCollection.getEnumerator(); 
    var count_ajrd = 0; 
    var count_demain = 0; 
var eventsToday = []; 
var eventsTomorrow = []; 
var today = new Date(); 
today.setHours(0); today.setMinutes(0); today.setSeconds(0); today.setMilliseconds(0); 
var tomorrow = new Date(today); 
tomorrow.setDate(tomorrow.getDate()+1); 
while (listItemEnumerator.moveNext()) { 

    var item = listItemEnumerator.get_current(); 
    var startDate = item.get_item('EventDate'); 
    var endDate = item.get_item('EndDate'); 
    var title = item.get_item('Title'); 
    if(endDate < tomorrow || startDate < tomorrow){ 
     eventsToday.push(title); 
     count_ajrd++; 
    }else{ 
     eventsTomorrow.push(title); 
     count_demain++; 
    } 
} 
document.getElementById("alerte2").innerHTML = eventsToday.join("\n"); 
document.getElementById("alerte1").innerHTML = eventsTomorrow.join("\n"); 
document.getElementById("todaynum").innerHTML = count_ajrd; 
document.getElementById("tomorrownum").innerHTML = count_demain; 
}, function(sender, args) { 
    window.console && console.log(args.get_message()); 
}); 
} 

感谢@Thriggle您的帮助

当您在当前日期使用筛选器获得正确的CAML查询时,您可以在您的查询中加载后,在列表项集合中使用get_itemCount()方法获取项目编号。试试下面的代码

clientContext.executeQueryAsync(function() { 
    window.console && console.log('Total Visits: ' + list.get_itemCount()); 
}, function(sender, args) { 
    window.console && console.log(args.get_message()); 
}); 
+0

我尝试你的代码,它不工作,我有一个错误: 未捕获TypeError:listItemCollection。get_itemCount不是函数 它看起来不正确 – ysfibm

+0

我的badania,你应该使用列表对象上的'get_itemCount'。我已经修改了 – nizzik

获取的项目数在您的列表项目集合

您可以访问列表项目集合的Count属性直接作为Nizzik建议(使用listItemCollection.get_count()),或做一些简单的数学如下所示。

var count = 0; 
while (listItemEnumerator.moveNext()) { 
    count++; 
} 
document.getElementById("alerte1").innerHTML = count; 

限制搜索结果,以今天的和明天的活动

如果你没有任何周期性事件担心,您可以更新CAML查询来筛选结果,从而限制了该启动事件明天或早些时候,今天或晚些时候结束。使用EventDate字段筛选“开始日期”和EndDate字段以筛选“结束日期”(这些是这些字段的内部名称)。

你造成CAML查询最终可能会看起来像这样:

"<View><Query>"+ 
    "<Where>"+ 
     "<And>"+ 
      "<Leq><FieldRef Name=\"EventDate\"/><Value Type=\"DateTime\" IncludeTimeValue=\"False\"><Today Offset=\"2\"/></Value></Leq>"+ 
      "<Geq><FieldRef Name=\"EndDate\"/><Value Type=\"DateTime\" IncludeTimeValue=\"False\"><Today /></Value></Geq>"+ 
     "</And>"+ 
    "</Where>"+ 
"</View></Query>" 

要还它等于“介绍浏览”为您提供的示例代码,你可以使用下面的CAML一个类别限制到事件:

"<View><Query>"+ 
    "<Where>"+ 
     "<And>"+ 
      "<Eq><FieldRef Name=\"Category\" /><Value Type=\"Choice\">Visite</Value></Eq>" + 
      "<And>"+ 
       "<Leq><FieldRef Name=\"EventDate\"/><Value Type=\"DateTime\" IncludeTimeValue=\"False\"><Today Offset=\"1\"/></Value></Leq>"+ 
       "<Geq><FieldRef Name=\"EndDate\"/><Value Type=\"DateTime\" IncludeTimeValue=\"False\"><Today /></Value></Geq>"+ 
      "</And>"+ 
     "</And>"+ 
    "</Where>"+ 
"</View></Query>" 

要那么今天和明天的事件区分开来,可以从while循环中,你通过枚举结果检查他们的EventDateEndDate值。

var count = 0; 
var eventsToday = []; 
var eventsTomorrow = []; 
var today = new Date(); 
today.setHours(0); today.setMinutes(0); today.setSeconds(0); today.setMilliseconds(0); 
var tomorrow = new Date(today); 
tomorrow.setDate(tomorrow.getDate()+2); 
while (listItemEnumerator.moveNext()) { 
    count++; 
    var item = listItemEnumerator.get_current(); 
    var startDate = item.get_item("EventDate"); 
    var endDate = item.get_item("EndDate"); 
    var title = item.get_item("Title"); 
    if(endDate < tomorrow || startDate < tomorrow){ 
     eventsToday.push(title); 
    }else{ 
     eventsTomorrow.push(title); 
    } 
} 
document.getElementById("TodaysEvents").innerHTML = eventsToday.join("<br/>"); 
document.getElementById("TomorrowsEvents").innerHTML = eventsTomorrow.join("<br/>"); 
document.getElementById("alerte1").innerHTML = count; 

你可能需要根据你想怎样画之间的“今天”事件和“明天的赛事,”尤其是在奇怪的情况下,当一个事件开始的第一天,结束于如行自定义逻辑另一个。

+0

以上的代码示例,因为它工作正常,所以我如何将它应用到当前日期以及日期+ 1 示例:今天是16 8月如此 - 我想检索今日女巫的事件数量类别为“访问” ,把它放在div部分。 - 检索日期事件数量+ 1巫婆类别是“访问” – ysfibm

+0

日历中是否有任何重复事件?如果是这样,你可能需要使用[这个答案]中提到的更复杂的技术(http://stackoverflow.com/questions/38876519/retrieve-events-number-from-sharepoint-calendar-using-js/38883928#38883928 )将结果限制在指定的日期范围内;如果您不*重复发生事件,则可以按照正常情况过滤EventDate和EndDate列。 – Thriggle

+0

@Thriggle只要查询没有达到5000项限制就可以工作,我不认为该操作已将任何索引存在 – nizzik