我正在尝试导入大约的CSV。将GMail附件中的7500行添加到Google表格中,执行时间超过允许的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]));
}
答案 0 :(得分:2)
这一行:
var csvData = Utilities.parseCsv(attachmentCleanA);
创建二维数组。 Google Documentation - parseCsv
如果您的csvData
变量确实是2D数组,那么您需要做的就是使用这行代码而不使用for
循环:
newsheet.getRange(1, 1, csvData.length, csvData[0].length).setValues(csvData);
范围从第一行第一列开始,并设置一个范围,该范围是csvData外部数组的长度,以及第一个内部数组中元素数量的列数。
请注意,如果您的数据具有不同长度的内部数组,setValues()
将产生错误。
如果你的所有内部数组不长度相同,那么你可以不避免遍历每个内部数组。但是,我不知道你的数据是什么样的。如果您的CSV中的每行数据都包含相同数量的vales,那么您就不需要for
循环。
因此,改进一直占用的代码部分完全取决于行是否都是相同的长度。
您不应该使用new Array()
方法中的setValues()
部分。如果csvData
数组确实是一个很好的2D数组,那么它已经是一个数组。您不需要从已经是数组的东西创建另一个数组。