google-apps-script - 将基本过滤器应用于电子表格列中的多个值

标签 google-apps-script google-sheets filtering

我正在努力通过 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 相当陌生,所以我不确定如何构建一个有效的循环来实现这一点。有没有更好的方法来设置过滤器?

最佳答案

是的。您可以使用 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;
}

关于google-apps-script - 将基本过滤器应用于电子表格列中的多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51497982/

相关文章:

ios - SearchBar 在过滤时忽略字符

google-apps-script - 按特定顺序对 Google 电子表格单元格求和

javascript - 脚本正在运行,但仅适用于 "hack"

javascript - 与嵌入式 Google Apps 电子表格交互

javascript - 省略没有值的字段

javascript - Chrome DevTools 中的 Handled 过滤器有什么用?

python - 过滤多边形之间的点

google-apps-script - 列出 Google Sheets 中的工作表名称并跳过前两个

google-sheets - 谷歌表 : How to use arrayformula to copy data from one sheet to another?

javascript - 使用 GAS 在 Google 工作表选项卡之间附加数据