2016-09-14 5 views
1

各行に最大1つの添付ファイルがあるリストがあり、このリストの各添付ファイルを新しく作成した画像ライブラリにコピーしようとしています。複数の添付ファイルをリストからドキュメントライブラリにjavacriptでコピー

var Files; 
var myContext; 
function CopyAtt(ItemID) { 
try { 
     myContext = new SP.ClientContext.get_current(); 
     var myWeb = myContext.get_site().get_rootWeb(); 

     var folderPath = 'Lists/test/Attachments/' + ItemID; 
     var Folder = myWeb.getFolderByServerRelativeUrl(folderPath); 

     Files = Folder.get_files(); 
     myContext.load(Files); 

     myContext.executeQueryAsync(Function.createDelegate(
            this, ExecuteCopyOnSuccess), 
            Function.createDelegate(
            this, GetLeadsFail));      
    } 
    catch (err) { 
     alert(err.Line); 
    } 
} 

function GetLeadsFail(sender, args) { 
    // Show error message 
    alert('GetLeadsFail() failed:' + args.get_message()); 
} 

function ExecuteCopyOnSuccess(sender, args) { 
    for (var p = 0; p < this.Files.get_count(); p++) { 
     var file = Files.itemAt(p); 
     var filename = file.get_name();  
    }  
    if (filename != null) { 
      var newUrl = 'PictureLibrary/' + filename; 
      file.copyTo(newUrl, true); 
      myContext.executeQueryAsync(null, null); 
    } 
} 
$(document).ready(function() { 
    CopyAtt(3); 
} 

私は$(document).readyからCopyAtt(ItemID)倍数の時間を呼び出そうと、私は次のコードで1つの添付ファイルをコピーすることができる午前

、 はコードがコンソールにエラーを示しています。

Uncaught TypeError: Cannot read property 'collectionHasNotBeenInitialized' of undefined 
Uncaught RangeError: Maximum call stack size exceeded 

私は、それがファイルに関連していると思われるが、私はすべての手がかりを見つけることができない、誰も私にいくつかのアドバイスを与えることができますか?

+0

アタッチメントには名前にアポストロフィが含まれていますか? – Thriggle

+0

いいえ、ほとんどの文字はjpgファイルのみです。 –

答えて

0

私は数日後に解決策を得ましたが、問題はファイルに関連していませんが、myContext.executeQueryAsync(null, null);です。まず

は私がループを切断し、上記のエラーが表示されますCopyAtt(ItemID)

for (i=0; i< Items.Length; i++){ 
     CopyAtt(Items[i]); 
    } 

executeQueryAsync()CopyAtt(ItemID)複数回呼び出します。

ループではなく、再帰でこのようなエラーを回避することができ、 executeQueryAsync()はそれぞれ、完了後にのみ実行されます。

function CopyAtt(Items, itemIndex) { 
try { 
     myContext = new SP.ClientContext.get_current(); 
     var myWeb = myContext.get_site().get_rootWeb(); 

     var folderPath = 'Lists/test/Attachments/' + Items[itemIndex]; 
     var Folder = myWeb.getFolderByServerRelativeUrl(folderPath); 

     Files = Folder.get_files(); 
     myContext.load(Files); 

     myContext.executeQueryAsync(Function.createDelegate(
           this, ExecuteLoadFileSuccess(Items, itemIndex);), 
           Function.createDelegate(
           this, GetLeadsFail));      
    } 
    catch (err) { 
     alert(err.Line); 
    } 
} 
function GetLeadsFail(sender, args) { 
    // Show error message 
    alert('Request failed - ' + args.get_message()); 
} 

function ExecuteLoadFileSuccess(Items, itemIndex, sender, args) { 

    for (var p = 0; p < this.Files.get_count(); p++) { 
     var file = Files.itemAt(p); 
     var filename = file.get_name(); 
    } 

    if (filename != null) { 
      var newUrl = 'PictureLibrary/' + filename; 
      file.copyTo(newUrl, true); 
      myContext.executeQueryAsync(Function.createDelegate(
            this, function(){ExecuteCopyOnSuccess(Items, itemIndex);}), 
            Function.createDelegate(
            this, GetLeadsFail)); 
    } 
} 

function ExecuteCopyOnSuccess(Items, itemIndex, sender, args) { 
    //Call CopyAtt() after copy files success. 
    if (itemIndex <Items.length-1) { 
    CopyAtt(Items, itemIndex+1); 
    } 
} 

$(document).ready(function() { 
     //save all Items ID in an array. 
     var Items = [2,3,6,7,8,10]; 
     CopyAtt(Items, 0); 
} 
+0

あなたはどのようにドキュメントライブラリではなく別のリストにコピーできるのか分かりますか? – user388969

関連する問題