根据同一行中单元格的值停止编辑单元格

Stop edit of a cell based on the value of a cell in the same row

我正在尝试创建一条消息,当用户尝试编辑 D 列中的日期时选中同一行的 E 列中的复选框。最终,当检查同一行E列E时,我想阻止用户编辑D列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");
    }
    )

要阻止用户编辑单元格,请保护该单元格。

相关

  • Google sheet protect based on cell value

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

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

此外,当您使用“var editedColumn = 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");
      }
  }
    )

您可以在编辑后还原该值(如果选中编辑行中的复选框)

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

代码:

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

编辑选中复选框的单元格时:

注:

  • 我还建议您查看 Ruben 关于细胞保护的 link。那会有帮助。