Google apps script 有没有办法使用Apps脚本检查Google工作表中的过滤器视图是否隐藏了一行?

Google apps script 有没有办法使用Apps脚本检查Google工作表中的过滤器视图是否隐藏了一行?,google-apps-script,google-sheets,google-sheets-api,Google Apps Script,Google Sheets,Google Sheets Api,我的目标是确定一行是否被过滤器视图隐藏 function myFunction() { const spreadsheetId = "###"; // Please set the Spreadsheet ID. const sheetName = "Sheet1"; // Please set the sheet name. const filterViewName = "sampleFilter1"; // Please

我的目标是确定一行是否被过滤器视图隐藏

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);
}
据我所知,在发布这个问题时,目前有两种方法可以检查行是否隐藏:和

isRowHiddenByFilter(行位置)
无法工作,因为它

“返回给定行是否被筛选器(而不是筛选器)隐藏 视图)。“——


有没有一种方法或解决方法可以实现我的目标?

我相信你的目标如下

  • 您希望使用Google Apps脚本通过过滤器视图检索隐藏的行号
问题和解决方法: 不幸的是,在当前阶段,没有直接检索隐藏行并通过电子表格服务中的筛选器视图显示行的方法(
SpreadsheetApp
)。并且,类工作表的“isRowHiddenByFilter”方法不能用于过滤器视图

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);
}
但是,幸运的是,当使用sheetsapi时,可以检索并创建过滤器视图。在这个答案中,作为一种解决方法,我建议使用Sheets API实现您的目标。此解决方案的流程如下所示

  • 检索要使用的筛选器视图(
    filterViews
    )的设置。
    • 在这种情况下,可以使用“spreadsheets.get”方法
  • 使用“过滤器”视图的检索设置为要使用的图纸创建新的基本过滤器。
    • 在这种情况下,可以使用“spreadsheets.batchUpdate”方法
    • 对于基本筛选器,可以检索已筛选的行。此解决方法使用这种情况
  • 检索工作表的
    行元数据的值。
    
    • 在这种情况下,可以使用“spreadsheets.get”方法
    • rowmatadata
      的值处,筛选的行具有
      “hiddenByFilter”的属性:true,
      。使用此选项,可以检索隐藏行和/或显示行
  • 删除创建的基本筛选器
  • 重要信息:在此流程中,在工作表中使用基本过滤器时,基本过滤器将被清除。请小心这个。测试此脚本时,请使用示例电子表格

    示例脚本: 在使用此脚本之前。并且,请手动设置过滤器视图并设置过滤器视图名称。此脚本使用此筛选器视图

    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);
    }
    
    结果 当上述脚本用于以下示例电子表格时

    未设置前过滤器视图。

    设置过滤器视图后。

    结果值 根据上述电子表格,得出以下结果

    {
      "hiddenRows": [2, 3, 5, 6, 8, 9],
      "showingRows": [1, 4, 7, 10, 11, 12, 13, 14, 15]
    }
    
    • hiddenRows
      是隐藏的行号
    • showingRows
      是showingRows行数
    注:
    • 这是一个使用简单脚本的变通方法。因此,请根据您的实际情况修改上述脚本
    工具书类

    您能否将工作表的工作副本与当前脚本共享?@JasonE。对不起,我真的不能因为保密协议。另外,如果您看到代码,为什么您认为它会有所不同?如果没有底层代码,这仍然是一个有效的问题。我想这是一个更一般的问题。