【问题标题】:How can I set a filter view in a sheets script?如何在工作表脚本中设置过滤器视图?
【发布时间】:2021-10-20 20:51:18
【问题描述】:

我已经定义了几个过滤视图,并希望在 Google 表格脚本中应用其中一个预定义的过滤视图。

注意:过滤视图隐藏在菜单中,并非所有工作表用户都知道在哪里可以找到它们。相反,除非使用过滤器视图,否则用户对过滤器和排序进行更改会更改所有用户的视图。通过突出的按钮选择过滤视图可以很好地为所有技能水平的用户解决这些问题。

【问题讨论】:

标签: google-apps-script google-sheets google-sheets-filter-view


【解决方案1】:

这是一个长期存在的功能请求。但是,您的问题中没有代码可供查看。

https://code.google.com/p/google-apps-script-issues/issues/detail?id=524


更新

Apps 脚本中添加了三个与过滤器相关的附加服务: Class FilterRange.createFilterSheet.getFilter

这些将不允许您访问或控制已保存的过滤视图,您可能可以编写类似的脚本功能。但是,您的 UI 按钮选项可以是图像脚本运行器或实例化侧边栏应用程序。其中任何一个都可能不可见。同样,它们会影响所有查看者的工作表。


进一步更新

an answer to a newer question 中所述,现在可以通过编程方式创建FilterViewsanswer 中有一些注意事项涉及受保护的范围。

这仍然不能解决激活特定 FilterView 的 OP 请求。它们可以被创建、更新或删除,但即使使用 Sheets Advanced API,它们也无法由当前查看器以编程方式激活。

【讨论】:

  • 过滤器和过滤器视图不一样。
  • @JSDBroughton 问题是关于“过滤视图”,您提供的谷歌链接都是针对普通过滤器的。
  • 自从提出问题和答案以来,我已经更新以链接到 GAS 添加的新功能。此外,现在链接的一个新问题也有一个很好的答案,该问题涵盖了受保护范围内的陷阱。
  • 尽管如此,请求的功能仍然不存在。
【解决方案2】:

在下面的示例中,一个简单的标准 TRUE/FALSE 用于过滤工作表的视图,即如果单元格中的值为 FALSE,则隐藏该行。 因此,显然您有两个函数,setFilter 和 clearFilter。 以最原始的方式,这看起来像这样:

function setFilter() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var filterSettings = {};

  // The range of data on which you want to apply the filter.
  // optional arguments: startRowIndex, startColumnIndex, endRowIndex, endColumnIndex
  filterSettings.range = {
    sheetId: ss.getSheetByName("sheetName").getSheetId() // provide your sheetname to which you want to apply filter.
  };

  // Criteria for showing/hiding rows in a filter
  // https://developers.google.com/sheets/api/reference/rest/v4/FilterCriteria
  filterSettings.criteria = {};
  var columnIndex = 9; // column that defines criteria [A = 0]
  filterSettings['criteria'][columnIndex] = {
    'hiddenValues': ["FALSE"]
  };

  var request = {
    "setBasicFilter": {
      "filter": filterSettings
    }
  };
  Sheets.Spreadsheets.batchUpdate({'requests': [request]}, ss.getId());
}

function clearFilter() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var ssId = ss.getId();
  var sheetId = ss.getSheetByName("sheetName").getSheetId();
  var requests = [{
    "clearBasicFilter": {
      "sheetId": sheetId
    }
  }];
  Sheets.Spreadsheets.batchUpdate({'requests': requests}, ssId);
}

【讨论】:

  • 这是Filter(某种意义上的),而不是FilterView,因为它对工作表的所有用户都可见
【解决方案3】:

您想要的是让您的用户能够轻松更改过滤后的视图。

实现此目的的一种简单方法是在冻结的行或列中使用常规超链接:

之所以有效,是因为过滤后的视图仅由名为 fvid 的附加 URL 参数激活:

优点:

  • 适用于工作表和标签。
  • 易于实施。
  • 无需编码。

缺点:

  • 过滤的视图需要在行超出其中设置的范围时手动更新,因为它们不接受开放范围...
  • 无法使用图片,因为它们不接受超链接
  • 您需要创建一个“所有行”过滤视图,因为删除 fvid 参数不会像添加或更改它那样实时更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-20
    相关资源
    最近更新 更多