超过一万行的 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);
  });
}

参考文献:

如果我误解了您的问题并且这不是您想要的方向,我深表歉意。