【问题标题】:Apps Script to update Timestamp when data is inserted automatically in google sheet当数据自动插入谷歌表格时,应用程序脚本更新时间戳
【发布时间】:2021-04-19 08:44:23
【问题描述】:

当在第 3 列中编辑数据或复制粘贴数据时,此代码可以正常工作,但如果在复制/粘贴整行时光标仍停留在第 1 列,则它不会更新,其次,如果销售人员发送数据到第 3 列,那个时候也不起作用,请在这里帮帮我。

function onEdit() {
  var s = SpreadsheetApp.getActiveSheet();
  var sName = s.getName();

  var r = s.getActiveCell();
  var row = r.getRow();
  var ar = s.getActiveRange();
  var arRows = ar.getNumRows()
  // Logger.log("DEBUG: the active range = "+ar.getA1Notation()+", the number of rows = "+ar.getNumRows());
  

  if( r.getColumn() == 3 && sName == 'Sheet1') { //which column to watch on which sheet
   // loop through the number of rows
    for (var i = 0;i<arRows;i++){
      var rowstamp = row+i;
      SpreadsheetApp.getActiveSheet().getRange('F' + rowstamp.toString()).setValue(new Date()).setNumberFormat("MM/dd/yyyy hh:mm"); //which column to put timestamp in
    }
  }
 }//setValue(new Date()).setNumberFormat("MM/dd/yyyy hh:mm:ss");

【问题讨论】:

    标签: google-apps-script timestamp google-sheets-formula


    【解决方案1】:

    解释:

    需要了解的三个重要事项:

    • 正如official documentation 中所述,onEdit 触发器在用户 编辑时触发。此函数不会被公式或其他脚本触发。如果 salesforce 或除用户之外的任何其他服务,编辑列 C onEdit 触发器将不会被激活。存在变通办法,但这些变通办法取决于您的特定问题的上下文。我建议您搜索或询问有关它的具体问题。

    • 关于您遇到的其他问题,您应该摆脱活动范围并利用event object。此对象包含有关用户所做的编辑/编辑的信息。

    • 正如Best Practices 所建议的那样,您不应在工作表中反复设置值,但您可以通过选择一系列单元格并设置值来一次性完成。在您的情况下,您希望在所需范围内的所有单元格中设置相同的值,因此使用setValue 而不是setValues。但我们的想法是摆脱for 循环。

    解决方案:

    function onEdit(e) {
      var s = e.source.getActiveSheet();
      var sName = s.getName();
      var ar = e.range;
      var row = ar.getRow();
      var arRows = ar.getNumRows()  
      if( ar.getColumn() == 3 && sName == 'Sheet1') { 
          s.getRange(row,6,arRows).setValue(new Date()).setNumberFormat("MM/dd/yyyy hh:mm");
      }
     }
    

    注意:

    同样,onEdit 是一个触发函数。你应该手动执行它,如果你这样做,你实际上会得到错误(因为使用了事件对象)。您所要做的就是保存这段代码 sn-p 到脚本编辑器,然后它会在编辑时自动触发。

    【讨论】:

    • 谢谢,Marios,感谢您的及时回复。我尝试运行您的代码,但它抛出错误“无法读取未定义的属性'源'”。我什至用 SpreadsheetApp.getActiveSpreadsheet() 替换了它,但随后它向我显示了范围未定义的错误,任何提示,提前致谢!
    • 对不起,我现在意识到当 C 列有一个活动游标并且数据被插入或更新时它工作正常。谢谢
    • @PratibhaRajpoot 很高兴它成功了。考虑通过单击答案左侧的勾选按钮来接受答案。
    • 在事件对象中:source = 一个电子表格对象,代表脚本绑定到的 Google 表格文件。电子表格。当我对事件对象进行字符串化时,我看到了 {}。没有迹象表明电子表格中的哪个工作表已更改。触发器是否仅在有单个工作表或更改哪个工作表无关紧要时才有用?
    • @aNewb 感谢您的评论。 e.source 确实为您提供了脚本绑定的 spreadsheet 对象。您可以从该对象获取已编辑的工作表:sheet = e.source.getActiveSheet()。从中您可以获得工作表的名称或该工作表的任何其他信息 (gid) 或其他任何信息。例如sheet.getName()。因此,您可以将工作表的名称作为条件(如我上面的回答)以仅针对电子表格文件中的特定工作表(选项卡)执行一些代码。
    猜你喜欢
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 2018-01-09
    • 2020-02-05
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多