使用TextFinder搜索范围比搜索整个工作表要慢

时间:2019-06-09 18:09:36

标签: google-apps-script google-sheets

我的工作表上有很多行-数千行。我想在特定列中搜索文本。我正在使用Range.createTextFinder,但超时。如果工作表只有4行数据,它甚至会超时。

// This is very slow
var found = sheet.getRange("A:A").createTextFinder("dog").matchCase(false).findNext();

如果我搜索整个工作表,这是非常快的,但是我只想检查特定的列。

// This works faster but it searches the entire sheet
var found = sheet.createTextFinder("dog").matchCase(false).findNext();

有没有一种更快的方法来查找在特定列中具有字符串的第一行?

更新:这是执行记录:

[19-06-09 14:16:48:430 EDT] Starting execution
[19-06-09 14:16:48:513 EDT] SpreadsheetApp.openById([redacted]) [0.071 seconds]
[19-06-09 14:16:48:513 EDT] Spreadsheet.getSheetByName([Sheet2]) [0 seconds]
[19-06-09 14:16:48:514 EDT] Sheet.createTextFinder([b]) [0 seconds]
[19-06-09 14:16:48:514 EDT] TextFinder.matchCase([false]) [0 seconds]
[19-06-09 14:16:48:595 EDT] TextFinder.findNext() [0.08 seconds]
[19-06-09 14:16:48:596 EDT] Sheet.getRange([A:A]) [0 seconds]
[19-06-09 14:16:48:596 EDT] Range.createTextFinder([b]) [0 seconds]
[19-06-09 14:16:48:597 EDT] TextFinder.matchCase([false]) [0 seconds]
[19-06-09 14:17:21:064 EDT] TextFinder.findNext() [32.467 seconds]
[19-06-09 14:17:21:072 EDT] Execution failed: Service error: Spreadsheets (line 103, file "main") [32.626 seconds total runtime]

1 个答案:

答案 0 :(得分:1)

此处的范围设置为整个A列,包括数千个空行。 TextFinder似乎是根据getLastRow()或类似的内容进行搜索。对于工作表,getLastRow()返回包含内容的最后一行 的值,但是在范围上,它返回the last row within that range

有两种方法可以解决此问题:在创建TextFinder之前指定一个较小的范围

var found = sheet.getRange(1,1,sheet.getLastRow()).createTextFinder("dog").matchCase(false).findNext();

从第一行开始直到最后一行的内容都将仅搜索第一列。

或者,您可以使用循环而不是TextFinder,例如

var column = sheet.getRange("A:A").getValues();
var foundIndex;
for (var i = 0; i < column.length; i++){
  if (column[i][0] === "dog") {
    foundIndex = i;
    break;
  }
}