GAS(Google Apps Script)で文字型の日付時間をDate型にしてGoogleスプレッドシートにあるタイムスタンプと比較しようとしたら、なぜか一致してくれない、、、。
「何で?」と日時を格納した変数をログに出力してみると、
function myFunction() { d = new Date(`2020/01/01 10:10:10`) console.log(d) }
と表示されます。
GMT-0500 (Eastern Standard Time) とは、 アメリカ東部標準時です。
シートの日時は日本時間(JST)で設定されていたので、同じ時間でもアメリカ東部標準とは14時間の時差があるので一致しないわけです。
Apps ScriptエディタでTimeZoneを設定する
GASでのTimeZone(タイムゾーン)を変更しようと思い、新しいApps Scriptエディタの「プロジェクトの設定」を見ましたが、タイムゾーンという設定項目がありません。
「appsscript.json」マニフェスト ファイルをエディタで表示する という項目には、チャックが入っていなかったので、確認のためにチェックを入れてみました。
エディタに戻ると、appsscript.jsonが表示されました。コードを見ると、timeZone(タイムゾーン)が "America/New_York" となっていました。
下記が、appsscript.json のソースになります。
{ "timeZone": "America/New_York", "dependencies": { }, "exceptionLogging": "STACKDRIVER", "runtimeVersion": "V8" }
この timeZoneの値を、"Asia/Tokyo" に変更して保存。
{ "timeZone": "Asia/Tokyo", "dependencies": { }, "exceptionLogging": "STACKDRIVER", "runtimeVersion": "V8" }
もう一度、下記のコードを実行すると、
function myFunction() { d = new Date(`2020/01/01 10:10:10`) console.log(d) }
GMT+0900 (Japan Standard Time) 日本標準時に変わりました。
タイムゾーンを変更したら、プロジェクトの設定の『「appsscript.json」マニフェスト ファイルをエディタで表示する』のチェックを外すとエディタに表示されなくなります。
旧エディタなら簡単にタイムゾーンの変更が可能
新エディタにしていたので設定項目がありませんでしたが、旧エディタならタイムゾーンの変更がUIでできることが後からわかりました。
① ファイル→プロジェクトのプロパティを選択
② タイムゾーンを(GMT+09:00)東京 に変更して保存
こちらの方が簡単でしたね。
日時の比較
ちなみにDate型の変数は、そのまま等符号では比較できません。
function myFunction() { var d1 = new Date('2021/01/01 10:00:00') var d2 = new Date('2021/01/01 10:00:00') if (d1 == d2) { console.log('d1=',d1) console.log('d2=',d2) console.log('一致') } else { console.log('d1=',d1) console.log('d2=',d2) console.log('不一致') } }
これを実行すると
d2= Fri Jan 01 2021 10:00:00 GMT+0900 (Japan Standard Time)
不一致
と、同じ日時を代入した変数なのに一致しません。
日時の比較は、getTIme()でミリ秒に変換して比較するのが一番簡単な方法です。
function myFunction() { var d1 = new Date('2021/01/01 10:00:00') var d2 = new Date('2021/01/01 10:00:00') if (d1.getTime() == d2.getTime()) { console.log('d1 msec=',d1.getTime()) console.log('d2 msec=',d2.getTime()) console.log('一致') } else { console.log('d1 msec=',d1.getTime()) console.log('d2 msec=',d2.getTime()) console.log('不一致') } }
d1に代入した日時をmsec(ミリ秒)で表示させると一致していることがわかります。
d2 msec= 1609462800000
一致
GASの基礎を学べる参考図書
ある程度プログラミンがわかっていれば、WEBやYoutubeでも十分に調べられると思いますが、初歩的なところからであれば参考図書は有効な学習手段です。
「詳解! Google Apps Script完全入門 [第3版]」は、プラグラミング初心者にわかりやすく説明されています。GASを最初に学ぶ一冊として良書です。
Udemy オススメ講座
【新IDE対応】Google Apps Script(GAS)の基礎を完全習得
講師:事務職たらこ
印象に残りやすい手書き風スライドを用いGASの基本的なプログラミングを気軽に学ぶことができる。本講座でGASを活用した自動化ができるレベルにはなれないが、基礎としては十分。