【问题标题】:Static timestamping in Google SheetsGoogle 表格中的静态时间戳
【发布时间】:2021-08-06 10:02:59
【问题描述】:

我正在尝试将 STATIC 时间戳添加到我的数据中,无论何时导入或粘贴到工作表中。

我现在正在使用这个公式

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

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

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

【问题讨论】:

  • 鉴于onEdit 触发器不适用于您的情况,我们能否知道您的数据是如何“粘贴或导入”的?
  • 我正在使用 importrange 函数从不同的工作表中导入一些数据,当它用数据填充工作表时,我的 onEdit 触发器不起作用,即使我手动粘贴这些数据也没有触发器,所以只有当我手动进行更改然后它被触发时,是否有任何替代方法。我只想标记非易失性的时间戳

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


【解决方案1】:

回答

您可以通过new Date()Properties Service 方法使用custom function 返回实际日期。打开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 function。使用=getTimestamp(0) 调用该函数。在第一次执行时,它会尝试获取已保存的propertytime,但由于该属性不存在,它会生成一个时间戳并在项目中保存一个带有键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 函数的值并永久保存,直到再次执行触发器。

参考资料:

【讨论】:

  • 嗨,感谢您的回答,我相信它会起作用,但我无法弄清楚,我希望在添加新值时更改时间戳,但我想保留以前的时间戳不变时,你能帮我写下公式吗?
  • 所以你希望它根据 another 单元格值更新时间戳,这样当它改变时,你的时间戳也会更新?可以参考this question
【解决方案2】:

而不是公式中的NOW(),而是使用new Date() 通过脚本执行。

NOW() 函数会更新时间戳每次电子表格打开或其中发生更改,而 new Date() 为您提供完整的(日期和时间)和静态时间戳。 p>

另外,正如我在您的问题的 cmets 上看到的,确实没有办法通过自动化脚本和宏使用 onEdit()

【讨论】:

  • 我正在使用这个函数 todaysDate() { var td = new Date();返回 td.getDate() + "/" + (td.getMonth() + 1)+ "/" + td.getFullYear() + " " + td.getHours() + ":" + td.getMinutes() + ":" + td.getSeconds(); } 获取静态日期,现在我的问题是当我打开它或再次登录时它也会更新,你能给我一个替代的脚本
猜你喜欢
  • 2012-07-15
  • 2019-10-01
  • 2020-12-27
  • 2012-12-04
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
相关资源
最近更新 更多