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
- 这是一个使用简单脚本的变通方法。因此,请根据您的实际情况修改上述脚本