Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google apps script 勾选复选框将触发函数以添加时间戳_Google Apps Script_Google Sheets - Fatal编程技术网

Google apps script 勾选复选框将触发函数以添加时间戳

Google apps script 勾选复选框将触发函数以添加时间戳,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我正在建立一个电子表格来跟踪特定的数据。当我勾选一个复选框时,我想在相应的相邻单元格中放置一个时间戳——或者,如果复选框上有一个注释,说明最后一次勾选TRUE的时间,我会很高兴 我花了整整一天的时间在Stackoverflow和google上搜索一切,我尝试了许多不同的方法和功能。我主要是使用onEdit(e)函数(尝试)添加时间戳。早期的尝试发现了一个已知的缺陷,这意味着onEdit(e)没有捕获复选框更改状态的所有实例。我相应地改变了我的方法,既尝试将时间戳添加到相应的相邻单元格中,又向复选

我正在建立一个电子表格来跟踪特定的数据。当我勾选一个复选框时,我想在相应的相邻单元格中放置一个时间戳——或者,如果复选框上有一个注释,说明最后一次勾选TRUE的时间,我会很高兴

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

目前我对这个问题有三个主要问题:

  • 了解检查复选框值的语法(我是否使用==、或==、我是否使用
    ”、
    ”或不使用引号?)。这听起来像是一个非常愚蠢的问题,但我在学习上有困难,并且在记忆中保留书面信息时有很大困难:(

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

  • 我更愿意在复选框单元格上设置一个带有时间戳的注释,当复选框被取消选中时,时间戳会被清除-但是我几次让它工作时,时区是不正确的。我读了很多关于
    timezone
    的书,但是没有一个工作示例,我无法理解如何在代码中实现它。我+10 GMT

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

    这是我一直在编写的最新一代代码。我可能尝试过六个完全不同的函数,但在几个小时后删除了每一个:

    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()
    ,或者复选框会添加一条说明“任务完成:dd/mm/yyyy”(+10 GMT时区)。然后,我希望清除时间戳单元格,或者如果复选框状态为未选中,则清除注释。

    尝试以下操作:

    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"));
      }
    }
    

    多亏了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();
      }
    

    复选框可以有任何值表示“选中”状态,而任何其他值表示“未选中”。您可以创建复选框,其中“FALSE”表示“选中”,而“TRUE”表示“未选中”“。您需要将单元格值与数据验证规则的标准进行比较,请参见我的。就
    ==
    ===
    而言,在您能想到的几乎所有情况下,您都希望严格相等。(您应该避免在答案中放置解决方案)好吧,你告诉我如何在评论中格式化代码,这样就不会乱七八糟。当我对最终答案感到满意时,我会相应地发布它。你还想告诉我我做错了什么?如果库珀的帖子回答了你的一个具体问题,那么就把它标记为答案。(一个问题=一篇帖子。)如果您有第二个问题或后续问题,请提出一个新问题,并与您在此处所做的工作相同,您在何处解释了问题以及您为解决问题所做的努力,以及您在研究时发现了哪些相关的SO/互联网帖子。评论不用于发布复杂的代码。请告诉我Cooper-我是否应该接受您的答案是不是我不会得到我的最终解决方案?还是我应该接受我的,因为这是我在问题中提出的所有问题的最终脚本。我非常感谢你的帮助。这个网站的目标是程序员们互相帮助,成为更好的程序员,而不是那些得分最高的程序员。就我个人而言,我为自己是一名优秀的程序员而感到自豪我可以根据自己的需要修改自己的程序,我很高兴你能够主动改进我的工作,并得到你想要的答案,所以选择你自己的答案,并为此感到高兴。谢谢你,库珀,你太好了。我能直截了当地跟你说,避免将来出现这些陈词滥调吗?j/k:D uti的最佳方式是什么lize stack overflow在我看来是创建一个最小的完整可验证示例,其中包含您的问题的本质。这就是我在自己的工作中所做的。当我开始遇到一个我以前从未见过的问题时,我开始试着思考如何编写这个最小的完整可验证示例这样我就可以把它作为一个问题提交给stack overflow。通常,这有助于我解决自己的问题。当问题没有解决时,它就变成了一个问题。试图避开其他志愿者只会伤害你,因为他们中的许多人知道的比我多得多。