我的电子表格有一个 (A) 列,其中包含超过 1000 行的值,例如 10.99 欧元、25.99 欧元等等。出于优化目的,我循环浏览此列并删除“EUR”标记并替换“.”。和 ”,”。虽然代码有效,但我的问题是执行时间超长,而且对于数千种产品,它有时会超时。我知道我可能没有遵循最佳实践,但由于我的 JavaScript 技能有限,这是我能想出的最佳解决方案。有什么帮助吗?
function myFunction() {
var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName('Table');
var lastRow = sheet.getRange(1,1).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow();
for (var i = 1; i < lastRow +1; i++) {
var price = sheet.getRange(i,1).getValue();
var removeCur = price.toString().replace(" EUR","").replace(".",",");
sheet.getRange(i,1).setValue(removeCur);
}
}
答案 0 :(得分:4)
这是一个经典的问题。经典答案——您需要将 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
}
以防万一这里是与循环 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);
}
在这种情况下,循环 for
可能看起来比 map
更干净。
如果您确定所有更改都在 A 列中,您可以通过这种方式更改函数中的第三行,使脚本更快:
var range = sheet.getRange("A1:A" + sheet.getLastRow());
它将范围缩小到一列。
答案 1 :(得分:0)
好吧,您可以采取一些措施来改进您的代码,但不能保证它会帮助您提高代码速度,但我们会拭目以待。
这是更新的版本
function myFunction() {
var ss = SpreadsheetApp.getActive();
var sheet = ss.getSheetByName('Table');
var lastRow = sheet.getRange(1,1).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow() + 1;
var price;
var removeCur;
for (var i = 1; i < lastRow; i++) {
price = sheet.getRange(i,1).getValue();
removeCur = price.toString().replace(" EUR","").replace(".",",");
sheet.getRange(i,1).setValue(removeCur);
}
}
我做了什么:
你可以使用正则表达式进行替换,所以你只做一次,但我认为它更慢,所以我在那里保留了 2 个替换