【问题标题】:Google App Script / Spreadsheet - How to get filter criteria?Google App Script / Spreadsheet - 如何获取过滤条件?
【发布时间】:2012-07-25 08:00:17
【问题描述】:

是否可以获取我的数据集的过滤条件。例如,如果我的一列是“部门”,并且我过滤了数据以仅显示“IT”。我们如何获得过滤条件“IT”。我需要将过滤后的标准放入我的 GAS 中以进行其他操作。

谢谢。

【问题讨论】:

标签: google-apps-script


【解决方案1】:

试试这个例子来做一个简单的过滤器。它将从第一列过滤信息(将 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);

     }

  }

}

【讨论】:

    【解决方案2】:

    Google 电子表格已有过滤器公式 (I always use this page to remind me how to do it)。例如,如果您的数据看起来像这样

      A
    1 Department
    2 IT Department (Edinburgh)
    3 Department of IT
    4 Other Department
    

    要获得过滤列表,您可以使用公式

    =FILTER(A:A;FIND("IT",A:A)>0)
    

    (Working example here)

    如果你想完全在 Apps 脚本中做某事,Romain Vialard 写了一个带有过滤功能的Managed Library。这里是instructions for installing and using the 2D Array2 library

    【讨论】:

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

    过滤器现在可用于最近推出的高级表格服务: 这是article的链接

    这里有一个小sn-p如何做:

    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 调用) - 他要求应用脚本 - 它们是两个不同但相似的东西。
    • @amok:Sheets API 在 Apps 脚本中可用,您只需在资源中激活它 => 高级 Google 服务 => Google sheet API
    【解决方案4】:

    为了寻找这个问题的答案,我想出了下一个解决方法:

    • 在工作表中应用过滤器;
    • 为过滤后的颜色(因此 可见)单元格(在 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")
             }
           }
        }
    

    【讨论】:

      【解决方案5】:

      根据 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");
          }

      比防止隐藏行的日志。您可以在以下位置看到它的实际效果: Prueba script,注意项目必须在 Google API 控制台上启用 Google Sheets API。

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

      【讨论】:

        【解决方案6】:

        这在 Google 的问题跟踪器中以Issue #36753410 提出。

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

        昨天我们发布了一些新功能,可以 使用 Apps 脚本操作过滤器:

        不幸的是,Apps 脚本仍然没有确定的方法 如果给定的行或列被过滤器隐藏。见comment #157 一种利用表格高级服务的解决方法。

        Filter 类可让您依次获取每一列的FilterCriteria

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-23
          • 1970-01-01
          相关资源
          最近更新 更多