将CSV导入表格需要太长时间

时间:2015-11-19 23:23:32

标签: google-apps-script

我正在尝试导入大约的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]));
      }  

1 个答案:

答案 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数组,那么它已经是一个数组。您不需要从已经是数组的东西创建另一个数组。