使用 Google Apps 脚本对范围启用数据过滤器

Posted

技术标签:

【中文标题】使用 Google Apps 脚本对范围启用数据过滤器【英文标题】:Enable data filters on a range with Google Apps Script 【发布时间】:2013-08-29 17:11:46 【问题描述】:

有没有办法通过 Google 表格中的脚本为特定范围启用数据过滤器?目前这可以手动完成,但我不想选择一个范围,然后点击“数据”,然后打开过滤器。

我知道过滤器将保留在现有工作表中。但是,我尝试为通过脚本生成的新电子表格应用过滤器。

我的想法是:

function foo() 
  var spreadsheet = SpreadsheetApp.getActive();
  var infoSheet = spreadsheet.insertSheet('sheetName', spreadsheet.getNumSheets());

  infoSheet.getRange(1, 1, 5, 5). -> enable filter?
  ...

如何以编程方式实现我的目标?

【问题讨论】:

【参考方案1】:

Filters 现在也可以在原生电子表格服务中使用,无需通过“高级服务”激活表格 REST API。

上述 Sheets REST API 方法,适用于原生 Apps Script:

function applyFilter() 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var dataSheet = ss.getActiveSheet();

  var toFilter = dataSheet.getDataRange();
  var filter = toFilter.createFilter();

  // Make some criteria to filter with.
  var fcb = SpreadsheetApp.newFilterCriteria();
  /* use FilterCriteria methods */
  fcb.whenCellNotEmpty();

  // Filter the range based on the 1st column:
  filter.setColumnFilterCriteria(1, fcb.build());

进一步阅读:

Filter Reference FilterCriteria Reference

【讨论】:

应用后,我们如何将过滤后的数据返回到应用脚本中。当我做filter.getRange().getValues() 时,我得到所有数据,而不是过滤的数据 @daydreamer 请查看这篇文章tanaikech.github.io/2019/11/08/…您可以使用应用过滤器isRowHiddenByFilter 查看是否隐藏了特定行【参考方案2】:

现在您可以使用谷歌表格高级服务应用过滤器。 首先,您需要打开 Google Sheets API。为此,请按照以下链接中提到的步骤操作:

https://developers.google.com/sheets/api/quickstart/apps-script

之后,您可以使用以下功能来应用过滤器。

function applyFilter() 
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ssId = ss.getId();
  var dataSheet = ss.getActiveSheet();
  var lastRow = dataSheet.getLastRow();
  var lastColumn = dataSheet.getLastColumn();
  var sheetId = dataSheet.getSheetId();

  var filterSettings = 
    "range": 
      "sheetId": sheetId,
      "startRowIndex": 0,
      "endRowIndex": lastRow,
      "startColumnIndex": 0,
      "endColumnIndex": lastColumn
    
  ;
  var requests = [
    "setBasicFilter": 
      "filter": filterSettings
    
  ];
  Sheets.Spreadsheets.batchUpdate('requests': requests, ssId);

【讨论】:

【参考方案3】:

简短的回答是“否”。 至少根据this open issue,GAS 似乎既不支持获取也不支持设置列的过滤条件。

另一种解决方案是在 GAS 端进行过滤和排序,并将不同的结果推送到不同的列或工作表中。

【讨论】:

更新的答案如下。继续滚动。

以上是关于使用 Google Apps 脚本对范围启用数据过滤器的主要内容,如果未能解决你的问题,请参考以下文章

我是否需要更改我的Apps脚本代码,因为Google+登录功能已被弃用?

Google Apps 脚本中数字的格式范围

如何将 Google Apps 脚本的范围缩小到特定文件

在 Google Apps 脚本中使用 BigQuery 连接到 Google 电子表格

BigQuery AppsScript 客户端的默认范围不包括 Google Drive

如何使用 Google Apps 脚本将公式添加到 Google 表格?