Поиск в диапазоне с помощью TextFinder выполняется медленнее, чем поиск по всему листу - PullRequest
0 голосов
/ 09 июня 2019

У меня есть лист с множеством строк - тысячи. Я хочу найти в определенном столбце текст. Я использую 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 Ответ

1 голос
/ 09 июня 2019

Диапазон здесь - весь столбец A, включая тысячи пустых строк.Похоже, TextFinder выполняет поиск на основе getLastRow() или чего-то очень похожего.Для листа getLastRow() возвращает значение последней строки с содержимым , но для диапазона возвращается последняя строка в этом диапазоне .

Есть два способа обойти это: указать более узкий диапазон перед созданием вашего 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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...