Google Sheet - 根据单元格值而不是行号自动隐藏行
Google Sheet - Automatically hiding rows based on a cell value instead of a row number
我在应用程序脚本中创建了一个自定义菜单,其中包含 3 个子菜单:
- 隐藏一组特定的行
- 隐藏另一组行
- 取消隐藏所有内容
基本上,人们可以单击其中任何一个以获得更好的可见性。
我当前脚本的问题是,如果我放置过滤器,行将不会与我想隐藏的行匹配...
是否有任何方法可以根据其中一个单元格的值而不是行号来隐藏行? 这样无论我们过滤什么数据,所需的行都会保持隐藏状态。
下面我认为需要更改的部分代码:
function hideRowsC() {
const obj = [{ sheetName: "Keyword Report", hide: [3,7,20,25,37,43,49,53,57,60,68,77 ] }];
sample_(obj);
}
下面是我的完整脚本,如果它有助于解决我的问题。
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('Custom View')
.addItem('Keywords Only', 'hideRowsC')
.addItem('Categories Only', 'hideRowsK')
.addItem('View all', 'showRows')
.addToUi();
}
function showRows() {
const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
showRowsInAllSheets_(sheets);
}
function hideRowsC() {
const obj = [{ sheetName: "Keyword Report", hide: [3,7,20,25,37,43,49,53,57,60,68,77 ] }];
sample_(obj);
}
function hideRowsK() {
const obj = [{ sheetName: "Keyword Report", hide: [4,5,6,8,19,24,26,27,28,50,52,58,59,61,76,80,81,82 ] }];
sample_(obj);
}
function sample_(obj) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheets = ss.getSheets();
showRowsInAllSheets_(sheets);
const sheetObj = sheets.reduce((o, s) => (o[s.getSheetName()] = s, o), {});
obj.forEach(({ sheetName, hide }) => {
if (sheetObj[sheetName]) {
hide.forEach(h => sheetObj[sheetName].hideRows(h, 1));
}
});
}
function showRowsInAllSheets_(sheets) {
sheets.forEach(s => s.showRows(1, s.getMaxRows()));
}
我相信你的目标如下。
- 从
Is there any ways to hide rows based on the value of one of the cell instead of row number?
开始,您想通过检查特定列的值来隐藏行。
这样的话,下面的修改怎么样?
修改后的脚本:
本次修改修改了hideRowsC
和sample_
的功能。关于const obj = [{ sheetName: "Keyword Report", checkCol: 1, checkValue: "sample" }]
,在本例中,检查“A”列的值是否为sample
。并且,“A”列的值为 sample
的行被隐藏。
function hideRowsC() {
const obj = [{ sheetName: "Keyword Report", checkCol: 1, checkValue: "sample" }];
sample_(obj);
}
function sample_(obj) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheets = ss.getSheets();
showRowsInAllSheets_(sheets);
const sheetObj = sheets.reduce((o, s) => (o[s.getSheetName()] = s, o), {});
obj.forEach(({ sheetName, checkCol, checkValue }) => {
const s = sheetObj[sheetName];
if (s) {
s.getRange(1, checkCol, s.getLastRow()).getDisplayValues().forEach((e, i) => {
if (e == checkValue) s.hideRows(i + 1, 1);
});
}
});
}
- 在您的脚本中,请修改
hideRowsK
,与上述修改相同。
我在应用程序脚本中创建了一个自定义菜单,其中包含 3 个子菜单:
- 隐藏一组特定的行
- 隐藏另一组行
- 取消隐藏所有内容
基本上,人们可以单击其中任何一个以获得更好的可见性。 我当前脚本的问题是,如果我放置过滤器,行将不会与我想隐藏的行匹配...
是否有任何方法可以根据其中一个单元格的值而不是行号来隐藏行? 这样无论我们过滤什么数据,所需的行都会保持隐藏状态。
下面我认为需要更改的部分代码:
function hideRowsC() {
const obj = [{ sheetName: "Keyword Report", hide: [3,7,20,25,37,43,49,53,57,60,68,77 ] }];
sample_(obj);
}
下面是我的完整脚本,如果它有助于解决我的问题。
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('Custom View')
.addItem('Keywords Only', 'hideRowsC')
.addItem('Categories Only', 'hideRowsK')
.addItem('View all', 'showRows')
.addToUi();
}
function showRows() {
const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
showRowsInAllSheets_(sheets);
}
function hideRowsC() {
const obj = [{ sheetName: "Keyword Report", hide: [3,7,20,25,37,43,49,53,57,60,68,77 ] }];
sample_(obj);
}
function hideRowsK() {
const obj = [{ sheetName: "Keyword Report", hide: [4,5,6,8,19,24,26,27,28,50,52,58,59,61,76,80,81,82 ] }];
sample_(obj);
}
function sample_(obj) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheets = ss.getSheets();
showRowsInAllSheets_(sheets);
const sheetObj = sheets.reduce((o, s) => (o[s.getSheetName()] = s, o), {});
obj.forEach(({ sheetName, hide }) => {
if (sheetObj[sheetName]) {
hide.forEach(h => sheetObj[sheetName].hideRows(h, 1));
}
});
}
function showRowsInAllSheets_(sheets) {
sheets.forEach(s => s.showRows(1, s.getMaxRows()));
}
我相信你的目标如下。
- 从
Is there any ways to hide rows based on the value of one of the cell instead of row number?
开始,您想通过检查特定列的值来隐藏行。
这样的话,下面的修改怎么样?
修改后的脚本:
本次修改修改了hideRowsC
和sample_
的功能。关于const obj = [{ sheetName: "Keyword Report", checkCol: 1, checkValue: "sample" }]
,在本例中,检查“A”列的值是否为sample
。并且,“A”列的值为 sample
的行被隐藏。
function hideRowsC() {
const obj = [{ sheetName: "Keyword Report", checkCol: 1, checkValue: "sample" }];
sample_(obj);
}
function sample_(obj) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheets = ss.getSheets();
showRowsInAllSheets_(sheets);
const sheetObj = sheets.reduce((o, s) => (o[s.getSheetName()] = s, o), {});
obj.forEach(({ sheetName, checkCol, checkValue }) => {
const s = sheetObj[sheetName];
if (s) {
s.getRange(1, checkCol, s.getLastRow()).getDisplayValues().forEach((e, i) => {
if (e == checkValue) s.hideRows(i + 1, 1);
});
}
});
}
- 在您的脚本中,请修改
hideRowsK
,与上述修改相同。