【问题标题】:Google Sheets Script to Hide Row if Checkbox Checked如果选中复选框,Google表格脚本将隐藏行
【发布时间】:2019-06-16 09:20:54
【问题描述】:

我正在尝试找到一个工作代码,如果选中该行的 F 列中的复选框,该代码将自动隐藏该行。

我已经尝试了我找到的所有脚本,但似乎没有任何效果。不幸的是,我不精通代码,我无法找到问题所在。

这是我目前拥有的:

function onOpen() {
  var s = SpreadsheetApp.getActive().getSheetByName("Checklists");
  s.showRows(1, s.getMaxRows());

  s.getRange('F2:F200')
    .getValues()
    .forEach( function (r, i) {
    if (r[0] == "TRUE") 
      s.hideRows(i + 1);
    });
}

我正在处理的工作表是“清单”,包含复选框的列是 F。复选框的值是 TRUE 或 FALSE。如果值为 TRUE,我希望隐藏该行。

谁能帮忙!!!

【问题讨论】:

  • 复选框如何取消选中(值更改为False)以使该行不隐藏?
  • @PeterT 我不需要取消选中它。完成后,我不需要再次查看它,但是我不想删除它,因为我们会记录所有内容。

标签: checkbox google-apps-script google-sheets hide checked


【解决方案1】:

我能够运行的快速测试是在 F 列中设置一列复选框,然后创建一个函数来捕获工作表上的每个编辑事件。这将在用户选中一个框时立即捕获,然后隐藏该行。

使用onEdit 事件的诀窍在于确定实际更改了哪个单元格。在您的情况下,如果更改发生在 F 列中的复选框上,您只想完全遵循您的逻辑。在我的代码中,我一直在使用一个函数来确保更改在所需的范围内。函数如下所示:

function isInRange(checkRange, targetCell) {
  //--- check the target cell's row and column against the given
  //    checkrange area and return True if the target cell is
  //    inside that range
  var targetRow = targetCell.getRow();
  if (targetRow < checkRange.getRow() || targetRow > checkRange.getLastRow()) return false;

  var targetColumn = targetCell.getColumn();
  if (targetColumn < checkRange.getColumn() || targetColumn > checkRange.getLastColumn()) return false;

  //--- the target cell is in the range!
  return true;
}

因此,您的onEdit 函数所要做的就是在触发编辑事件时进行快速调用,以查看更改是否在您要查找的范围内。在这种情况下,我用我的范围设置了一个变量来检查:

var thisSheet = SpreadsheetApp.getActiveSheet();
var checkRange = thisSheet.getRange("F2:F200");  
if (isInRange(checkRange, eventObj.range)) {

之后,只需选择行号并隐藏或显示即可。这是完整的示例解决方案:

function isInRange(checkRange, targetCell) {
  //--- check the target cell's row and column against the given
  //    checkrange area and return True if the target cell is
  //    inside that range
  var targetRow = targetCell.getRow();
  if (targetRow < checkRange.getRow() || targetRow > checkRange.getLastRow()) return false;

  var targetColumn = targetCell.getColumn();
  if (targetColumn < checkRange.getColumn() || targetColumn > checkRange.getLastColumn()) return false;

  //--- the target cell is in the range!
  return true;
}

function onEdit(eventObj) {
  //--- you could set up a dynamic named range for this area to make it easier
  var thisSheet = SpreadsheetApp.getActiveSheet();
  var checkRange = thisSheet.getRange("F2:F200");  
  if (isInRange(checkRange, eventObj.range)) {
    //--- so one of the checkboxes has changed its value, so hide or show
    //    that row
    var checkbox = eventObj.range;
    var rowIndex = checkbox.getRow();
    Logger.log('detected change in checkbox at ' + checkbox.getA1Notation() + ', value is now ' + checkbox.getValue());
    if (checkbox.getValue() == true) {
      Logger.log('hiding the row');
      thisSheet.hideRows(rowIndex, 1);
    } else {
      Logger.log('showing the row');
      thisSheet.showRows(rowIndex, 1);
    }
  }
}

【讨论】:

  • 我可以在代码中的哪个位置确保这是脚本只是效果表“清单”? @PeterT
  • onEdit 函数中,在设置thisSheet 的第一行之后,插入与此类似的行:if (thisSheet.getSheetName() != 'Checklists') return; 如果不在正确的工作表上,该语句将立即退出该函数。
猜你喜欢
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多