我的目标是确定某行是否被筛选 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 来实现您的目标。此解决方法的流程如下。
- 检索您要使用的过滤器 View (
filterViews
) 的设置。- 此时可以使用“spreadsheets.get”方法。
- 使用检索到的过滤器 View 设置为要使用的工作表创建新的基本过滤器。
- 这种情况下,可以使用“spreadsheets.batchUpdate”方法。
- 在基本过滤的情况下,可以检索过滤后的行。此解决方法使用了这种情况。
- 检索工作表的
rowMetadata
值。- 此时可以使用“spreadsheets.get”方法。
- 在
rowMetadata
的值处,过滤后的行具有"hiddenByFilter": true,
属性。使用它,您可以检索隐藏的行和/或显示的行。
- 删除创建的基本过滤器。
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 之前。
设置过滤器 View 后。
结果值
从上面的电子表格中,得到以下结果。
{
"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/