0

SharePoint リスト ビューで、選択したリスト アイテムを複製したいと考えています。私のコードは、アイテムが 1 つしか選択されていない場合は機能しますが、複数の場合は失敗します。コードをデバッグすると、成功のコールバックを呼び出す前に、最初に選択されたすべてのアイテムを通過することがわかります。また、成功コールバック内では、currItem が常に項目データで満たされるとは限りません。

選択した項目を 1 つずつ取得して処理するにはどうすればよいですか?

function copySelected(){
if($("#copyAllButton").hasClass('ms-cui-disabled')){
    return;
}
var cc = null;
var web = null;
copyCounter = 0;
failedCounter = 0;
cc = new SP.ClientContext.get_current();
web = cc.get_web();
var currItem = null;
notifyId = SP.UI.Notify.addNotification(duplicatingItemsNotification, true);
var selectedItems; 
currList = web.get_lists().getById(SP.ListOperation.Selection.getSelectedList());
selectedItems = SP.ListOperation.Selection.getSelectedItems();
if( selectedItems.length > 0 ){
    for(var i in selectedItems){
        //var currItemID = selectedItems[i].id;
        currItem = currList.getItemById(selectedItems[i].id);
        cc.load(currItem);
        cc.executeQueryAsync(function(sender, args){
            var itemCreateInfo = new SP.ListItemCreationInformation();
            var aListItem = currList.addItem(itemCreateInfo);
                aListItem.set_item('Title', currItem.get_item('Title'));
                aListItem.set_item('Customer', currItem.get_item('Customer'));
                aListItem.set_item('Description', currItem.get_item('Description'));
                aListItem.set_item('Source', currItem.get_item('Source'));
                aListItem.set_item('field2', currItem.get_item('field2'));
                aListItem.set_item('field3', currItem.get_item('field3'));
                aListItem.set_item('Workloadtype', currItem.get_item('Workloadtype'));
                aListItem.set_item('Tickettype', currItem.get_item('Tickettype'));
                aListItem.set_item('Customergroup', currEngineer.group);
                aListItem.set_item('Allocation', currEngineer.allocation);
                aListItem.set_item('SubCap', currItem.get_item('SubCap'));
                aListItem.set_item('Engineer', currEngineer.fullName);
                aListItem.update();
                cc.load(aListItem);
                cc.executeQueryAsync(function(){
                    copyCounter ++;
                },function(){
                    failedCounter ++;
                });
        }, Function.createDelegate(this,this.getItemFailed));
    }
    notifyMe();
}

}

4

1 に答える 1

1

そうこうしているうちに解決策が見つかりました(質問に対する問題を再考するのは良かったです)。

必要なアイテムの配列にクエリを入力し、配列を処理します。

 var allSelectedItems;

 function copySelected(){
if($("#copyAllButton").hasClass('ms-cui-disabled')){
    return;
}
var cc = null;
var web = null;
copyCounter = 0;
failedCounter = 0;
cc = new SP.ClientContext.get_current();
web = cc.get_web();
//var currItem = null;
notifyId = SP.UI.Notify.addNotification(duplicatingItemsNotification, true);
var selectedItems; 
currList = web.get_lists().getById(SP.ListOperation.Selection.getSelectedList());
selectedItems = SP.ListOperation.Selection.getSelectedItems();
if( selectedItems.length > 0 ){
    allSelectedItems = new Array(selectedItems.length);
    for(var i in selectedItems){
        allSelectedItems[i] = currList.getItemById(selectedItems[i].id);
        cc.load(allSelectedItems[i]);
    }
    cc.executeQueryAsync(Function.createDelegate(this, this.getItemSucceded), Function.createDelegate(this, this.getItemFailed));
    notifyMe();
}

}

于 2013-08-28T07:49:51.653 に答える