选择所有CSV然后将全部粘贴到Google表格 - 超时问题

时间:2018-05-03 22:25:17

标签: csv google-apps-script google-sheets

首先,此代码完全符合我需要它处理一个问题,如果有太多数据要移动,Google会超时并将结束此过程。完全诚实/透明,我是一个完整的脚本代码菜鸟,所以我可能会遗漏一些非常简单的东西。据我所知,这些代码逐行堆叠数据,如果有太多行,这就是我的故障所在。有没有为什么只选择所有数据,并粘贴所有数据?谢谢你的帮助!

function importDataCDOP() {
  var fSource = DriveApp.getFolderById('FILE PATH'); 
  var fi = fSource.getFilesByName('xxxx.csv'); 
  var ss = SpreadsheetApp.openById('FILE PATH');     
  if ( fi.hasNext() ) { 

    var ss1 = SpreadsheetApp.getActiveSpreadsheet();
    var first = ss.getSheetByName('NEWDATA');

    var file = fi.next();
    var csv = file.getBlob().getDataAsString();
    var csvData = CSVToArray(csv); 
    var newsheet = ss.getSheetByName('NEWDATA'); 

    var destSheet = ss.getSheetByName('NEWDATA');
    var lastRow = destSheet.getLastRow();
    destSheet.insertRowAfter(lastRow);
    for ( var i=0, lenCsv=csvData.length; i<lenCsv; i++ ) {
      destSheet.getRange(lastRow + i + 1, 1, 1, csvData[i].length).setValues(new Array(csvData[i]));
    }


     file.setName("OP report-"+(new Date().toString())+".csv");
  }
};

function CSVToArray( strData, strDelimiter ) {
  strDelimiter = (strDelimiter || ",");

  var objPattern = new RegExp(
    (
      "(\\" + strDelimiter + "|\\r?\\n|\\r|^)" +
      "(?:\"([^\"]*(?:\"\"[^\"]*)*)\"|" +
      "([^\"\\" + strDelimiter + "\\r\\n]*))"
    ),
    "gi"
  );

  var arrData = [[]];
  var arrMatches = null;
  while (arrMatches = objPattern.exec( strData )){
    var strMatchedDelimiter = arrMatches[ 1 ];
    if (
      strMatchedDelimiter.length &&
      (strMatchedDelimiter != strDelimiter)
    ){
      arrData.push( [] );

    }

    if (arrMatches[ 2 ]){
      var strMatchedValue = arrMatches[ 2 ].replace(
        new RegExp( "\"\"", "g" ),
        "\""
      );

    } else {
      var strMatchedValue = arrMatches[ 3 ];

    }
    arrData[ arrData.length - 1 ].push( strMatchedValue );
  }
  return( arrData );
};

1 个答案:

答案 0 :(得分:0)

从您的问题和评论中,我可以理解您要从&#34; xxxx.csv&#34;的文件中导入csv数据。在&#34; NEWDATA&#34;在&#34; FILE PATH&#34;的电子表格中,当导入大型csv数据时,经过的时间超过了Google Apps脚本的时间限制。我明白这是你的问题。对于这种情况,这个修改怎么样?虽然我不确定此修改是否可以直接解决您的问题,但请尝试运行此操作。

修改要点:

  • 使用getFilesByName('xxxx.csv').next()检索文件对象,因为csv文件只有一个。
  • 您的脚本中未使用
  • var first = ss.getSheetByName('NEWDATA');var newsheet = ss.getSheetByName('NEWDATA');
    • 删除了它们。
  • 在您的脚本中,每个元素都会导入csv数据的二维数组。
    • 我认为这可能是导致问题的主要原因。
    • 在修改后的脚本中,一次导入二维数组。

修改后的脚本:

我只修改了importDataCDOP()

function importDataCDOP() {
  var fSource = DriveApp.getFolderById('FILE PATH');
  var file = fSource.getFilesByName('xxxx.csv').next();
  var ss = SpreadsheetApp.openById('FILE PATH');
  var csv = file.getBlob().getDataAsString();
  var csvData = CSVToArray(csv).filter(String);
  var destSheet = ss.getSheetByName('NEWDATA');
  destSheet.getRange(destSheet.getLastRow() + 1, 1, csvData.length, csvData[0].length).setValues(csvData);
  file.setName("OP report-"+(new Date().toString())+".csv");
};

注意:

  • 我没有修改CSVToArray()
  • filter(String)删除仅包含换行符的元素。
  • 如果此修改后的脚本超出了执行时间的限制,我建议使用Sheets API。

如果我误解了你的问题并且修改后的脚本的使用时间超过了限制,我很抱歉。