带有复选框的许多不同列的确认警报消息,并在勾选复选框时自动将时间戳输入到几列

Confirmation alert msg for many different columns with checkboxes & automatically input timestamp to a few columns when the checkbox is ticked

我在这方面很不擅长,我尝试搜索并找到了一个稍微可行的脚本(应用程序脚本),但我无法让它按照我想要的方式工作。我确定我 added/edited 做错了。

我的 Google sheet 是一个小组工作跟踪器,如下图所示。

  1. 主要需要是在有人选中或取消选中这些列中的任何复选框时添加警告消息(以防止任何误点击 - 就像这样 )。我们将自定义单元格值用于选中和未选中分别为“1”和“0”。带有复选框的列是 F、K、P、R、S。

  2. 除此之外,我希望在选中 F&K 列中的任何复选框(并确认警报消息)时,将时间戳(格式 dd/mm/yyyy)填充到 2 列之外).但是,当取消选中已勾选的复选框时,不应删除或更新日期。

下面的脚本有一定的效果,但是不知道怎么修改。

function onEdit(e) {
  const sh=e.range.getSheet();
  if(sh.getName()=='Video Projects' && e.range.columnStart==6,11,16,18 && e.value=='1') {
    var resp=SpreadsheetApp.getUi().alert('Are you sure you want to tick this checkbox?', SpreadsheetApp.getUi().ButtonSet.YES_NO);
    if(resp==SpreadsheetApp.getUi().Button.YES) {
       var range = e.range;
  var sheet = range.getSheet();
  if(sheet.getSheetName() == "Video Projects") {
    if(range.columnStart == 6) {
      var nextCell = range.offset(0, 2);
      nextCell.setValue(new Date());
    } else if(range.columnStart == 11 && range.isChecked()) {
      var nextCell = range.offset(0, 2);
      nextCell.setValue(new Date());
    }
  }
};
    }else{
      e.range.setValue("0");
    }
  }

如果有人知道如何解决这个问题,那将非常有帮助! :)

function onEdit() {

  var now = new Date()
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
  var row = ss.getActiveRange().getRow() 

  ss.getRange(row, 1).setValue("value for first Col")
  ss.getRange(row, 2).setValue("value for second Col")
  ss.getRange(row, 3).setValue(now) //third Col with the current date/Time
}

每次您编辑文档中的任何单元格时,上面的代码都会触发。 为防止这种情况,您可以添加一个 if/else 语句来检查列。

  var col = ss.getActiveRange().getColumn()

  if (col == 2){//replace the 2 with the checkbox Column.
     //do this
  }

现在,每次您编辑第二列中的单元格并将值添加到同一行时,代码都会触发。

我相信你的目标如下。

  • 您想选中 F、K、P、R、S 列的复选框。
  • 单击“F”和“K”列的复选框时,您想将日期分别放入“H”和“M”列。

修改点:

  • e.range.columnStart==6,11,16,18用作if语句时,e.range.columnStart的所有值都是true。我认为这可能是您遇到问题的原因。

当这一点反映在你的脚本中,就变成了下面这样。

修改后的脚本:

function onEdit(e) {
  const columns = [6, 11, 16, 18, 19]; // columns F,K,P,R,S
  const { range, value } = e;
  const sheet = range.getSheet();
  if (sheet.getSheetName() != 'Video Projects' || !columns.includes(range.columnStart) || value == "0") return;
  const ui = SpreadsheetApp.getUi();
  const res = ui.alert('Are you sure you want to tick this checkbox?', SpreadsheetApp.getUi().ButtonSet.YES_NO);
  if (res == ui.Button.YES) {
    if (range.columnStart == 6 || (range.columnStart == 11 && value == "1")) {
      range.offset(0, 2).setValue(new Date());
    }
    return;
  }
  range.uncheck();
}

参考文献:

添加了 1 个:

关于您的以下 2 个新请求,

Request 1: could we also add the alert message when unchecking a checkbox too?

Request 2: Is it possible for it to input only the date as dd/mm/yyyy?

示例脚本如下

示例脚本:

function onEdit(e) {
  const columns = [6, 11, 16, 18, 19]; // columns F,K,P,R,S
  const { range, value } = e;
  const sheet = range.getSheet();
  if (sheet.getSheetName() != 'Video Projects' || !columns.includes(range.columnStart)) return;
  const ui = SpreadsheetApp.getUi();
  const res = ui.alert('Are you sure you want to tick this checkbox?', SpreadsheetApp.getUi().ButtonSet.YES_NO);
  if (res == ui.Button.YES) {
    if (range.columnStart == 6 || (range.columnStart == 11 && value == "1")) {
      range.offset(0, 2).setValue(Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd/MM/yyyy"));
    }
    return;
  }
  range.uncheck();
}

添加了 2 个:

关于您关注新请求,

Request 1: can be changed to "Are you sure you want to untick this checkbox?"

示例脚本如下

示例脚本:

function onEdit(e) {
  const columns = [6, 11, 16, 18, 19]; // columns F,K,P,R,S
  const { range, value } = e;
  const sheet = range.getSheet();
  if (sheet.getSheetName() != 'Video Projects' || !columns.includes(range.columnStart)) return;
  const ui = SpreadsheetApp.getUi();
  if (value == "0") {
    const res = ui.alert("Are you sure you want to untick this checkbox?", SpreadsheetApp.getUi().ButtonSet.YES_NO);
    if (res == ui.Button.NO) range.check();
    return;
  }
  const res = ui.alert('Are you sure you want to tick this checkbox?', SpreadsheetApp.getUi().ButtonSet.YES_NO);
  if (res == ui.Button.YES) {
    if (range.columnStart == 6 || (range.columnStart == 11 && value == "1")) {
      range.offset(0, 2).setValue(Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd/MM/yyyy"));
    }
    return;
  }
  range.uncheck();
}