谷歌应用脚本/电子表格 - 如何获取筛选条件?

5

是否有可能得到我的数据集的筛选条件。例如,如果我的一列是“部门”,我过滤数据只显示“IT”。我们如何获取筛选条件“IT”?我需要将这个筛选条件获取到我的GAS中进行其他操作。

谢谢。


您可以查看此解决方案:http://stackoverflow.com/a/42615146/4786114 - Falken
6个回答

4
尝试一下这个简单的筛选器示例。它将从第一列过滤信息(将XXX更改为有意义的内容):
  function onOpen(){

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var filterMenuEntries = [{name: "filter Column1", functionName: "filter"}];
  ss.addMenu("choose filter", filterMenuEntries);

  }

 function filter(){

 var sheet = SpreadsheetApp.getActiveSheet();
 var rows = sheet.getDataRange();
 var numRows = rows.getNumRows();
 var values = rows.getValues();

 for (var i=1; i <=numRows -1; i++){

   var row =values[i];

   // Column value
   var myValue = row[0];

   // filter value 
   if (myValue == "XXX"){

     sheet.hideRows(i+1);

     }

  }

}

3
Google表格已经有一个FILTER公式(我总是使用这个页面来提醒自己如何操作)。例如,如果您的数据看起来像这样:
  A
1 Department
2 IT Department (Edinburgh)
3 Department of IT
4 Other Department

要获得筛选后的列表,您可以使用以下公式。
=FILTER(A:A;FIND("IT",A:A)>0)

(这里有一个工作示例)

如果您想完全在应用脚本中执行某些操作,Romain Vialard编写了一个带有过滤函数的托管库。以下是安装和使用2D Array2库的说明


可能我在我的问题中没有表达清楚我想做什么。请允许我进一步解释。我有一个包含列->部门|单位|员工姓名|薪水的电子表格。用户可以按部门和单位筛选电子表格。我还有一个名为“处理”的自定义菜单。如果用户点击“处理”,它将运行一个自定义脚本函数,根据用户筛选的条件进行一些处理。在脚本中是否可能获取用户筛选的条件? - Alex
据我所知,目前没有办法获取用户应用的过滤器。 - mhawksey
可能有另一种方法来完成这个任务,但它取决于这个问题的答案。当用户按部门和单位进行过滤时,他们是单选还是可以选择多个部门/单位? - mhawksey

3

随着高级表格服务的最新发布,现在可以使用筛选器:

以下是如何操作的简要说明:

这里有一篇文章

function setSheetBasicFilter(ssId, BasicFilterSettings) {
  //requests is an array of batchrequests, here we only use setBasicFilter
  var requests = [
    {
      "setBasicFilter": {
        "filter": BasicFilterSettings
      }
    }
  ];
  Sheets.Spreadsheets.batchUpdate({'requests': requests}, ssId);
}

Sheets仅适用于API(https调用)-他正在寻求App Script-它们是两个不同但相似的东西。 - amok
1
@amok:Sheets API在Apps Script中可用,您只需要在资源=>高级Google服务=>Google Sheets API中激活它。 - Fares Droubi

0

根据mhawksey的回答,我编写了以下函数:

//
function celdasOcultas(ssId, rangeA1) {  
  // limit what's returned from the API
  var fields = "sheets(data(rowMetadata(hiddenByFilter)),properties/sheetId)";
  var sheets = Sheets.Spreadsheets.get(ssId, {ranges: rangeA1, fields: fields}).sheets;
  if (sheets) {
    return sheets[0].data[0].rowMetadata;
  }
}

然后这样调用:

    // i.e. : ss = spreadsheet, ranges = "Hoja 2!A2:A16"
    Logger.log(range.getA1Notation());
    var ocultas = celdasOcultas(ss.getId(), sheetName + "!" + range.getA1Notation());
    // Logger.log(ocultas);
    var values = range.getValues();
    for (var r = 0; r < values.length; r++) {
      if (!ocultas[r].hiddenByFilter) {
        values[r].forEach( function col(c){
          Logger.log(c);
        });
      }
      //range.setBackground("lightcoral");
    }

避免记录隐藏行。您可以在以下位置查看此操作: Script测试, 请注意,项目必须在Google API控制台上启用Google Sheets API。 enter image description here

希望对您有所帮助。谢谢!


0

这个问题在谷歌的问题跟踪器中被提出,链接为Issue #36753410

截至2018-04-12,他们已经发布了一个解决方案:

昨天我们发布了一些新功能,使得使用 Apps Script 可以操作筛选器:
- https://developers.google.com/apps-script/reference/spreadsheet/range#createFilter() - https://developers.google.com/apps-script/reference/spreadsheet/sheet#getfilter - https://developers.google.com/apps-script/reference/spreadsheet/filter 不幸的是,Apps Script 仍然没有方法来确定给定行或列是否被筛选器隐藏。请参见评论#157中利用 Sheets 高级服务的解决方法。

过滤器类允许您逐列获取过滤条件


0
在寻找这个问题的答案时,我想到了下一个解决方法:
  • 在工作表中应用筛选器;
  • 对筛选后(因此可见)的单元格进行着色(在示例代码中为 F 列中的红色);
  • 运行脚本:
    • 读取数组颜色中的背景颜色(F 列)
    • 迭代此数组
    • 构建新的行号数组,这些行号是可见的。

这个最后的数组可以用于进一步操作工作表数据。为了展示脚本的效果,我让脚本将使用的单元格背景设置为绿色。

这对最终用户来说是额外的小努力,但在我看来,这是唯一使仅使用筛选数据成为可能的方法。

function getFilterdData(){  
   var s = SpreadsheetApp.getActive();
   var sheet= s.getSheetByName('Opdrachten en aanvragen');//any sheet
   var rows = new Array();
   var colors = sheet.getRange(1, 6, sheet.getLastRow(), 1).getBackgrounds();
   for(var i = 0; i < colors.length; i++){
       if(colors[i] == "#ff0000"){
         var rowsIndex = rows.length;
         rows[rowsIndex] = i+1;
         sheet.getRange(i+1, 6).setBackground("#d9ead3")
         }
       }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接