2016-08-16 87 views
0

我有一個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()); 
}); 

它工作得很好,但我檢索類別「訪問」的最後一個事件的標題。 我想要的是:檢索當天的事件的類別是「訪問」的計數。

任何幫助將受到歡迎。

回答

1

喜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您的幫助

0

當您在當前日期使用篩選器獲得正確的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

1

獲取的項目數在您的列表項目集合

您可以訪問列表項目集合的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