我有一个表单通过“On form submit”触发器激活一个过程。在这个例程结束时,我想插入表单的时间戳和例程结束时的当前时间之间的时间差(其差异仅为几秒钟)。
到目前为止,我尝试了很多东西,但我通常收到的结果是NaN。
我认为最好的办法是构造运行时元素(H,M,S),同样从整个时间戳中解构出时间元素,然后对其进行一些数学运算:
var rt_ts = Math.abs(run_time - ts_time);
(顺便说一下,我从这个网站的某个地方得到了这个公式,但我现在显然已经抓住了任何东西。我似乎无法找到解决我的特定问题的线索)
我总是发现在Javascript中处理日期和时间是棘手的事情(例如:“月”从零开始而“日期”从1开始的怪癖。这是不必要的令人费解的事情)。 是否有人愿意引导我摆脱目前的“掌握”心态并引导我走向类似逻辑方法的东西?
答案 0 :(得分:2)
您只需在onFormSubmit例程的顶部添加:
UserProperties.setProperty('start',new Date().getTime().toString())
这将在最后以毫秒为单位显示持续时间。
var duration = new Date().getTime()-Number(UserProperties.getProperty('start'))
按照您的评论编辑:
来自onFormSubmit事件的时间戳是e.values
返回的数组的第一个元素,请参阅docs here
所以我真的不明白你有什么问题?
下面的内容应该可行
var duration = new Date().getTime() - new Date(e.values[0]).getTime();//in millisecs
值为字符串我将其传递给'new Date'以使其再次成为日期对象。您可以使用这样的记录器轻松检查:
Logger.log(new Date(e.values[0]));//
它将以 Fri Mar 12 15:00:00 GMT + 01:00 2013
的形式返回完整的日期值但是值很可能与我的第一个建议相同,因为TimeStamp是触发函数的那一刻......
答案 1 :(得分:0)
我有一个函数可以在s列中显示带有时间戳的ss中的时间。它还会将脚本本身的时间添加到第一个时间戳(第3行)并在日志中显示。
请注意,Google电子表格时间戳的分辨率以秒为单位,脚本时间戳以毫秒为单位。因此,如果您只向电子表格时间戳添加300毫秒,则如果将其发回电子表格,则可能根本不会显示任何差异。下面的脚本只需要大约40毫秒的时间来运行,所以我添加了一个Utilities.sleep(0),您可以在其中将值0更改为1000以上以显示差异。
function testTime(){
var start = new Date().getTime();
var values = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
for(var i = 2; i < values.length ; i++){
Logger.log(Utilities.formatDate(new Date(values[i][0]),Session.getTimeZone(),'d MMM yy hh:mm:ss' )); // this shows the date, in my case same as the ss timestamp.
Logger.log( new Date(values[i][0]).getTime() ); // this is the date in Milliseconds after 1 Jan 1970
}
Utilities.sleep(0); //you can vary this to see the effects
var endTime = new Date();
var msCumulative = (endTime.getTime() - start);
Logger.log(msCumulative);
var msTot = (msCumulative + new Date(values[2][0]).getTime());
Logger.log('script length in milliseconds ' + msTot );
var finalTime = Utilities.formatDate(new Date(msTot), Session.getTimeZone(), 'dd/MM/yyyy hh:mm:ss');
Logger.log ( finalTime); //Note that unless you change above to Utilities.sleep(1000) or greater number , this logged date/time is going to be identical to the first timestamp since the script runs so quickly, less than 1 second.
}