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

时间:2018-07-24 11:56:09

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

我正在通过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相当陌生,所以我不确定如何建立有效的循环来完成此任务。有没有更好的方法来设置过滤器?

2 个答案:

答案 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
}

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