我正在尝试导入大约 CSV 文件。从 GMail 附件到 Google 表格中有 7500 行,执行时间超过了允许的 6 分钟。
我正在关注本教程:https://developers.google.com/apps-script/articles/docslist_tutorial#section2我的代码列在下面
一直消耗时间的部分是将数据推送到新工作表中:
// Push data into the sheet
for ( var n=0, lenCsv=csvData.length; n<lenCsv; n++ ) {
newsheet.getRange(n+1, 1, 1, csvData[n].length).setValues(new Array(csvData[n]));
}
有什么方法可以提高其性能并使其更快吗?
提前致谢。
下面列出了我的代码。
var attachmentData = attachments[k].getDataAsString();
var attachmentClean = attachmentData.split(' ').join(',');
var attachmentCleanA = attachmentClean.split(',');
var csvData = Utilities.parseCsv(attachmentCleanA);
var SheetName = String(csvData[1]).substring(5,7)+ "-" + String(csvData[1]).substring(0,4);
Logger.log("SheetName:"+SheetName);
ss = SpreadsheetApp.openById('XXXXXXXXX');
var sheet = ss.getSheetByName(SheetName);
if (sheet == null){
var newsheet = ss.insertSheet(SheetName);
}else{
sheet.clearContents();
var newsheet = sheet;
}
Logger.log("Entering "+csvData.length+" rows");
// Push data into the sheet
for ( var n=0, lenCsv=csvData.length; n<lenCsv; n++ ) {
newsheet.getRange(n+1, 1, 1, csvData[n].length).setValues(new Array(csvData[n]));
}
最佳答案
这一行:
var csvData = Utilities.parseCsv(attachmentCleanA);
创建一个二维数组。 Google Documentation - parseCsv
如果您的 csvData
变量确实是一个二维数组,那么您所需要做的就是使用这行代码而不使用 for
循环:
newsheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
范围从第一行第一列开始,并设置一个范围,该范围是 csvData 外部数组的长度,列数为第一个内部数组中的元素数。
请注意,如果您的数据具有不同长度的内部数组,setValues()
将产生错误。
如果所有内部数组的长度不相同,那么您不能避免循环遍历每个内部数组。但是,我不知道你的数据是什么样的。如果 CSV 中的每行数据在行中具有相同数量的值,则不需要 for
循环。
因此,改进一直占用的代码部分完全取决于行的长度是否相同。
您不需要 setValues()
方法中的 new Array()
部分。如果 csvData 数组确实是一个好的二维数组,那么它就已经是一个数组了。您不需要从已经是数组的内容创建另一个数组。
关于csv - 将 CSV 导入表格需要太长时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33816223/