Google apps script 超过一万行的TextFinder实例的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

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

通过添加Logger.log条目并使用return false;停止函数的执行,我运行了逐行调试;。 它在findNext()函数处停止执行,错误为“Service error”。我以前也遇到过这个错误,当对电子表格类进行太多调用而没有对其进行更新时,就会发生这种错误,解决方法是在此处或此处包含一些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秒时出现错误消息

不幸的是,由于网络中的安全限制,我无法提供电子表格的示例,但是如果您的电子表格有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);
  });
}