-1

我遵循了 Google 的Interacting With Your Docs List 教程,了解如何编写导入 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]));
  }
}
4

1 回答 1

2

CSV 导入示例CSVToArray对每一行进行调用。那很慢。

查看最佳实践文档中的建议。第一条指导是减少对其他服务的调用;更改示例以更新数组的所有行,然后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 脚本中)。

于 2013-02-04T21:09:40.523 回答