我正在通过Google Apps脚本设置过滤器。从我的研究中,我得出的结论是,尽管.setVisibleValues()
被列为可用,但尚不支持。以编程方式过滤列的唯一方法是使用.setHiddenValues()
。这会带来挑战,因为可能需要隐藏数百个值。
在下面的示例代码中,我选择在列12(L)中排除值1、2、3、5、6和7。如果该列中只有七个值,则应返回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相当陌生,所以我不确定如何建立有效的循环来完成此任务。有没有更好的方法来设置过滤器?
答案 0 :(得分:3)
是的。您可以使用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;
}
答案 1 :(得分:0)
使用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
}
在某些情况下,我需要完全匹配(第一个解决方案)。其他我没有(第二种解决方案)。