google-apps-script - 有没有办法使用 Apps 脚本检查 Google 表格中的筛选器 View 是否隐藏了行?

标签 google-apps-script google-sheets google-sheets-api

我的目标是确定某行是否被筛选 View 隐藏。

据我所知,在发布这个问题时,目前有两种方法来检查行是否隐藏:isRowHiddenByFilter(rowPosition)isRowHiddenByUser(rowPosition) .

isRowHiddenByFilter(rowPosition) 不起作用,因为它

"Returns whether the given row is hidden by a filter (not a filter view)." -- Method description in Google Apps Script Docs

有办法甚至解决方法来实现我的目标吗?

最佳答案

我相信您的目标如下。

  • 您想要使用 Google Apps 脚本通过过滤器 View 检索隐藏的行号。

问题和解决方法:

遗憾的是,现阶段还没有通过电子表格服务(SpreadsheetApp)中的筛选 View 直接检索隐藏行并显示行的方法。并且,Class Sheet 的“isRowHiddenByFilter”方法不能用于过滤 View 。

但是,幸运的是,当使用 Sheets API 时,可以检索并创建过滤器 View 。在这个答案中,作为一种解决方法,我想建议使用 Sheets API 来实现您的目标。此解决方法的流程如下。

  1. 检索您要使用的过滤器 View (filterViews) 的设置。
    • 此时可以使用“spreadsheets.get”方法。
  2. 使用检索到的过滤器 View 设置为要使用的工作表创建新的基本过滤器。
    • 这种情况下,可以使用“spreadsheets.batchUpdate”方法。
    • 在基本过滤的情况下,可以检索过滤后的行。此解决方法使用了这种情况。
  3. 检索工作表的rowMetadata 值。
    • 此时可以使用“spreadsheets.get”方法。
    • rowMetadata 的值处,过滤后的行具有 "hiddenByFilter": true, 属性。使用它,您可以检索隐藏的行和/或显示的行。
  4. 删除创建的基本过滤器。

IMPORTANT: In this flow, when the basic filter is used in the sheet, the basic filter is cleared. Please be careful this. When you test this script, please use the sample Spreadsheet.

示例脚本:

在使用此脚本之前,please enable Sheets API at Advanced Google services 。并且,请手动设置过滤器 View 并设置过滤器 View 名称。该脚本使用此过滤器 View 。

function myFunction() {
  const spreadsheetId = "###"; // Please set the Spreadsheet ID.
  const sheetName = "Sheet1"; // Please set the sheet name.
  const filterViewName = "sampleFilter1"; // Please set the filter view name.

  // 1. Retrieve the settings of the filter view (`filterViews`) you want to use.
  const res1 = Sheets.Spreadsheets.get(spreadsheetId, { ranges: [sheetName] });
  const sheetId = res1.sheets[0].properties.sheetId;
  const filterViews = res1.sheets[0].filterViews.filter(
    (e) => e.title == filterViewName
  );
  if (filterViews.length == 0) {
    throw new Error("Filter view cannot be found.");
  }

  // 2. Create new basic filter to the sheet you want to use using the retrieved settings of the filter view.
  const obj = filterViews[0];
  obj.range.sheetId = sheetId;
  const reqs = [
    { clearBasicFilter: { sheetId: sheetId } },
    {
      setBasicFilter: {
        filter: {
          criteria: obj.criteria,
          filterSpecs: obj.filterSpecs,
          range: obj.range,
          sortSpecs: obj.sortSpecs,
        },
      },
    },
  ];
  Sheets.Spreadsheets.batchUpdate({ requests: reqs }, spreadsheetId);

  // 3. Retrieve the values of `rowMetadata` of the sheet.
  const res2 = Sheets.Spreadsheets.get(spreadsheetId, {
    ranges: [sheetName],
    fields: "sheets",
  });
  const values = res2.sheets[0].data[0].rowMetadata.reduce(
    (o, r, i) => {
      if (r.hiddenByFilter && r.hiddenByFilter === true) {
        o.hiddenRows.push(i + 1);
      } else {
        o.showingRows.push(i + 1);
      }
      return o;
    },
    { hiddenRows: [], showingRows: [] }
  );

  // 4. Delete the created basic filter.
  Sheets.Spreadsheets.batchUpdate(
    { requests: [{ clearBasicFilter: { sheetId: sheetId } }] },
    spreadsheetId
  );

  console.log(values);
}

结果

当上述脚本用于以下示例电子表格时,

未设置过滤器 View 之前。

enter image description here

设置过滤器 View 后。

enter image description here

结果值

从上面的电子表格中,得到以下结果。

{
  "hiddenRows": [2, 3, 5, 6, 8, 9],
  "showingRows": [1, 4, 7, 10, 11, 12, 13, 14, 15]
}
  • hiddenRows 是隐藏行号。
  • showingRows 是 ShowingRows 行号。

注意:

  • 这是使用简单脚本的解决方法。所以请根据您的实际情况修改上述脚本。

引用文献

关于google-apps-script - 有没有办法使用 Apps 脚本检查 Google 表格中的筛选器 View 是否隐藏了行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67488186/

相关文章:

permissions - 启用谷歌电子表格API

pdf - 将 PDF 转换为 Google 文档

javascript - 在 Google Apps 脚本中将一维数组转换为对象

google-sheets - 如何避免/绕过/忽略Google表格中的#N/A #NV错误?

html - 如何在电子邮件中使用 CSS(特别是设计超链接按钮)

javascript - 每个循环的简单谷歌电子表格?

google-apps-script - 有没有办法重用在遍历一列值时将行附加到工作表的逻辑?

google-apps-script - 如何将参数传递给嵌入在站点页面中的 Google Apps Script Gadget?

python - Google Sheets 通过 API 交替颜色

google-sheets-formula - 有没有办法隐藏 Google 工作表单元格中的公式?