adsense自動レスポンシブ

GAS全般 GoogleAppsScript 日付・時刻

Spreadsheetでの日付と、Google Apps ScriptでのnewDate()

更新日:

Google Spreadsheetで、セルに入力された日付や時刻をGoogle Apps Script(以下GAS)で扱いたい、というシーンも多いと思います。

GASでのnew Date()の使い方と、それらの日付や時刻をSpreadsheetのセルにsetValue()した時の動きについてまとめました。

 

JavaScriptのnew Date()の基本

GASはJavaScriptで記述するので、基本的な部分はJavaScriptのページを参考にすると良いでしょう。(Dateオブジェクト

GASでnew Date()するには、以下のように書きます。

 

GASで日付、時刻を抜き出す

上記を踏まえて、日付や時刻だけを取り出すには、GASのUtilitiesクラスにある formatDate(date, timeZone, format) を使って以下のように記述します。

 

セルに入力された日付や時刻の値

いよいよ本題です。

Spreadsheetのセルに「4/1」や「10:00」という値を入力した場合、画面上どう見えるかはセルの書式の問題ですが、実態としてはどういう値をもっているのでしょうか。

セルに日付や時刻を入力した場合、セルの書式に依存して、見た目は↑こうなるが、内部では別の値を持っている。

実は、任意のセル(RANGE)に入力された値を、GASで RANGE.getValue() で取得すると、"4/1"や"10:00"とは入ってきません。

 

実際には以下のようになります。

  • 日付だけを入力した場合は、時刻は"00:00:00"が入る
  • 時刻だけを入力した場合は、"1899/12/30"になっている

特に後者の時刻が問題で、Google Spreadsheetでは、"1899/12/30 00:00:00"が起点になっていることに注意してください。

ちなみに、JavaScriptのnew Date()についての記述を見ると以下のようになっています。

Date オブジェクトは、1970 年 1 月 1 日 (UTC) から始まるミリ秒単位の時刻値を基準としています。

別に異なっていても不思議ではないですし、特に悪さもしないのですが、なんとなく同じだろう思い込んでいるとそれもまたミスにつながるので認識だけしておきましょう。

 

任意の日付や時刻をセルに入力する方法

ここまでくるともうお分かりかと思います。

GASで、setValue()などで、任意のセル(RANGE)に日付や時刻を入力するには、狙い通りにnew Date()およびUtilities.formatDate()してやればOKです。

 

そうすると、セルの書式設定が自動の場合は、ともに"9:30"と表示されますが、書式を「日時」に変更すると日付が違うことが分かると思います。

書式が「自動」の場合は同じ結果に見えるが、書式を「日時」にすると違う日付が入力されていることが分かる。

 

そして、実は、この書式「自動」というのが曲者なのです。

 

時刻の引き算はセルの書式で変わる

ここで、Spreadsheet内で計算式が組んであったとしましょう。

まず、書式「自動」の場合、問題なく時間差が計算されていることがわかります。

書式が「自動」の場合、問題なく時間差が計算されている。

 

でも、次が問題です。

セルの書式のおかげで、見た目上は、"10:00 - 9:30" でその差"0:30"となっていても、内部値としては2018年と1899年ということで違ったはずです。

そこで、書式を「日時」に変更して、年月日まで見えるようにすると、Spreadsheetは途端に厳密に計算するのです。

書式が「日時」になると、厳密に日付を見て計算される。

1899年どうしで引き算した10行目の結果は正しいのですが、9行目が「1781年」という意味不明な数字になっています。

これは、2行目の「1899年」から5行目の「2018年」を引いたミリ秒を、あらためて「日付」書式に直した結果なのです。

まとめ

もっともこれらは、Spreadsheetの動きとしては正しい計算だと思います。
ただ、書式「自動」の頭が良すぎて、いい動きをまさに「自動で」してくれている、だけのことだと言えます。

では、GASではどういう動きをするのでしょうか?

答え:厳密に日付こみで計算されます。

そりゃそうですよね。
GASの中では、書式が「書式なしテキスト」になってない限りは、getValue()で取得した日付や時刻はDate型で値を持っているので、常に年月日を意識して処理しましょう。

レクタングル336

レクタングル336

-GAS全般, GoogleAppsScript, 日付・時刻

Copyright© JJ BLOG , 2019 All Rights Reserved.