有没有一种方法可以使用 Apps 脚本检查 Google 表格中的筛选视图是否隐藏了一行?
Is there a way to check if a row is hidden by a filter view in Google Sheets using Apps Script?
我的目标是确定某行是否被筛选视图隐藏。
据我所知和发布这个问题时,目前有两种方法可以检查一行是否隐藏:isRowHiddenByFilter(rowPosition)
and 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 脚本通过过滤器视图检索隐藏的行号。
问题和解决方法:
不幸的是,在现阶段,Spreadsheet 服务(SpreadsheetApp
) 中没有直接检索隐藏行和通过筛选视图显示行的方法。并且,Class Sheet 的“isRowHiddenByFilter”方法不能用于过滤视图。
但是,幸运的是,当使用 Sheets API 时,可以检索和创建过滤视图。在这个答案中,作为一种解决方法,我想建议使用 Sheets API 来实现您的目标。此解决方法的流程如下。
- 检索要使用的过滤器视图 (
filterViews
) 的设置。
- 此时可以使用“spreadsheets.get”的方法
- 使用检索到的过滤器视图设置,为您要使用的 sheet 创建新的基本过滤器。
- 此时可以使用“spreadsheets.batchUpdate”的方法
- 在基本过滤器的情况下,可以检索过滤的行。此解决方法使用这种情况。
- 检索 sheet 的
rowMetadata
的值。
- 此时可以使用“spreadsheets.get”的方法
- 在
rowMetadata
的值处,筛选出的行的 属性 为 "hiddenByFilter": true,
。使用它,您可以检索隐藏行 and/or 显示行。
- 删除创建的基本过滤器。
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。并且,请手动设置过滤器视图并设置过滤器视图名称。此脚本使用此过滤器视图。
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);
}
结果
当上面的脚本用于以下示例时 Spreadsheet,
未设置过滤视图之前。
设置过滤器视图后。
结果值
从上面的Spreadsheet,得到下面的结果。
{
"hiddenRows": [2, 3, 5, 6, 8, 9],
"showingRows": [1, 4, 7, 10, 11, 12, 13, 14, 15]
}
hiddenRows
是隐藏的行号。
showingRows
是showingRows行号。
注:
- 这是一种使用简单脚本的解决方法。所以请根据实际情况修改以上脚本。
参考资料
我的目标是确定某行是否被筛选视图隐藏。
据我所知和发布这个问题时,目前有两种方法可以检查一行是否隐藏:isRowHiddenByFilter(rowPosition)
and 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 脚本通过过滤器视图检索隐藏的行号。
问题和解决方法:
不幸的是,在现阶段,Spreadsheet 服务(SpreadsheetApp
) 中没有直接检索隐藏行和通过筛选视图显示行的方法。并且,Class Sheet 的“isRowHiddenByFilter”方法不能用于过滤视图。
但是,幸运的是,当使用 Sheets API 时,可以检索和创建过滤视图。在这个答案中,作为一种解决方法,我想建议使用 Sheets API 来实现您的目标。此解决方法的流程如下。
- 检索要使用的过滤器视图 (
filterViews
) 的设置。- 此时可以使用“spreadsheets.get”的方法
- 使用检索到的过滤器视图设置,为您要使用的 sheet 创建新的基本过滤器。
- 此时可以使用“spreadsheets.batchUpdate”的方法
- 在基本过滤器的情况下,可以检索过滤的行。此解决方法使用这种情况。
- 检索 sheet 的
rowMetadata
的值。- 此时可以使用“spreadsheets.get”的方法
- 在
rowMetadata
的值处,筛选出的行的 属性 为"hiddenByFilter": true,
。使用它,您可以检索隐藏行 and/or 显示行。
- 删除创建的基本过滤器。
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。并且,请手动设置过滤器视图并设置过滤器视图名称。此脚本使用此过滤器视图。
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);
}
结果
当上面的脚本用于以下示例时 Spreadsheet,
未设置过滤视图之前。
设置过滤器视图后。
结果值
从上面的Spreadsheet,得到下面的结果。
{
"hiddenRows": [2, 3, 5, 6, 8, 9],
"showingRows": [1, 4, 7, 10, 11, 12, 13, 14, 15]
}
hiddenRows
是隐藏的行号。showingRows
是showingRows行号。
注:
- 这是一种使用简单脚本的解决方法。所以请根据实际情况修改以上脚本。