【发布时间】:2016-05-19 06:27:21
【问题描述】:
我刚刚编写了我的第一个谷歌应用脚本,从 VBA 移植,它格式化了一列客户订单信息(感谢您的指导)。
说明:
代码通过它们的 - 前缀标识州代码,然后将以下名字与姓氏(如果存在)结合起来。然后它会在姓氏所在的位置写入“订单完成”。最后,如果订单之间没有间隔,它会插入一个必要的空白单元格(见下图)。
问题:
问题是处理时间。它不能处理更长的数据列。我被警告了
方法 Range.getValue 被脚本大量使用。
现有优化:
根据对this question 的回复,我尝试将尽可能多的变量保留在循环之外,并且还改进了我的 if 语句。 @MuhammadGelbana 建议只调用一次 Range.getValue 方法并使用它的值移动......但我不明白这将/可能如何工作。
代码:
function format() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var s = ss.getActiveSheet();
var lastRow = s.getRange("A:A").getLastRow();
var row, range1, cellValue, dash, offset1, offset2, offset3;
//loop through all cells in column A
for (row = 0; row < lastRow; row++) {
range1 = s.getRange(row + 1, 1);
//if cell substring is number, skip it
//because substring cannot process numbers
cellValue = range1.getValue();
if (typeof cellValue === 'number') {continue;};
dash = cellValue.substring(0, 1);
offset1 = range1.offset(1, 0).getValue();
offset2 = range1.offset(2, 0).getValue();
offset3 = range1.offset(3, 0).getValue();
//if -, then merge offset cells 1 and 2
//and enter "Order complete" in offset cell 2.
if (dash === "-") {
range1.offset(1, 0).setValue(offset1 + " " + offset2);
//Translate
range1.offset(2, 0).setValue("Order complete");
};
//The real slow part...
//if - and offset 3 is not blank, then INSERT CELL
if (dash === "-" && offset3) {
//select from three rows down to last
//move selection one more row down (down 4 rows total)
s.getRange(row + 1, 1, lastRow).offset(3, 0).moveTo(range1.offset(4, 0));
};
};
}
格式更新:
有关使用字体或背景颜色格式化输出的指导,请查看此后续问题here。希望您能从这些专业人士给我的建议中受益:)
【问题讨论】:
-
@Rubén 如果您正在寻找其他答案,我可以问您吗?如果我对您的情况有误解,我深表歉意。
-
@Tanaike 目前的答案集中在 OP 的特定代码上,但有一些概念可以简要解释一下,以便为更广泛的受众提供服务,比如盯着 Google Apps 脚本中处理数组的人.这是因为最近有一个问题,OP 说他们不能使用有关错误消息的问题的答案。
-
还有其他问题的核心答案完全相同:使用批处理操作
-
@Tanaike 别担心,感谢您的时间和问题。
-
@Rubén 例如,这份报告对您的情况有用吗? gist.github.com/tanaikech/d102c9600ba12a162c667287d2f20fe4
标签: javascript optimization multidimensional-array google-apps-script google-sheets