计算运行时减去时间戳

时间:2013-04-24 15:22:42

标签: google-apps-script google-docs

我有一个表单通过“On form submit”触发器激活一个过程。在这个例程结束时,我想插入表单的时间戳和例程结束时的当前时间之间的时间差(其差异仅为几秒钟)。

到目前为止,我尝试了很多东西,但我通常收到的结果是NaN。

我认为最好的办法是构造运行时元素(H,M,S),同样从整个时间戳中解构出时间元素,然后对其进行一些数学运算:

var rt_ts = Math.abs(run_time - ts_time);

(顺便说一下,我从这个网站的某个地方得到了这个公式,但我现在显然已经抓住了任何东西。我似乎无法找到解决我的特定问题的线索)

我总是发现在Javascript中处理日期和时间是棘手的事情(例如:“月”从零开始而“日期”从1开始的怪癖。这是不必要的令人费解的事情)。 是否有人愿意引导我摆脱目前的“掌握”心态并引导我走向类似逻辑方法的东西?

2 个答案:

答案 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.

    }