超过一万行的 TextFinder 实例的 findNext 服务错误
Service Error on findNext of a TextFinder instance with over ten thousand rows
我 运行 在 Google 表格中的一个 sheet 大数据集上搜索关键字。我只需要在这个大数据集中的一列中搜索。
在先前创建的 TextFinder 实例上执行搜索 [findNext()] 的行失败。
I 运行 通过添加 Logger.log 条目并使用 return false; 停止函数的执行来逐行调试。
它在 findNext() 函数处停止执行并出现错误 "Service error"。我以前遇到过这个错误,当对 spreadsheet class 的调用太多而没有更新它时,就会发生这种情况,解决方案是在这里和那里包含一些 SpreadsheetApp.flush() 句子清除一些缓冲区。我在 findNext() 之前和之后添加了这一行都没有用。当然,当我在 findNext 之前刷新时它运行正常,但是然后它再次在 findNext 停止,如果我把它放在 findNext 之后它永远不会刷新。
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 列的值sheet。
实际结果:
执行 findNext() 函数大约 10 到 15 秒时出现错误消息。
不幸的是,由于我的网络中的安全限制,我无法提供传播样本sheet,但是如果你有一个传播sheet,其中有 13,165 行,只有两列或三列,假设A 列中的县列表,B 列中的两个字母状态列表以及 C 列中的相应邮政编码,您将看到此行为。
- 您想从列 "C" 中搜索一个值,并在找到该值的行处检索列 "A" 的值。
- 您想使用 Google Apps 脚本实现此目的。
如果我的理解是正确的,这个答案怎么样?
问题:
同样在我的环境中,当 findNext()
和 findAll()
用于从 getRange("C:C")
和 getRange("C1:C")
检索到的 TextFinder
时,我可以确认相同发生问题。但是当 findNext()
和 findAll()
用于从 getRange(1, 3, sheetSample1.getLastRow(), 1)
和 getDataRange()
检索到的 TextFinder
时,不会发生错误。从这种情况来看,我认为这可能是一个错误。或者可能需要使用固定范围。
为了避免这个问题,下面的修改怎么样?
模式 1:
在此模式中,您的脚本已修改。
修改后的脚本:
请修改如下
从:
var rangeAllZIPs = sheetSample1.getRange("C:C");
到:
var rangeAllZIPs = sheetSample1.getRange(1, 3, sheetSample1.getLastRow(), 1);
模式二:
在这个模式中,使用了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);
});
}
参考文献:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。
我 运行 在 Google 表格中的一个 sheet 大数据集上搜索关键字。我只需要在这个大数据集中的一列中搜索。 在先前创建的 TextFinder 实例上执行搜索 [findNext()] 的行失败。
I 运行 通过添加 Logger.log 条目并使用 return false; 停止函数的执行来逐行调试。 它在 findNext() 函数处停止执行并出现错误 "Service error"。我以前遇到过这个错误,当对 spreadsheet class 的调用太多而没有更新它时,就会发生这种情况,解决方案是在这里和那里包含一些 SpreadsheetApp.flush() 句子清除一些缓冲区。我在 findNext() 之前和之后添加了这一行都没有用。当然,当我在 findNext 之前刷新时它运行正常,但是然后它再次在 findNext 停止,如果我把它放在 findNext 之后它永远不会刷新。
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 列的值sheet。
实际结果:
执行 findNext() 函数大约 10 到 15 秒时出现错误消息。
不幸的是,由于我的网络中的安全限制,我无法提供传播样本sheet,但是如果你有一个传播sheet,其中有 13,165 行,只有两列或三列,假设A 列中的县列表,B 列中的两个字母状态列表以及 C 列中的相应邮政编码,您将看到此行为。
- 您想从列 "C" 中搜索一个值,并在找到该值的行处检索列 "A" 的值。
- 您想使用 Google Apps 脚本实现此目的。
如果我的理解是正确的,这个答案怎么样?
问题:
同样在我的环境中,当 findNext()
和 findAll()
用于从 getRange("C:C")
和 getRange("C1:C")
检索到的 TextFinder
时,我可以确认相同发生问题。但是当 findNext()
和 findAll()
用于从 getRange(1, 3, sheetSample1.getLastRow(), 1)
和 getDataRange()
检索到的 TextFinder
时,不会发生错误。从这种情况来看,我认为这可能是一个错误。或者可能需要使用固定范围。
为了避免这个问题,下面的修改怎么样?
模式 1:
在此模式中,您的脚本已修改。
修改后的脚本:
请修改如下
从:var rangeAllZIPs = sheetSample1.getRange("C:C");
到:
var rangeAllZIPs = sheetSample1.getRange(1, 3, sheetSample1.getLastRow(), 1);
模式二:
在这个模式中,使用了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);
});
}
参考文献:
如果我误解了您的问题并且这不是您想要的方向,我深表歉意。