勾选复选框会触发添加时间戳的功能

时间:2019-03-27 18:53:14

标签: google-apps-script google-sheets

我正在构建一个跟踪特定数据的电子表格。勾选复选框时,我想在相应的相邻单元格中放置一个时间戳-另外,我对复选框上的注释注明上次被勾选为TRUE的时间也很满意。

我花了一整天的时间在Stackoverflow和google上搜索所有内容,并且尝试了许多不同的方法和功能。首先,我一直使用onEdit(e)函数来(尝试并)添加时间戳。早期尝试发现了一个已知缺陷,这意味着onEdit(e)并未捕获复选框更改状态的所有实例。我相应地更改了方法,既尝试将时间戳添加到相应的相邻单元格,又尝试在复选框单元格中添加注释-两者似乎都偶尔起作用,这非常令人沮丧。

此刻,我有三个主要问题:

  1. 知道用于检查复选框值的语法(我使用==还是===,并且我使用'',"还是不使用引号? )。这听起来像是一个非常愚蠢的问题,但是我在学习上遇到困难,并且在将书面信息保留在我的记忆中时遇到了很大的困难:(

  2. 成功设置了一个'if'->'else if'语句,该语句将根据复选框的状态“切换”打开或关闭时间戳。

  3. 我希望在复选框未选中时清除带有复选框上时间戳的注释,但是我确实有几次使它起作用,时区不正确。我做了很多关于timezone的阅读,但是没有一个有效的示例,我无法理解如何将其实现到我的代码中。我是格林尼治标准时间+10

我提供了电子表格的精简版,其中仅包含我遇到问题的特定工作表和代码:

https://docs.google.com/spreadsheets/d/1NCdMziBpj0joSv9lQfqT9etz9hMsvgMeuT8X9XTxR20/edit?usp=sharing

这是我一直在努力的最新代码迭代。我可能已经尝试了六种完全不同的功能,但是在碰了几个小时后又删除了每个功能:

function onEdit() {
  var ss = SpreadsheetApp.getActiveSheet();

  if(ss.getName() == "Quests" ) { //checks that we're on the correct sheet
    var tickboxCell = s.getActiveCell();
    if(tickboxCell.getColumn() == 3 && tickboxCell.getValue() === 'TRUE' ) { //checks the status of the tickbox
      var dateCell = tickboxCell.offset(0, 1);
      dateCell.setValue(new Date());
    }
  }
}

这是我修改的用于向复选框添加注释的示例代码:

function setNote(note){
    var note = note;
    var cell = SpreadsheetApp.getActiveSheet().getActiveCell();

    if(note == ""){
        cell.clearNote();
    }else{
        cell.setNote(note);
    }
}

我希望每当勾选一个复选框时,右侧的相应单元格都会输入date(),或者该复选框会添加一个注释,说明“ Quest Completed:dd / mm / yyy”(+ 10 GMT时区)。然后,我希望可以清除时间戳记单元格,或者如果未选中复选框状态,则可以清除便笺。

2 个答案:

答案 0 :(得分:3)

尝试一下:

function onEdit(e) {
  if(e.range.getSheet().getName() != 'Quests') { return; }
  if(e.range.columnStart==3 && e.value=="TRUE") {
    e.range.offset(0,1).setValue(Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyyMMdd:HHmm"));
  }
}

答案 1 :(得分:1)

感谢Cooper,他使我的代码正确无误。它并没有完全满足我的期望,但是它使我能够对其进行一些小的更改,以完全获得我的期望。

编辑:我也找到了setNote的解决方案,我将在这里提供。

向相邻单元格添加/删除日期的代码:

function onEdit(e) {
  if (e.range.getSheet().getName() != 'Quests') { return; }
  if (e.range.columnStart==3 && e.value=="TRUE") {
    e.range.offset(0,1).setValue(new Date());
  }
  else if (e.range.columnStart==3 && e.value=="FALSE") {
    e.range.offset(0,1).clearContent();
  }
} 

用于在带有正确时区的复选框中添加/删除setNote的代码:

  if(e.range.getSheet().getName() != 'Quests') { return; }
  if(e.range.columnStart==3 && e.value=="TRUE") {
    e.range.setNote('Completed: ' + Utilities.formatDate(new Date(), SpreadsheetApp.getActive().getSpreadsheetTimeZone(), "dd-MM-yy HH:mm:ss"));
  }
  else if (e.range.columnStart==3 && e.value=="FALSE") {
    e.range.clearNote();
  }