google-apps-script - Google 表格中的静态时间戳
问题描述
每当导入或粘贴到工作表中时,我都会尝试将 STATIC 时间戳添加到我的数据中。
我现在正在使用这个公式
(=ARRAYFORMULA( IFS(I1:I="","",L1:L="",NOW(),TRUE,L1:L)))
但是,每当我再次打开工作表时,当我使用该now()
功能时,时间会自动更改为当前时间。我在脚本中尝试过on-Edit
,但它仅在手动输入数据时才有效。
在粘贴或导入数据时,我可以使用其他方法来静态时间戳吗?
解决方案
回答
您可以使用自定义函数通过方法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)
并返回原始公式。
更新
我已经更新了答案以解释如何在添加新值时更新时间戳:
- 使用单元格作为函数的输入,例如
=getTimeStamp(A1)
2。 - 创建一个 onEdit 触发器
- 检查
e
事件的范围是否属于新值。 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 函数的值并将其永久保存,直到再次执行触发器。
参考:
推荐阅读
- r - 切断功能中间图
- javascript - 将 href 附加到当前 url 的标记,而不是直接链接到 href 内部的内容
- css - 适用于桌面和移动设备的两列卡片布局
- ruby - Rspec 返回“意外的'{',期待keyword_end”的语法错误
- html - 如何使 1920-1080px html 页面适合屏幕并删除空白
- c++ - Enet:enet 可以处理多少个连续的连接?
- linux - 如何使用 Bash Shell 检查 Java 版本?
- .net - 如何发布特定文件而不是发布整个 SQL Server 数据库项目
- linux - 将程序的输出日志传递到函数中,同时将返回码存储在变量中
- c# - 如何绑定到列表内的元素