Google 电子表格:Hide/Unhide 单击按钮时在一组行中满足 x 条件的任何行?
Google Spreadsheet: Hide/Unhide any row that meets x condition in a group of rows when clicking button?
单击“button1”时,我希望代码检查第 38-58 行的第一个单元格(A 列),如果相应的单元格为空则隐藏该行,否则显示。
在这种情况下为空意味着该单元格仍然有一个公式,但只是空白。如果那不可能,“隐藏条件”可以是不是数字的单元格。
我想将它与下面的代码结合起来,当单元格 C4 和 D4 分别等于 0 时隐藏和显示第 10 行和第 11 行。
function button2(){
var ss = SpreadsheetApp.getActive();
var sheet = ss.getActiveSheet();
var cellRef1 = "C4";
var cellRef2 = "D4";
var cell1 = sheet.getRange(cellRef1);
var cell2 = sheet.getRange(cellRef2);
var value1 = cell1.getValue();
var value2 = cell2.getValue();
if (value1 == "0"){
sheet.hideRows(10);
}
if (value2 == "0"){
sheet.hideRows(11);
}
if (value1 != "0"){
sheet.showRows(10);
}
if (value2 != "0"){
sheet.showRows(11);
};
};
您可以这样 hide/unhide 行:
function hide_unhide_rows() {
var sheet = SpreadsheetApp.getActiveSheet();
var rows = sheet.getRange('a38:a58').getDisplayValues().flat();
rows.forEach((cell_value,i) => {
let index = i+38;
if (cell_value == '' && !sheet.isRowHiddenByUser(index)) sheet.hideRows(index);
if (cell_value != '' && sheet.isRowHiddenByUser(index)) sheet.unhideRows(index);
});
}
至于如何将它与您的代码结合起来,您可以在函数的末尾添加这一行:
hide_unhide_rows();
或者,这里是完整的组合代码:
function button2() {
var sheet = SpreadsheetApp.getActiveSheet();
var value1 = sheet.getRange('c4').getValue();
var value2 = sheet.getRange('d4').getValue();
if (value1 == 0) { sheet.hideRows(10) } else { sheet.showRows(10) }
if (value2 == 0) { sheet.hideRows(11) } else { sheet.showRows(11) }
var rows = sheet.getRange('a38:a58').getDisplayValues().flat();
rows.forEach((cell_value, i) => {
let index = i+38;
if (cell_value == '' && !sheet.isRowHiddenByUser(index)) sheet.hideRows(index);
if (cell_value != '' && sheet.isRowHiddenByUser(index)) sheet.unhideRows(index);
});
}
更新
如果您有多个范围要处理,则必须以这种方式更改代码中的几行:
function button(){
var sheet = SpreadsheetApp.getActiveSheet();
var value1 = sheet.getRange('c4').getValue();
var value2 = sheet.getRange('d4').getValue();
if (value1 == 0) { sheet.hideRows(10) } else { sheet.showRows(10) }
if (value2 == 0) { sheet.hideRows(11) } else { sheet.showRows(11) }
var list = ['a27:a29','a41:a60','a66:a85']; // <----------------- here
var rangeList = sheet.getRangeList(list).getRanges(); // <------- here
for (var range in rangeList){
var rows = rangeList[range].getDisplayValues().flat();
var shift = +list[range].split(':')[0].slice(1); // <---------- here
rows.forEach((cell_value, i) => {
let index = (i + shift); // <-------------------------------- here
if (cell_value == '' && !sheet.isRowHiddenByUser(index)) sheet.hideRows(index);
if (cell_value != '' && sheet.isRowHiddenByUser(index)) sheet.showRows(index);
});
}
}
如果范围太多,代码运行速度可能会很慢。有一种方法可以对其进行一些改进。但是 hide/unhide 操作在设计上是缓慢的。所以代码无论如何都会很慢。
单击“button1”时,我希望代码检查第 38-58 行的第一个单元格(A 列),如果相应的单元格为空则隐藏该行,否则显示。
在这种情况下为空意味着该单元格仍然有一个公式,但只是空白。如果那不可能,“隐藏条件”可以是不是数字的单元格。
我想将它与下面的代码结合起来,当单元格 C4 和 D4 分别等于 0 时隐藏和显示第 10 行和第 11 行。
function button2(){
var ss = SpreadsheetApp.getActive();
var sheet = ss.getActiveSheet();
var cellRef1 = "C4";
var cellRef2 = "D4";
var cell1 = sheet.getRange(cellRef1);
var cell2 = sheet.getRange(cellRef2);
var value1 = cell1.getValue();
var value2 = cell2.getValue();
if (value1 == "0"){
sheet.hideRows(10);
}
if (value2 == "0"){
sheet.hideRows(11);
}
if (value1 != "0"){
sheet.showRows(10);
}
if (value2 != "0"){
sheet.showRows(11);
};
};
您可以这样 hide/unhide 行:
function hide_unhide_rows() {
var sheet = SpreadsheetApp.getActiveSheet();
var rows = sheet.getRange('a38:a58').getDisplayValues().flat();
rows.forEach((cell_value,i) => {
let index = i+38;
if (cell_value == '' && !sheet.isRowHiddenByUser(index)) sheet.hideRows(index);
if (cell_value != '' && sheet.isRowHiddenByUser(index)) sheet.unhideRows(index);
});
}
至于如何将它与您的代码结合起来,您可以在函数的末尾添加这一行:
hide_unhide_rows();
或者,这里是完整的组合代码:
function button2() {
var sheet = SpreadsheetApp.getActiveSheet();
var value1 = sheet.getRange('c4').getValue();
var value2 = sheet.getRange('d4').getValue();
if (value1 == 0) { sheet.hideRows(10) } else { sheet.showRows(10) }
if (value2 == 0) { sheet.hideRows(11) } else { sheet.showRows(11) }
var rows = sheet.getRange('a38:a58').getDisplayValues().flat();
rows.forEach((cell_value, i) => {
let index = i+38;
if (cell_value == '' && !sheet.isRowHiddenByUser(index)) sheet.hideRows(index);
if (cell_value != '' && sheet.isRowHiddenByUser(index)) sheet.unhideRows(index);
});
}
更新
如果您有多个范围要处理,则必须以这种方式更改代码中的几行:
function button(){
var sheet = SpreadsheetApp.getActiveSheet();
var value1 = sheet.getRange('c4').getValue();
var value2 = sheet.getRange('d4').getValue();
if (value1 == 0) { sheet.hideRows(10) } else { sheet.showRows(10) }
if (value2 == 0) { sheet.hideRows(11) } else { sheet.showRows(11) }
var list = ['a27:a29','a41:a60','a66:a85']; // <----------------- here
var rangeList = sheet.getRangeList(list).getRanges(); // <------- here
for (var range in rangeList){
var rows = rangeList[range].getDisplayValues().flat();
var shift = +list[range].split(':')[0].slice(1); // <---------- here
rows.forEach((cell_value, i) => {
let index = (i + shift); // <-------------------------------- here
if (cell_value == '' && !sheet.isRowHiddenByUser(index)) sheet.hideRows(index);
if (cell_value != '' && sheet.isRowHiddenByUser(index)) sheet.showRows(index);
});
}
}
如果范围太多,代码运行速度可能会很慢。有一种方法可以对其进行一些改进。但是 hide/unhide 操作在设计上是缓慢的。所以代码无论如何都会很慢。