【问题标题】:Apply basic filter to multiple values in a spreadsheet column将基本过滤器应用于电子表格列中的多个值
【发布时间】:2019-01-01 00:55:16
【问题描述】:

我正在努力通过 Google Apps 脚本设置过滤器。根据我的研究,我得出的结论是,虽然.setVisibleValues() 被列为可用,但它尚不受支持。以编程方式过滤列的唯一方法是使用.setHiddenValues()。这带来了挑战,因为可能需要隐藏数百个值。

在下面的示例代码中,我选择在第 12 列 (L) 中排除值一、二、三、五、六和七。如果该列中只有七个值,则应该返回一个过滤后的数据集,L 列中只有“四个”。

function testFilter() {
  var spreadsheet = SpreadsheetApp.getActive();
  var criteria = SpreadsheetApp.newFilterCriteria()
    .setHiddenValues(['One', 'Two', 'Three', 'Five', 'Six', 'Seven'])
    .build();
  spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(12, criteria);
};

如果使用.setHiddenValues() 是唯一的方法,我的想法是建立一个项目列表以排除不包含某个或多个值的项目。换句话说,如果 L 列中的值不等于“四”,则包含在 .setHiddenValues() 的列表中。我想这需要一个循环,但我想看看想法是什么。我对 GAS 还很陌生,所以我不确定如何构建一个有效的循环来实现这一点。有没有更好的方法来设置过滤器?

【问题讨论】:

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


    【解决方案1】:

    是的。您可以使用splice()方法。您可以从以下位置更改:

    var criteria = SpreadsheetApp.newFilterCriteria()
      .setHiddenValues(['One', 'Two', 'Three', 'Five', 'Six', 'Seven'])
      .build();
    

    到:

      var sh = spreadsheet.getActiveSheet();    
      var filterRange = sh.getRange('L1:L'+sh.getLastRow()).getValues(); //Get L column values    
      var hidden = getHiddenValueArray(filterRange,["four"]); //get values except four    
      var filtercriteria = SpreadsheetApp.newFilterCriteria().setHiddenValues(hidden).build();
    
    
    
    //flattens and strips column L values of all the values in the visible value array
    function getHiddenValueArray(colValueArr,visibleValueArr){
      var flatArr = colValueArr.map(function(e){return e[0];}); //Flatten column L
      visibleValueArr.forEach(function(e){ //For each value in visible array    
        var i = flatArr.indexOf(e.toString()); 
        while (i != -1){ //if flatArray has the visible value        
          flatArr.splice(i,1); //splice(delete) it
          i = flatArr.indexOf(e.toString());
        }
      });
      return flatArr;
    }
    

    另一种方法是使用filter()。这也将删除重复项:

    function getHiddenValueArray(colValueArr,visibleValueArr){
      var flatUniqArr = colValueArr.map(function(e){return e[0];})
      .filter(function(e,i,a){return (a.indexOf(e.toString())==i && visibleValueArr.indexOf(e.toString()) ==-1); })
      return flatUniqArr;
    }
    

    【讨论】:

    • 这成功了!我只需要将 filtercriteria 更改为条件,反之亦然,以匹配我在原始代码中的内容。谢谢一堆。我接受了这个作为答案!
    • 经过几天的正常工作后,我现在收到一个错误。 “服务错误:电子表格(第 113 行......”我不知道如何解决这个问题,我的研究让我无处可去。
    • 发生在这一行:spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(12, criteria);
    • 会的。关于您提供的代码的快速问题。它会从数组中删除唯一值吗?
    • 我认为 'Logger.log(hidden)' 回答了我的问题。该函数不会删除重复项。 (这就是我的意思。不要删除唯一值。)
    【解决方案2】:

    使用 I'-'I 的方法有效,但我发现对数字列进行过滤不起作用。该解决方案已在this question. 上得到解答

    这是 Tanaike 提供的解决方案。将 getHiddenValueArray 函数替换为:

    function getHiddenValueArray(colValueArr,visibleValueArr){
      var flatUniqArr = colValueArr.map(function(e){return e[0];})
      .filter(function(e,i,a){return (a.indexOf(e) == i && visibleValueArr.indexOf(e) == -1); })  //Handles numeric and string values.
      return flatUniqArr;
    }
    

    我还创建了以下内容来搜索单元格中的字符串。上面的代码似乎在寻找完全匹配。我确信有一种方法可以将两者结合起来,并且可能有一种方法可以改进以下内容,但它确实有效。如果有更好的方法,请随时发表评论。

    function getHiddenValueArrayStringSearch(colValueArr,visibleValueStr){
      var newArray= []
      for (var i = 0; i < colValueArr.length; i++) {
          if(colValueArr[i].toString().toLowerCase().indexOf(visibleValueStr.toString().toLowerCase()) == -1){newArray.push(colValueArr[i]);}    
      }
      return newArray
    }
    

    在某些情况下,我想要完全匹配(第一个解决方案)。其他我没有(第二个解决方案)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      相关资源
      最近更新 更多