【问题标题】:Optimizing for loops in google apps script优化谷歌应用程序脚本中的循环
【发布时间】:2015-10-25 16:56:34
【问题描述】:

我正在使用 for 循环来搜索大型工作表(大约 4500 行)。 它们中的大多数看起来像这样:

function lookup(value) {
  var tables=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Name");
  var columnvalues = tables.getRange(1, 1,tables.getLastRow()).getValues(); 
  var searchResult = columnvalues.findIndex(value); //Row Index - 1
}
 Array.prototype.findIndex = function(search){
  if(search == "") return false;
  for (var i=0; i<this.length; i++)
    if (this[i].toString().indexOf(search) > -1 ) return i;

  return -1;
}

应用脚本当前运行相对较慢。我正在寻找一种方法来加快我当前的代码或另一种搜索方法。我一直在考虑使用谷歌电子表格查找功能(索引匹配,vLookup),但我还没有找到在应用程序脚本中访问这些功能的方法。有什么想法吗?

【问题讨论】:

    标签: javascript for-loop indexing google-apps-script vlookup


    【解决方案1】:

    我发现搜索数组的最快方法是使用数组的 .filter() 方法。

    var yourData = range.getValues();
    var results = yourData.filter(function(val) { 
        return val[0] == search ||
         val[0].includes(search);
    });
    //now you have a 2d array of results
    

    修改它,使其成为您想要的范围(抱歉,在移动设备上),这是我找到的最快方式。避免 For-Loop 是最好的。你也可以使用 .forEach()

    【讨论】:

      【解决方案2】:

      当您搜索单个列时,稍微简单一些的内容可能会更快一些。

      function lookup(value) {
        var searchResult = false;
        if(value == "") return;
        var tables=SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Name");
        var columnvalues = tables.getRange(1, 1,tables.getLastRow()).getValues(); 
        for (var i=0; i<columnvalues.length; i++) {
          if(columnvalues[i][0] == value) {
            searchResult = i;  //Row Index - 1
            break;
         };
      }
      

      【讨论】:

        【解决方案3】:

        目前,您找不到使用应用程序脚本更快地执行此操作的方法。您必须像您已经在做的那样获取整列并一一搜索。

        您提到的使用工作表公式的替代方法可能很不稳定,因为您可能会发现单元格公式不会在您更改值时立即更新结果。

        我可以看到这正在加速的唯一情况是如果您需要进行多个搜索调用。在这种情况下,将搜索词作为数组传递并在单个循环中一次搜索它们会更快。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-11-16
          • 2020-06-15
          • 2022-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多