Translate

2021年1月7日

Google Apps Script タイムゾーンの設定

ゾウでもわかる Google Apps Script

GAS(Google Apps Script)で文字型の日付時間をDate型にしてGoogleスプレッドシートにあるタイムスタンプと比較しようとしたら、なぜか一致してくれない、、、。

「何で?」と日時を格納した変数をログに出力してみると、

function myFunction() {
  d = new Date(`2020/01/01 10:10:10`)
  console.log(d)
}
Wed Jan 01 2020 10:10:10 GMT-0500 (Eastern Standard Time)

と表示されます。

GASがアメリカ東部標準時で表示

GMT-0500 (Eastern Standard Time) とは、 アメリカ東部標準時です。

シートの日時は日本時間(JST)で設定されていたので、同じ時間でもアメリカ東部標準とは14時間の時差があるので一致しないわけです。


Apps ScriptエディタでTimeZoneを設定する

GASでのTimeZone(タイムゾーン)を変更しようと思い、新しいApps Scriptエディタの「プロジェクトの設定」を見ましたが、タイムゾーンという設定項目がありません。

「appsscript.json」マニフェスト ファイルをエディタで表示する という項目には、チャックが入っていなかったので、確認のためにチェックを入れてみました。

新エディタでタイムゾーンの設定

エディタに戻ると、appsscript.jsonが表示されました。コードを見ると、timeZone(タイムゾーン)が "America/New_York" となっていました。

appsscript.json の内容

下記が、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)
}
Wed Jan 01 2020 10:10:10 GMT+0900 (Japan Standard Time)

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('不一致')
  }
}

これを実行すると

d1= Fri Jan 01 2021 10:00:00 GMT+0900 (Japan Standard Time)
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(ミリ秒)で表示させると一致していることがわかります。

d1 msec= 1609462800000
d2 msec= 1609462800000
一致

GASの基礎を学べる参考図書

ある程度プログラミンがわかっていれば、WEBやYoutubeでも十分に調べられると思いますが、初歩的なところからであれば参考図書は有効な学習手段です。

詳解! Google Apps Script完全入門 [第3版]」は、プラグラミング初心者にわかりやすく説明されています。GASを最初に学ぶ一冊として良書です。

0 件のコメント:

コメントを投稿

アクセス上位(過去7日間)