首页 > 解决方案 > Google 表格中的静态时间戳

问题描述

每当导入或粘贴到工作表中时,我都会尝试将 STATIC 时间戳添加到我的数据中。

我现在正在使用这个公式

(=ARRAYFORMULA( IFS(I1:I="","",L1:L="",NOW(),TRUE,L1:L))) 

但是,每当我再次打开工作表时,当我使用该now()功能时,时间会自动更改为当前时间。我在脚本中尝试过on-Edit,但它仅在手动输入数据时才有效。

在粘贴或导入数据时,我可以使用其他方法来静态时间戳吗?

标签: google-apps-scriptgoogle-sheetstimestampspreadsheet

解决方案


回答

您可以使用自定义函数通过方法new Date()Properties Service返回实际日期。打开Apps Script并粘贴以下函数:

代码

function getTimestamp(reset) {

  // update the timestamp
  if (reset == 1) {
    setTime()
  }

  // try-catch structure in order to set the time in the first execution
  try {
    var time = ScriptProperties.getProperty('time')
  }
  catch (err) {
    setTime()
    var time = ScriptProperties.getProperty('time')
  }

  return time

}

function setTime() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var time = new Date()
  ScriptProperties.setProperty('time', time)
}

这个怎么运作

现在,您可以在任何单元格中使用它,例如另一个Sheet 函数。用 调用函数=getTimestamp(0)。在第一次执行时,它会尝试获取已保存的属性 time,但由于该属性不存在,它会生成一个时间戳并在项目中保存一个新属性,其中包含time时间戳的键和值。

在以下执行中,函数在重新计算时获得的值是相同的,因为除非使用输入调用函数,否则不会覆盖属性1=getTimestamp(1). 在这种情况下,时间戳会更新,但如果它没有设置回=getTimestamp(0),则每次重新计算函数时(每隔一段时间自动发生一次)时间戳都会改变。

总之,始终使用=getTimestamp(0). 当您要更新值时,将其更改为=getTimestamp(1)并返回原始公式。

更新

我已经更新了答案以解释如何在添加新值时更新时间戳:

  1. 使用单元格作为函数的输入,例如=getTimeStamp(A1)2。
  2. 创建一个 onEdit 触发器
  3. 检查e事件的范围是否属于新值。
  4. A1如果检测到新值,则将的值更新为 1,然后再更新为 0。

例子:

function onEdit(e){
  var range = e.range
  var cell = SpreadsheetApp.getActiveSpreadsheet().getRange('A4')
  if (range.columnStart > 1 && range.rowStart > 10){
    cell.setValue(1)
    SpreadsheetApp.flush()
    cell.setValue(0)
  }
}

如果从第 1 列和第 10 行添加新值,A1则更新为1,然后更新为0,从而更新 timeStamp 函数的值并将其永久保存,直到再次执行触发器。

参考:


推荐阅读