2016-05-18 3 views
0

Привет, я получил список sharepoint с 7972 элементами, и я хочу удалить все элементы в списке. Сначала я попробовал это с остальными api и не имел успеха. Так что я пробую его с javascript с https://msdn.microsoft.com/en-us/library/office/jj163201.aspx.Как удалить из списка sharepoint?

Это мой код до сих пор:

<script type="text/javascript"> 

    var siteUrl = "/test/testfiles"; 
    var listName = "Error Documentation"; 

    $(document).ready(function() { 
     var scriptbase = "www.example.at"; 
     $.getScript(scriptbase + "SP.Runtime.js", function() { 
      $.getScript(scriptbase + "SP.js", doNext); 
     }); 
    }); 

    function doNext() 
    { 
     var clientContext = new SP.ClientContext(siteUrl); 
     spList = clientContext.get_web().get_lists().getByTitle(listName); 

     //The Caml-Query 
     var camlQuery = new SP.CamlQuery(); 
     camlQuery.set_viewXml('<View><ViewFields><FieldRef Name="Controller" /><FieldRef Name="ErrorCode" /><FieldRef Name="ErrorText" /><FieldRef Name="ErrorDescription" /></ViewFields><RowLimit>10000</RowLimit></View>'); 

     //get all Items from the list 
     var collListItem = spList.getItems(camlQuery); 

     clientContext.load(collListItem); 

     //Execute the query 
     clientContext.executeQueryAsync(function() { 

      var itemCount = collListItem.get_count(); 
      for (var i = itemCount - 1; i >= 0; i--) { 
       var oListItem = collListItem.itemAt(i); 
       oListItem.deleteObject(); 
      }; 

      //Final Delete order 
      clientContext.executeQueryAsync(); 
     }); 

    } 

</script> 

Acording в отладчик из браузера Internet Explorer все работает без каких-либо ошибок. Даже последние clientContext.executeQueryAsync(); вызывается, но в списке sharepoint ничего не меняется.

Таким образом, любые рекомендации или помощь будут отличными и благодарны за ваше время.

Edit: здесь исключение я получаю: Sys.ArgumentException: Value does not fall within the expected range. Parameter name: serverRelativeUrlOrFullUrl

Edit2: Вот теперь работает код:

<script type="text/javascript"> 

    var siteUrl = "/knowledge/lzpowerbase"; 
    var listName = "Error Documentation"; 

    $(document).ready(function() { 
     ExecuteOrDelayUntilScriptLoaded(doNext, "SP.Runtime.js"); 
     }); 

    function doNext() { 
     var clientContext = new SP.ClientContext(siteUrl); 
     spList = clientContext.get_web().get_lists().getByTitle(listName); 

     //The Caml-Query 
     var camlQuery = new SP.CamlQuery(); 
     camlQuery.set_viewXml('<View><ViewFields><FieldRef Name="Controller" /><FieldRef Name="ErrorCode" /><FieldRef Name="ErrorText" /><FieldRef Name="ErrorDescription" /></ViewFields><RowLimit>10000</RowLimit></View>'); 

     //get all Items from the list 
     var collListItem = spList.getItems(camlQuery); 

     clientContext.load(collListItem); 

     //Execute the query 
     clientContext.executeQueryAsync(function() { 

      var itemCount = collListItem.get_count(); 
      for (var i = itemCount - 1; i >= 0; i--) { 
       this.oListItem = collListItem.itemAt(i); 
       this.oListItem.deleteObject(); 

       //Final Delete order 
       clientContext.executeQueryAsync(function() { console.log('success'); }, 
       function (args) { console.log(args.get_message()); }); 

      }; 


     }); 

    } 

</script> 

ответ

1

Вполне возможно, что ваш запрос (удаление 8000 элементов) является слишком большой. Попробуйте переместить executeQueryAsync(); в for-loop. Это приведет к некоторому замедлению производительности, но если это сработает, вы можете изменить скрипт, чтобы удалить элементы в партиях 500 или что-то в этом роде.

Кроме того, чтобы получить четкое сообщение об ошибке, добавьте обработчик успеха и неудач в вашем executeQueryAsync вызова, как:

clientContext.executeQueryAsync(function(){ console.log('success');}, 
function(args){console.log(args.get_message();}); 
+0

спасибо за tipp с клиентом. Контекст в цикле работает даже с 8000 элементами. Просто очень медленно. – opelhatza

+1

Ну, чтобы ускорить его, вы можете держать счетчик с переменной и просто выполнить executeQueryAsync, например, каждые 200 элементов были удалены. В любом случае это ускорилось бы. – Verthosa

1

Еще одна вещи: Вы можете использовать функции SharePoint для ожидания скриптов вместо этого scriptbase материал:

ExecuteOrDelayUntilScriptLoaded(doNext, "SP.Runtime.js"); 
//or 
_spBodyOnLoadFunctionNames.push("doNext"); 
+0

Почему? плохой файл сценария? есть что-то, чего я не знаю? – opelhatza

+0

нет, это не очень плохо. Но вам это не нужно! Обычно на сайте SharePoint эти ресурсы загружаются автоматически (это занимает некоторое время, поэтому вам нужно подождать, пока они не будут инициализированы). – Nils

+0

Хорошо бы хорошо благодарить и работать. – opelhatza