Apps 脚本 - For 循环很慢。如何让它更快?

Tan*_*ane 0 javascript for-loop google-sheets google-apps-script

我的电子表格有一列 (A),其中包含 1000 多行值,例如 10.99\xe2\x82\xac、25.99 \xe2\x82\xac 等。出于优化目的,我循环浏览此列并删除“EUR”标记并替换“.”。和 ”,”。虽然代码有效,但我的问题是执行时间非常长,并且对于数千种产品有时会超时。我知道我可能没有遵循最佳实践,但由于我有限的 JavaScript 技能,这是我能想到的最佳解决方案。有什么帮助吗?

\n

\r\n
\r\n
function myFunction() {\n  var ss = SpreadsheetApp.getActive();\n  var sheet = ss.getSheetByName(\'Table\');\n  var lastRow = sheet.getRange(1,1).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow();\n  for (var i = 1; i < lastRow +1; i++) {\n    var price = sheet.getRange(i,1).getValue();\n    var removeCur = price.toString().replace(" EUR","").replace(".",",");\n    sheet.getRange(i,1).setValue(removeCur);\n  }\n}
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

Yur*_*ich 7

这是一个经典的问题。经典答案 - 你需要替换cell.getValue()range.getValues(). 以这种方式获得二维数组。使用循环(或映射等)处理数组。然后立即将数组的所有值设置回工作表上range.setValues()

https://developers.google.com/apps-script/guides/support/best-practices?hl=en

对于这种情况,可能是这样的:

function main() {
  var ss    = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName('Table');
  var range = sheet.getDataRange();
  var data  = range.getValues(); // get a 2d array

  // process the array (make changes in first column)
  const changes = x => x.toString().replace(" EUR","").replace(".",",");
  data = data.map(x => [changes(x[0])].concat(x.slice(1,)));

  range.setValues(data);  // set the 2d array back to the sheet
}
Run Code Online (Sandbox Code Playgroud)

以防万一,这里是与循环相同的代码for

function main() {
  var ss    = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName('Table');
  var range = sheet.getDataRange();
  var data  = range.getValues();

  for (var i=0; i<data.length; i++) {
    data[i][0] = data[i][0].toString().replace(" EUR","").replace(".",",")
  }
  
  range.setValues(data);  
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,循环for看起来可能比map.

如果您确定所有更改都将在 A 列中,则通过以下方式更改函数中的第三行,可以使脚本运行得更快:

var range = sheet.getRange("A1:A" + sheet.getLastRow());
Run Code Online (Sandbox Code Playgroud)

它将范围缩小到一列。