一万行以上的TextFinder实例的findNext服务错误

时间:2019-08-22 15:53:53

标签: google-apps-script google-sheets google-sheets-macros

我正在Google表格的一个工作表中的大型数据集上搜索关键字。我只需要在这个大数据集的一列中进行搜索。 在先前创建的TextFinder实例上执行搜索[findNext()]的那一行失败了。

我通过添加Logger.log条目并以return false;停止函数的执行来进行逐行调试。 它将在findNext()函数处停止执行,并显示错误“服务错误”。我以前遇到过这个错误,它发生在对电子表格类进行太多调用而没有更新时发生的,解决方案是在此处和此处包含一些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列的值。

实际结果:

在findNext()函数上执行大约10至15秒时出现错误消息。

不幸的是,由于我的网络存在安全限制,我无法提供电子表格的示例,但是如果您的电子表格包含13,165行且只有两或三列,那么假设A列的县列表为两字母在B列中列出,并在C列中找到相应的邮政编码。

1 个答案:

答案 0 :(得分:1)

  • 您要从“ C”列中搜索一个值,并在找到该值的行上检索“ A”列中的值。
  • 您想使用Google Apps脚本实现这一目标。

如果我的理解正确,那么这个答案如何?

问题:

在我的环境中,当findNext()findAll()中使用TextFindergetRange("C:C")时,我可以确认是否发生了相同的问题。但是,当getRange("C1:C")findNext()用于从findAll()TextFinder检索的getRange(1, 3, sheetSample1.getLastRow(), 1)时,不会发生错误。从这种情况来看,我认为这可能是一个错误。否则可能需要使用固定范围。

为了避免此问题,如何进行以下修改?

模式1:

在这种模式下,您的脚本被修改。

修改后的脚本:

请进行如下修改。

从:
getDataRange()
至:
var rangeAllZIPs = sheetSample1.getRange("C:C");

模式2:

在此模式中,使用var rangeAllZIPs = sheetSample1.getRange(1, 3, sheetSample1.getLastRow(), 1); 的方法。

修改后的脚本:

请进行如下修改。

findAll()

参考:

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