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 操作在设计上是缓慢的。所以代码无论如何都会很慢。