5

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

谢谢。

4

6 回答 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);

     }

  }

}
于 2012-08-02T21:16:28.670 回答
3

谷歌电子表格已经有一个过滤器公式(我总是用这个页面来提醒我怎么做)。例如,如果您的数据看起来像这样

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

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

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

这里的工作示例

如果你想完全在 Apps 脚本中做某事,Romain Vialard 编写了一个带有过滤功能的托管库。以下是安装和使用 2D Array2 库的说明

于 2012-07-25T10:02:31.223 回答
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);
}
于 2017-05-09T16:11:13.170 回答
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")
         }
       }
    }
于 2017-03-04T13:59:46.060 回答
0

这在 Google 的问题跟踪器中作为问题 #36753410 提出

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

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

不幸的是,Apps 脚本仍然没有方法来确定给定的行或列是否被过滤器隐藏。有关使用表格高级服务的解决方法,请参阅评论 #157

Filter类允许您依次获取每列的FilterCriteria

于 2018-04-20T13:08:17.660 回答
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");
    }

比防止隐藏行的日志。您可以在以下位置看到它的实际效果: Prueba 脚本,注意项目必须在 Google API 控制台上启用 Google Sheets API。 在此处输入图像描述

希望能帮助到你。谢谢!

于 2017-09-12T00:12:56.647 回答