我有一张有很多行的表——数千行。我想在特定列中搜索文本。我在用Range.createTextFinder
但它超时了。如果Sheet只有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();
有没有更快的方法来查找特定列中包含字符串的第一行?
Update:这是执行记录:
[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]
这里的Range设置为整个A列,包括数千个空行。 TextFinder 的搜索似乎基于getLastRow()
或者非常类似的东西。对于片材来说,getLastRow()
返回最后一行的值有内容,但在一定范围内,它会返回该范围内的最后一行 https://developers.google.com/apps-script/reference/spreadsheet/range#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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)