0

「フォーム送信時」トリガーを介してプロシージャをアクティブにするフォームがあります。このルーチンの最後に、フォームのタイムスタンプと現在の時刻の差をルーチンの最後に挿入したいと思います (その差はほんの数秒です)。

これまで多くのことを試してきましたが、通常受け取る結果は NaN です。

私の最善の策は、ランタイム要素 (H、M、S) を構築し、同様にタイムスタンプ全体から時間要素を分解し、それに対して少し計算を実行することだと思いました。

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

(ところで、私はこのサイトのどこかからその式を入手しましたが、この時点で明らかに何かを把握しています.私は特定の問題が対処されているスレッドを見つけることができないようです)

Javascript で日付と時刻を処理するのは厄介な作業であることが常にわかっています (例: 「月」がゼロから始まり、「日付」が 1 から始まるという癖。それは不必要に頭を悩ませます)。だれかが、私の現在の「把握している」考え方から私を導き出し、論理的なアプローチに似たものへと私を導いてくれませんか?

4

2 に答える 2

2

これを onFormSubmit ルーチンの先頭に追加するだけです。

  UserProperties.setProperty('start',new Date().getTime().toString())

最後に、ミリ秒単位で期間が表示されます。

var duration = new Date().getTime()-Number(UserProperties.getProperty('start'))

あなたのコメントに続いて編集してください:

onFormSubmit イベントからのタイムスタンプは、こちらのドキュメントe.valuesを参照して返される配列の最初の要素です

だから私はあなたがどんな問題を抱えているのかよくわかりません??

以下のようなものが機能するはずです

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の形式で完全な日付値を返します 。

しかし、タイムスタンプは関数がトリガーされた瞬間であるため、値はおそらく最初の提案と同じになります...

于 2013-04-24T19:41:43.140 に答える
0

列 A にタイムスタンプを含む 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.

    }
于 2013-04-24T19:20:31.727 に答える