我正在努力通过 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/