我正在尝试优化一个 Google Apps 脚本,该脚本反向迭代电子表格中的行(从下到上)。该脚本会检查该行中的第一个单元格是否已过去 15 天,并检查第 12 列是否有字符串“Yes”,如果两个条件都为 true,则该行将从一张纸移动到另一张纸。
我遇到的问题是,我迭代所有 2500 行数据并期望变得更大,超出了分配的时间(6 分钟)。
我确信类似的问题已经在这里得到了多次解答,但鉴于我当前的编程技能水平,我无法应用我在这里找到的解决方案。任何帮助将不胜感激。
这是工作表的格式:
1st column 12th column
+-----------+-----/ /-----+-------------+
| Date | | Refunded? |
+-----------+-----/ /-----+-------------+
| 8/29/2017 | | YES |
+-----------+-----/ /-----+-------------+
| 9/26/2017 | | NO |
+-----------+-----/ /-----+-------------+
这是脚本:
function myFunction() {
// get compare date (15 days from current date
var compareDate = new Date().getTime() - (15 * (1000 * 60 * 60 * 24));
// get sheets in spreadsheet
var target = SpreadsheetApp.getActiveSpreadsheet().getSheets()[1];
var arr = [];
// get 1st sheet data
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
var values = sheet.getDataRange().getValues();
var r = values.length;
// logic
while (r >= 1) {
if (values[r] && values[r][0].getTime() < compareDate && values[r][12].toLowerCase() == "yes" ) {
arr.push(values[r])
sheet.deleteRow(r + 1)
}
r--;
}
target.getRange(target.getLastRow() + 1, 1, arr.length, arr[0].length).setValues(arr.reverse())
}
如果我注释掉以下代码行“sheet.deleteRow(r + 1)”,脚本几乎立即完成,因此这似乎是减慢脚本执行速度的罪魁祸首。有没有更有效的解决方案来解决这个问题?
最佳答案
不要通过迭代删除一行,而是使用 deleteRows(rowPosition, howMany) 在脚本末尾一次性删除所有行。 。该行代码可能类似于以下代码:
sheet.deleteRows(2, values.length - 1);
关于javascript - 优化二维数组的迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46963814/