如何仅在第一次编辑列时创建时间戳

时间:2019-06-12 08:31:32

标签: google-apps-script google-sheets

我有一个工作表,其中有一定数量的列,并且有一个时间戳专用的第一列。我的代码有效,但是每次都更新,我希望它仅在第一次编辑时更新。

我试图添加一些我发现但没有成功的代码。

function onEdit(e) {

var s = e.source.getActiveSheet(),
    cols = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
    colStamp = 1,
    ind = cols.indexOf(e.range.columnStart)
    if (s.getName() !== 'Feedback' || ind == -1) return;
e.range.offset(0, parseInt(colStamp - cols[ind]))
    .setValue(e.value ? new Date() : null);} 
{ if (e.range.offset(0, parseInt(colStamp - cols[ind])).getValue() === '') 
{ e.range.offset(0, parseInt(colStamp - cols[ind])).setValue(e.value ? new Date() : null);}}

我没有任何错误消息,处于活动状态时的最后一部分代码使整个代码无法正常工作。

2 个答案:

答案 0 :(得分:0)

要求:

在该行的第一次编辑时将时间戳记添加到单元格。


解决方案:

在设置日期值之前,请使用onEdit(e)简单触发器和if语句来确保timestamp列为空。


示例:

function onEdit(e) {
  var sh = e.source.getActiveSheet();
  var row = e.range.getRow();
  var col = e.range.getColumn();
  var stampCol = sh.getRange(row, 1);

  //check if "stampCol" is empty      
  if (!stampCol.getValue()) {
    var tz = e.source.getSpreadsheetTimeZone();
    var date = Utilities.formatDate(new Date(), tz, 'dd-MM-yyyy hh:mm:ss');
    stampCol.setValue(date); //set timestamp
  }
}

说明:

我已将var stampCol定义为已编辑同一行的第1列。然后,if语句检查stampCol是否为空,如果为空,则为该行加上时间戳。通过检查stampCol是否为空,它将阻止脚本在每次编辑时将时间戳记写入该行,因为该脚本仅在第一次运行时才为空。

然后使用Utilities.formatDate()创建一个时间戳,该时间戳具有脚本中定义的格式,您可以将其更改为想要的显示方式。当前,它使用的是var tz中电子表格的时区,您也可以更改此时区以使用首选时区设置。

以下是Google Apps脚本中的一些时区选项:

//use spreadsheet timezone setting
var tz = e.source.getSpreadsheetTimeZone();

//use script timezone setting
var tz = Session.getScriptTimeZone();

//enter your own time zone
var tz = 'GMT+0';

参考文献:

  1. Simple Triggers Documentation
  2. Time Zones
  3. Date Formats

答案 1 :(得分:0)

很抱歉,您的回复很晚!

非常感谢您的回答和解释,看来效果很好。

如果有问题,我会在这里发表评论。

干杯!