如何更新动态数据表上的过滤器

How to update filters on dynamic data tables

我在列 D:K 上设置了一些过滤器,它们根据验证框显示动态数据,如下面的 gif 动图所示。当我选择“Active”时,会出现 6 行,然后当我选择“Sold”时,会出现多于 6 行。但是,新行超出了筛选范围。

问题:如何在数据验证更改时自动更新过滤器以包含更多或更少的行?

示例sheet:https://docs.google.com/spreadsheets/d/1KthGhCQ0Mm2LFBk_eh_LS7jyXadVuyJpfu9sYm7SzpA/edit?usp=sharing

我相信你的目标如下。

  • 您想在更改下拉列表并更新“D”到“K”列的值时刷新基本过滤器。

根据您的情况,我认为 的示例脚本可能会有用。但是,在您的情况下,脚本的修改点可能会有点复杂。所以,在这里,我想把修改后的示例脚本作为示例脚本。

示例脚本:

请将以下脚本复制粘贴到Google Spreadsheet的脚本编辑器中,请设置sheet下拉列表的名称和单元格A1Notation,并保存脚本。当您运行此脚本时,请编辑下拉列表。这样,这个脚本就自动 运行.

function onEdit(e) {
  const sheetName = "Sheet1"; // Please set your sheet name.
  const dropDownCell = "B3"; // Please set the range of dropdown list.

  const range = e.range;
  const sheet = range.getSheet();
  if (sheet.getSheetName() != sheetName || range.getA1Notation() != dropDownCell) return;

  // Here, the existing basic filter is refreshed.
  const filter = sheet.getFilter();
  if (filter) {
    const range = filter.getRange();
    for (let i = range.getColumn(), maxCol = range.getLastColumn(); i <= maxCol; i++) {
      const filterCriteria = filter.getColumnFilterCriteria(i)
      if (filterCriteria) {
        filter.setColumnFilterCriteria(i, filterCriteria);
      }
    }
  }
}
  • 关于 const dropDownCell = "B3";,不幸的是,从您显示的示例图像中,我无法理解下拉列表的单元格范围。所以,请设置并保存脚本。

参考文献:

已添加:

根据您提供的示例 Spreadsheet,当我看到它时,似乎在您添加基本过滤器时没有过滤值。而且,当下拉列表发生变化时,我的脚本会刷新基本过滤器。从这种情况来看,我认为您可能想将基本过滤器设置为数据范围。如果我的理解是正确的,请测试下面的示例脚本。

示例脚本:

function onEdit(e) {
  const sheetName = "My Orders"; // Please set your sheet name.
  const dropDownCell = "B4"; // Please set the range of dropdown list.

  const range = e.range;
  const sheet = range.getSheet();
  if (sheet.getSheetName() != sheetName || range.getA1Notation() != dropDownCell) return;

  // Here, the existing basic filter is refreshed.
  const filter = sheet.getFilter();
  if (filter) {
    filter.remove();
  }
  const values = sheet.getRange("D3:K" + sheet.getLastRow()).getValues();
  const row = values.length - [...values].reverse().findIndex(r => r.findIndex(c => c.toString() != "") > -1) + 2;
  sheet.getRange("D3:K" + row).createFilter();
}
  • 在此示例脚本中,当您更改下拉列表时,基本过滤器设置为“D3:K”的数据范围。