首页 > 解决方案 > 当数据自动插入谷歌表格时,应用脚本更新时间戳

问题描述

当在第 3 列中编辑数据或复制粘贴数据时,此代码可以正常工作,但如果在复制/粘贴整行时光标仍位于第 1 列,则它不会更新,其次,如果 Salesforce 将数据发送到列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-scripttimestampgoogle-sheets-formula

解决方案


解释:

三个重要的事情要知道:

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

  • 关于您遇到的另一个问题,您应该摆脱活动范围并利用事件对象。该对象包含有关用户所做的编辑/编辑的信息。

  • 正如最佳实践所建议的那样,您不应在工作表中反复设置值,但您可以通过选择一系列单元格并设置值来一次性完成。在您的情况下,您希望在所需范围内的所有单元格中设置相同的值,因此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是触发功能。您应该手动执行它,如果这样做,您实际上会收到错误(因为使用了事件对象)。您所要做的就是将此代码片段保存到脚本编辑器中,然后它会在编辑时自动触发。


推荐阅读