2

SharePoint カレンダー リストがあり、1 日のイベント数を取得するスクリプトを探しています。たとえば、8 月 10 日の今日、カレンダーに保存されているイベントの数だけを取得したいとします。

どんな提案でも非常に役に立ちます。

4

1 に答える 1

2

JavaScript でカレンダーをクエリする際の問題: 繰り返し

通常、JavaScript を使用して SharePoint からデータを取得することは、REST または JavaScript オブジェクト モデルのいずれかを使用して非常に簡単です (少なくとも SharePoint 2007 以降のバージョンでは)。ただし、カレンダーには、物事を複雑にする可能性のある定期的なイベントを作成する機能があります。

たとえば、定期的なイベントの開始日が 2 年前で、終了日が何年も先の場合がありますが、イベント自体は実際には毎月第 3 火曜日にしか発生しない場合があります。リストに対してクエリを実行し、今日の日付を開始日と終了日と比較して重複しているかどうかを確認すると、その定期的なイベントが結果に表示されます (今日は月の第 3 火曜日ではありません)。

サーバー側のコードでは、リストのクエリに使用するSPQueryオブジェクトでExpandRecurrenceプロパティを true に設定することで、これを回避できます。ただし、SP2010 および SP2013 の時点では、そのプロパティは同等の JavaScript オブジェクト モデルでは公開されていません。


回避策: Lists.GetListItems Web サービスを使用する**

別の方法は、まだ出回っている古い Web サービスの 1 つを使用することです。具体的にはでアクセスできるLists Web サービス/_vti_bin/Lists.asmxです。この Web サービスにはGetListItems、SOAP メッセージを受け入れるメソッドがあり、クエリ オプションを指定して、サーバー側で行うように繰り返しを展開できます。

プレーンな JavaScript を使用してLists Web サービスをクエリする方法を示す例を次に示します。

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

Week、Month、および Year は、現在の日付と同じ週、月、または年内のイベントをチェックします。

今日以外の日付に関連する日付範囲を確認するには、以下に示すように、CAML クエリ<CalendarDate>のノードにノードを追加できます。<QueryOptions>

"<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

于 2016-08-10T21:32:47.577 に答える