Dan*_*Cue 4 filtering google-sheets google-apps-script
我正在努力通过 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);
};
Run Code Online (Sandbox Code Playgroud)
如果使用.setHiddenValues()是唯一的方法,我的想法是构建一个项目列表以排除不包含某个或多个特定值的项目。换句话说,如果 L 列中的值不等于“四”,则包含在.setHiddenValues(). 我想这将需要一个循环,但我想看看想法是什么。我对 GAS 相当陌生,所以我不确定如何构建一个有效的循环来实现这一点。有没有更好的方法来设置过滤器?
是的。您可以使用splice()方法。您可以从以下位置更改:     
var criteria = SpreadsheetApp.newFilterCriteria()
  .setHiddenValues(['One', 'Two', 'Three', 'Five', 'Six', 'Seven'])
  .build();
Run Code Online (Sandbox Code Playgroud)
到:
  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;
}
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用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;
}
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           5326 次  |  
        
|   最近记录:  |