javascript - 获取列表项数

标签 javascript sharepoint office365 caml csom

我有一个 SharePoint 日历,其中包含事件类别(“访问”、“ session ”...) 我想检索类别为“访问”的当天事件的计数。 这是我的脚本:

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());
});

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

欢迎任何帮助。

最佳答案

获取列表项集合中的项数

您可以按照 Nizzik 的建议直接访问列表项集合的 count 属性(使用 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;

您可能需要根据您想要如何在“今天的”事件和“明天的事件”之间划清界限来自定义逻辑,尤其是在奇怪的情况下,例如事件在某一天开始并在另一天结束时。

关于javascript - 获取列表项数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38976540/

相关文章:

javascript - 多列表显示隐藏

javascript - ng-repeat 内的指令双向数据绑定(bind)不起作用

sharepoint - 无法删除内容类型

calendar - 没有明文密码的 Exchange Web 服务服务器到服务器身份验证?

ms-office - 为什么在页面重新加载/重定向后使用旧值初始化 Outlook 的 RoamingSettings 对象?

excel - vb.net Office365共享点检查用户打开的文件

javascript - 如何在javascript中调用tab键事件

javascript - RegExp 仅匹配包含文件名的路径

python - 使用 Python3 更新 Sharepoint 2013

sharepoint - 在构建机器上构建 WSP 文件