【问题标题】:Hide Rows Based on Check Boxes - Google App Script根据复选框隐藏行 - Google App 脚本
【发布时间】:2018-08-09 00:03:58
【问题描述】:

我正在尝试根据“C”列中选中的复选框隐藏某些行。

简单地说,如果“选项 A”被选中,我只想显示第 11 - 13 行和第 22 行。如果“选项 B”被选中。我只想显示第 14 - 15 行和第 22 行等。

我还想让它们在我取消选中后恢复。这更像是一个学习练习,所以我稍后会“检查多个框”。

我想知道那里是否也应该有一些“for”逻辑?我只是不确定在哪里......

任何帮助或建议将不胜感激!如果需要,很高兴了解更多细节。

非常感谢,

-M

【问题讨论】:

    标签: google-apps-script google-sheets google-workspace


    【解决方案1】:

    这个修改怎么样?我认为您的情况有几个答案。因此,请将此视为其中之一。

    修改点:

    • 使用onEdit() 运行脚本。 @I'-'I 提到了这一点。
    • 检索所有复选框的值。
    • 显示和隐藏对应于每个复选框的行。

    修改后的脚本:

    当你使用这个修改后的脚本时,

    • 请将此脚本复制并粘贴到您的脚本编辑器中,然后保存。当您选中工作表上的复选框时,会显示和隐藏行。
      • 在使用此脚本之前,请确认您的项目中没有onEdit() 函数。
    • 当您修改复选框和行的单元格时,请设置cfg。例如,当“C7”处有一个复选框,并且行从第11行到第13行时,请设置C7: {startRow: 11, endRow: 13}
    脚本 :
    function onEdit(e) {
      var cfg = { // Please set this object.
        C7: {startRow: 11, endRow: 13},
        C8: {startRow: 14, endRow: 16},
        C9: {startRow: 17, endRow: 19},
        C10: {startRow: 20, endRow: 21}
      };
    
      var activeRange = e.range.getA1Notation();
      var ranges = Object.keys(cfg);
      if (cfg[activeRange]) {
        var sheet = e.source.getActiveSheet();
        var values = sheet.getRange(ranges[0] + ":" + ranges[ranges.length - 1]).getValues();
        values.forEach(function(e, i) {
          if (e[0]) {
            sheet.showRows(cfg[ranges[i]].startRow, cfg[ranges[i]].endRow - cfg[ranges[i]].startRow);
          } else {
            sheet.hideRows(cfg[ranges[i]].startRow, cfg[ranges[i]].endRow - cfg[ranges[i]].startRow);
          }
        });
      }
    }
    

    注意:

    • 在此修改后的脚本中,如果多个复选框为真,则显示与每个复选框对应的行。
    • 如果要在特定的sheet运行脚本,请修改为if (cfg[activeRange] && e.source.getSheetName() == "### sheet name ###") {

    参考:

    如果我误解了你的问题,请告诉我。我想修改它。

    编辑:

    当用户打开电子表格时,您希望显示所有行而不隐藏。如果我的理解是正确的,那又如何呢?

    function onOpen(e) {
      var cfg = { // Please set this object.
        C7: {startRow: 11, endRow: 13},
        C8: {startRow: 14, endRow: 16},
        C9: {startRow: 17, endRow: 19},
        C10: {startRow: 20, endRow: 21}
      };
      var sheet = e.source.getSheetByName("### sheet name ##");
      var ranges = Object.keys(cfg);
      sheet.showRows(cfg[ranges[0]].startRow, cfg[ranges[ranges.length - 1]].endRow - cfg[ranges[0]].startRow);
      sheet.getRange(ranges[0] + ":" + ranges[ranges.length - 1]).setValue(true);
    }
    
    • 当您使用它时,请将其复制并粘贴到您的脚本编辑器中。
    • onOpen() 可用于在打开电子表格时运行。
    • 您也可以将cfg 用作全局变量。
    • sheet.getRange(ranges[0] + ":" + ranges[ranges.length - 1]).setValue(true);中的true修改为false时,当电子表格打开时,所有复选框均不勾选,显示所有行。

    【讨论】:

    • @Marcus 很抱歉给您带来不便。你是如何运行脚本的?当您通过脚本编辑器运行它时,会发生此类错误。由于此脚本使用onEdit(),因此可以通过单击电子表格上的复选框来运行该脚本。您可以尝试单击电子表格上的复选框吗?
    • 为什么要从对象到数组? indexOf 比使用括号运算符慢:if (cfg[activeRangeStr])
    • @tehhowch 感谢您的评论。是的。我认同。所以我更新了我的答案。
    • @Nivi 很高兴您的问题得到了解决。顺便说一句,关于您在评论中的问题,您希望在用户打开电子表格时显示所有行而不隐藏。我的理解正确吗?
    • @Nivi 我添加了一个示例脚本,用于在打开电子表格时显示所有行。如果我误解了你的问题,我很抱歉。
    【解决方案2】:
    function onEdit(e) {
    
        // Replace with the name of your sheet
        var sheetName = 'NameofYourSheet';
    
        // Align the trigger to the 4 checkboxes
        if (e.source.getActiveSheet().getName() != sheetName 
            || e.range.rowStart < 6 || e.range.rowStart > 11 || e.range.columnStart != 3) {
            return;
        }
    
        // Get checkbox values
        var sh = SpreadsheetApp.getActive().getSheetByName(sheetName),
            status = sh.getRange('C7:C10').getValues();
    
        // Crude helper func
        function showHideRow(v, i) {
            // [[row, numberRows]]
            var rows = [[11,3],[14,3],[17,3],[20,2]];
    
            return v[0]
                   ? sh.showRows.apply(sh, rows[i])
                   : sh.hideRows.apply(sh, rows[i])
        };
    
        status.forEach(showHideRow);
    }
    

    【讨论】:

    • 谢谢!但是,似乎出现错误TypeError: Cannot read property "source" from undefined. (line 7, file "Code") Line 7: if (e.source.getActiveSheet().getName() != sheetName
    • 好的,它按我的预期工作。您是否将 sheetName 更改为您正在使用的工作表名称字符串?这是我能想到的唯一原因。最好的问候
    • 这是一个触发函数,所以不要直接从脚本运行它。当检查/取消选中“C7:C10”中的框时,它将起作用
    • 我想知道是否有办法在所有框都未选中时显示所有行?非常感谢。我必须改变什么?谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-04
    • 2022-07-07
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多