【问题标题】:Stop edit of a cell based on the value of a cell in the same row根据同一行中单元格的值停止编辑单元格
【发布时间】:2021-03-25 04:21:04
【问题描述】:

当用户尝试在同一行的 E 列中的复选框被选中时编辑 D 列中的日期时,我正在尝试创建一条消息。最终,当检查同一行的 E 列时,我想阻止用户编辑 D 列,但从我读过的内容来看,我不相信你能做到这一点。以下是我的脚本,非常感谢您的帮助。

function onEdit(e){
  var range = e.range
  var sheet = range.getSheet();
  var sheetName = "Sheet Name";
  var row = range.getRow();
  var checkboxColumn = range.getColumn();
  var editedColumn = range.getValue();
  var checkbox = range.getValue();
  if (sheet.getName() == sheetName && editedColumn == 4 && checkboxColumn == 5 && row > 2 && checkbox == true) {
    Browser.msgBox("my message");
    }
    )

【问题讨论】:

  • 您应该能够使用数据验证实现数据输入的“阻止”。在要限制输入的单元格上,启用数据验证并选择“自定义公式”选项。公式将为 =( = FALSE)。然后选择“拒绝输入”。然后测试 - 当复选框被勾选并且您尝试输入一个值时,您会看到一条消息(您可以输入一些内容,但是一旦您移动单元格或按 Enter,就会出现该消息并且不允许输入) .取消选中复选框后,您将能够输入值。
  • 当然,使用数据验证限制数据输入的一个缺点是,如果您想应用某种其他类型的数据验证(例如限制为列表),那么显然您不能有多个不同的数据验证规则

标签: javascript google-apps-script google-sheets triggers


【解决方案1】:

编辑后可以恢复值(如果编辑行中的复选框被勾选)

另外,您的脚本中存在一些需要更新的问题。请参阅 Craig 对这些问题的解释。

代码:

function onEdit(e){
  var range = e.range
  var sheet = range.getSheet();
  var sheetName = "Sheet Name";
  var editedRow = range.getRow();
  var editedColumn = range.getColumn();
  var checkbox = sheet.getRange(editedRow, 5).getValue();
  if (sheet.getName() == sheetName && editedColumn == 4 && editedRow > 2 && checkbox == true) {
    Browser.msgBox("Reverting cell to original value. You can't edit this cell.");
    e.range.setValue(e.oldValue);
  }
}

示例:

或者您可以使用普通的旧数据验证:

公式:

=INDIRECT(ADDRESS(ROW(), COLUMN() + 1, 4)) = FALSE

当编辑单元格时,勾选复选框: h3>

注意:

  • 我还建议您查看 Ruben 关于细胞保护的链接。这会有所帮助。

【讨论】:

    【解决方案2】:
    【解决方案3】:

    希望您可以使用其中一种建议的方法来阻止数据输入,使用复选框值作为条件。

    但是,让我们看看您的实际脚本,以便您了解哪里出了问题。传递给“onEdit”方法的参数具有对正在编辑的单元格的引用。因此,当用户尝试编辑其中一个日期字段(例如 D3)时,“e”参数将保存对“D3”的引用(第 4 列,第 3 行)。但是,稍后在函数中您有“var checkboxColumn = range.getColumn()”。因此,当您的日期单元格被编辑时,您会试图说复选框列是第 4 列? ……那行不通。

    此外,当您有“vareditColumn = range.getValue()”时,它将获取单元格内的值(用户输入或选择的日期),而不是单元格的列索引。

    这是我对脚本的建议更改

    function onEdit(e){
      var range = e.range
      var sheet = range.getSheet();
      var sheetName = "Sheet Name";
      var row = range.getRow();
      var col = range.getColumn();
    
      //var checkboxColumn = range.getColumn(); <-- not going to get the checkbox column when date is being edited
      //var editedColumn = range.getValue(); 
      //var checkbox = range.getValue();
      //if (sheet.getName() == sheetName && editedColumn == 4 && checkboxColumn == 5 && row > 2 && checkbox == true) {
        //Browser.msgBox("my message");
        //}
    
      if (sheet.getName() == sheetName && col == 4 && row > 2)
      {
          // only run further logic if we know that the date column is being edited
          //
          // use getRange() to get the relative check-box cell, one column over, and then its value
          //
          if (sheet.getRange(row, (col + 1)).value == true) // the check-box (column 5) is ticked
          {
              Brower.msgBox("my message");
          }
      }
        )
    

    【讨论】:

    • 有道理 - 谢谢你的帮助
    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多