【发布时间】:2018-01-25 20:48:07
【问题描述】:
之前,我询问过如何让“删除重复项”功能更高效。 Jordan Runner 和 Ed Nelson 在其他地方帮助了我,由此产生的代码对我的工作产生了巨大的积极影响。我也有一个“删除关键字”功能,该功能适用于少于 1,500 行的工作表。但是任何更大的东西都需要很长时间,有时会碰到“超过最大执行时间”。
如果有两个或三个关键字,即使我的代码也能正常工作。然而,我需要从有时超过 20,000 行(2 列)的工作表中删除大约 1,000 个关键字。有了这么大的工作表,我的代码不适合目的,我求助于将工作表分解成 2k 块。有人可以帮助使代码可用于大约 20,000 行的大工作表和需要删除的 1,000 个关键字集吗?
function removeKeywords() {
var sheet = SpreadsheetApp.getActiveSheet();
var rows = sheet.getDataRange();
var numRows = rows.getNumRows();
var values = rows.getValues();
var rowsDeleted = 0;
for (var i = 0; i <= numRows - 1; i++) {
var row = values[i];
if (row[0].toLowerCase().indexOf("keyword1") > -1) {
sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
rowsDeleted++;
}
if (row[0].toLowerCase().indexOf("keyword2") > -1) {
sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
rowsDeleted++;
}
if (row[0].toLowerCase().indexOf("keyword3") > -1) {
sheet.deleteRow((parseInt(i)+1) - rowsDeleted);
rowsDeleted++;
}
}
}
如其他地方所述,我是自学成才的。
【问题讨论】:
-
这实际上是一个非常棘手的问题。您是否需要匹配单元格中任意位置的关键字,还是必须完全匹配(例如,
hello world是否匹配关键字hello)? -
前者,即如果“democ”是目标关键词,那么所有包含“democracy”和“democratic”的单元格都需要被删除。这就是该功能目前的工作方式,我想保留这个有用的功能。
-
是的,这是一件非常棘手的事情,因为复杂性很快就会增加。您的代码是一种合理的方法,时间复杂度 O*(*n*×*m*×*x),n 是行数,m 是关键字的数量,x 是在单元格中搜索关键字的复杂度(取决于
indexOf使用的搜索算法和关键字和搜索文本的长度)。 -
好的,所以我应该坚持将大张纸分成小张的方法。更快的处理器能否克服 Google 电子表格的超时错误?
-
如果您找不到其他解决方案,我会坚持使用该方法或更改函数以接受一系列单元格,然后在一张表中多次调用它(您可以自动选择下一个每次运行后的范围,这将使它不那么乏味)。更快的处理器对您没有帮助,因为 Apps 脚本运行在 Google 的服务器上,而不是您的计算机上。
标签: javascript google-apps-script google-sheets