Google apps script 超过一万行的TextFinder实例的findNext上出现服务错误
我正在Google Sheets的一张工作表中搜索一个大数据集上的关键字。我只需要搜索这个大数据集中的一列。 在先前创建的TextFinder实例上执行搜索[findNext()]的行失败 通过添加Logger.log条目并使用return false;停止函数的执行,我运行了逐行调试;。 它在findNext()函数处停止执行,错误为“Service error”。我以前也遇到过这个错误,当对电子表格类进行太多调用而没有对其进行更新时,就会发生这种错误,解决方法是在此处或此处包含一些SpreadsheetApp.flush()语句以清除一些缓冲区。我在findNext()之前和之后添加了这一行,但均无效。当然,当我在findNext之前刷新时,它运行正常,但在findNext时它会再次停止,如果我将它放在findNext之后,它就永远不会刷新Google apps script 超过一万行的TextFinder实例的findNext上出现服务错误,google-apps-script,google-sheets,google-sheets-macros,Google Apps Script,Google Sheets,Google Sheets Macros,我正在Google Sheets的一张工作表中搜索一个大数据集上的关键字。我只需要搜索这个大数据集中的一列。 在先前创建的TextFinder实例上执行搜索[findNext()]的行失败 通过添加Logger.log条目并使用return false;停止函数的执行,我运行了逐行调试;。 它在findNext()函数处停止执行,错误为“Service error”。我以前也遇到过这个错误,当对电子表格类进行太多调用而没有对其进行更新时,就会发生这种错误,解决方法是在此处或此处包含一些Sprea
function searchByZipCode() {
var sheetSample1 = SpreadsheetApp.getActiveSheet();
var rangeAllZIPs = sheetSample1.getRange("C:C"); // 13,165 rows in this range
var textFinderResults = rangeAllZIPs.createTextFinder("10550");
var strCounties = [];
while (true) {
var rangeThisZip = textFinderResults.findNext(); // Service error!
if (rangeThisZip) {
strCounties.push(sheetSample1.getRange(rangeThisZip.getRowIndex(), 1).getValue());
} else {
break;
}
}
strCounties.forEach(function (Item, Index) {
Logger.log("Counties \[" + Index + "\]\: " + Item);
});
}
预期行为:
在C列中查找我正在搜索的文本,并在该电子表格中为我提供A列的值
实际结果:
findNext()函数执行约10到15秒时出现错误消息
不幸的是,由于网络中的安全限制,我无法提供电子表格的示例,但是如果您的电子表格有13165行,只有两列或三列,比如a列有一个县列表,B列有两个字母的州列表,C列有相应的邮政编码,您将看到这种行为。- 您希望从列“C”中搜索一个值,并在找到该值的行中检索列“a”的值
- 您希望使用谷歌应用程序脚本实现这一点
findNext()
和findAll()
用于从getRange(“C:C”)
和getRange(“C1:C”)
检索的TextFinder
时,我可以确认发生了相同的问题。但是当findNext()
和findAll()
用于从getRange(1,3,sheetSample1.getLastRow(),1)
和getDataRange()
检索的TextFinder
时,不会发生错误。从这种情况来看,我认为这可能是一个错误。或者可能需要使用固定范围
为了避免这个问题,下面的修改如何
模式1:
在此模式中,您的脚本将被修改
修改脚本:
请修改如下
function searchByZipCode() {
var sheetSample1 = SpreadsheetApp.getActiveSheet();
var rangeAllZIPs = sheetSample1.getDataRange();
var textFinderResults = rangeAllZIPs.createTextFinder("10550");
var strCounties = textFinderResults.findAll().map(function(e) {return e.offset(0, -2).getValue()});
strCounties.forEach(function (Item, Index) {
Logger.log("Counties \[" + Index + "\]\: " + Item);
});
}
发件人:
致:
模式2:
在此模式中,使用了findAll()
方法
修改脚本:
请修改如下
function searchByZipCode() {
var sheetSample1 = SpreadsheetApp.getActiveSheet();
var rangeAllZIPs = sheetSample1.getDataRange();
var textFinderResults = rangeAllZIPs.createTextFinder("10550");
var strCounties = textFinderResults.findAll().map(function(e) {return e.offset(0, -2).getValue()});
strCounties.forEach(function (Item, Index) {
Logger.log("Counties \[" + Index + "\]\: " + Item);
});
}
参考资料:
如果我误解了您的问题,并且这不是您想要的方向,我深表歉意。欢迎来到StackOverFlow。请借此机会学习如何和。请提供一个最小但完整的功能以及对示例电子表格的公开访问,以便我们能够验证问题。谢谢@Tanaike,我使用与以前相同的结果尝试了模式1,执行几秒钟后出现了相同的错误消息,这是结束修改:
var rangeAllZIPs=sheetSample1.getRange(2,3,sheetSample1.getLastRow(),1)代码>我将尝试模式2,然后我将返回结果。我还尝试了模式2@Tanaike,效果非常好,您已经回答了我的问题,谢谢@伊丽莎白·奥尔蒂斯谢谢你的回复。我很高兴你的问题解决了。
function searchByZipCode() {
var sheetSample1 = SpreadsheetApp.getActiveSheet();
var rangeAllZIPs = sheetSample1.getDataRange();
var textFinderResults = rangeAllZIPs.createTextFinder("10550");
var strCounties = textFinderResults.findAll().map(function(e) {return e.offset(0, -2).getValue()});
strCounties.forEach(function (Item, Index) {
Logger.log("Counties \[" + Index + "\]\: " + Item);
});
}