JavaScriptをSharePointに追加し、ライブラリからExcelドキュメントまたはその中のデータを取得する関数を記述しようとしています。その方法はすでにわかりましたが、問題のファイルが大きすぎて返せません。ajaxのサイズ制限を手動で設定することを検討しましたが、これを行う方法が見つからなかったため、プランBは各行にクエリを送信します
$("#button").click(function() {
readFileRow(libraryUrl, "FileName.xlsx", "Sheet1", 1, "E", [])
.done(function(cells) {
console.log(xmlToJson(cells.documentElement));
});
});
/**
* Reads a file in SharePoint Library via ExcelRest and returns the document
*
* @params string libraryUrl
* @params string fileName
* @params string sheetName
* @params int rowNum
* @params string lastColumn
* @params string[][] finalResults
*
* @returns string[][]
**/
function readFileRow(libraryUrl, fileName, sheetName, rowNum, lastColumn, finalResults) {
var fileUrl = libraryUrl + "/" + fileName + "/Model/Ranges('" + sheetName + "!A" + rowNum + "|" + lastColumn + rowNum + "')?$format=atom";
return $.ajax({
url: fileUrl,
type: "GET",
error: function (request, status, error) {
console.log(error);
},
}).done(function(data) {
jsonData = xmlToJson(data.documentElement);
cells = serializeRange(jsonData);
if(cells) {
finalResults.push(cells);
rowNum++;
finalResults = readFileRow(libraryUrl, fileName, sheetName, rowNum, lastColumn, finalResults);
}
return $.when(finalResults);
});
}
ご覧のとおり、リクエストでデータが返されたときに関数を再帰的に呼び出すことで非同期の問題を回避しようとしています。つまり、実行を継続する必要があります。戻る直前にconsole.log()を配置すると、結果が必要に応じてコンパイルされていることがわかります。ただし、readFileRow()の呼び出しからの戻りは、プロセスが完了する前に返され、最初のajaxクエリからの応答で構成され、明らかに.done()関数を介して実行されていません。ajax呼び出しの前にある戻り値を削除しようとしましたが、戻り値はもはや処理できず、したがって.done()関数がないため、例外が発生するだけです。
誰もがこの機能の何が悪いのかを見つけることができますか?非同期関数は私の強みではなく、私はかなり困惑しています。