我关注了Google的Interacting With Your Docs List tutorial如何编写导入CSV文件的脚本。经过很多帮助,我得到了它的工作。但是,当我尝试复制它或以任何方式修改它时,它会超时并显示错误消息:
超过最长执行时间。
......并且没有运行。为什么会发生这种情况?
这是教程中的importFromCSV()
函数:
function importFromCSV() {
var fileName = Browser.inputBox("Enter the name of the file in your Docs List to import (e.g. myFile.csv):");
var files = DocsList.getFiles();
var csvFile = "";
for (var i = 0; i < files.length; i++) {
if (files[i].getName() == fileName) {
csvFile = files[i].getContentAsString();
break;
}
}
var csvData = CSVToArray(csvFile, ",");
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getActiveSheet();
for (var i = 0; i < csvData.length; i++) {
sheet.getRange(i+1, 1, 1, csvData[i].length).setValues(new Array(csvData[i]));
}
}
答案 0 :(得分:2)
CSV导入示例针对每一行执行CSVToArray
调用。那很慢。
查看Best Practices Doc中的建议。第一条指导是减少对其他服务的呼叫;更改示例以更新数组的所有行,然后只调用var arrData = [[]]
一次,您将大大提高性能。
替换它:
for (var i = 0; i < csvData.length; i++) {
sheet.getRange(i+1, 1, 1, csvData[i].length).setValues(new Array(csvData[i]));
}
有了这个:
sheet.clear();
var numRows = csvData.length;
var numCols = csvData[0].length; // assume all rows are same width
// Make a single call to spreadsheet API to write values to sheet.
sheet.getRange(1, 1, numRows, numCols).setValues( csvData );
SpreadsheetApp.flush();
我还发现我需要更改var arrData = new Array()
中的几行,而不是像这样声明数组:setValues()
,我使用了这个:setValues
。它应该无关紧要(在JavaScript中),但确实如此(在Google Apps脚本中)。