Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 使用TextFinder搜索范围比搜索整个工作表慢_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 使用TextFinder搜索范围比搜索整个工作表慢

Google apps script 使用TextFinder搜索范围比搜索整个工作表慢,google-apps-script,google-sheets,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 se

我有一张有很多行的纸——几千行。我想在特定列中搜索文本。我正在使用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]

此处的范围设置为整个A列,包括数千个空行。TextFinder似乎基于getLastRow或类似的东西进行搜索。对于工作表,getLastRow返回包含内容的最后一行的值,但在一定范围内返回

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

var found = sheet.getRange(1,1,sheet.getLastRow()).createTextFinder("dog").matchCase(false).findNext();
它将只搜索第一列,从第一行开始,最后一行结束

或者,您可以使用循环而不是文本查找器,例如

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;
  }
}

Show execution transcript.在TextFinder出现之前,使用.getValues并使用for循环将值与搜索字符串进行比较。这当然会起作用,但我想知道你的问题是否是由使用A:A1符号引起的。如果使用getRange1,1,sheet.getLastRow会发生什么情况?@TheMaster我添加了执行记录。@Altigraph是的,这似乎更快。我创建了一个8000行的测试表,并进行了搜索,它似乎很快就找到了。您可能认为TextFinder足够聪明,可以只搜索最后一行。如果搜索整个工作表的速度比搜索范围快,它可能只搜索工作表上的最后一行getLastRow返回最后一行内容,在某个范围内返回该范围内的最后一行。第二个选项是否需要更长的时间,或者TextFinder是否针对此类搜索/替换过程进行了优化?