Google App Scriptでスプレッドシートの時刻を読むと37分ずれる問題

“GAS スプレッドシート 時刻の読み込み ずれる"などのキーワードでググっても、標準時とJSTの時差9時間の解消法くらいしか出てこないので、わけが分からなかったのですよ。

症状

例えばスプレッドシートに、以下のように時刻を記入するわけです。
さらに、念のため、表示形式>数字>時間 に設定しておきます。

スクリプトの方では、例えば次のようにして値を読み込みます。

function myFunction() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName('Sheet 1');

  const rows = sheet.getLastRow();
  
  var values = sheet.getSheetValues(2,1,rows-1,8); #ヘッダー1行スキップ。
  Logger.log(values);
}

すると、"0:00:00″ のところが、"Sat Dec 30 00:37:40 GMT+09:00 1899″と読み込まれているわけです。
1899年は年の指定が無いので、1900年基準で適当にずれているのかなあとか思いつつ、37分というのが謎です。

  表示上の問題なのかと

  Logger.log(values[0][4].getHours()); # [4]はE列だから
  Logger.log(values[0][4].getMinutes());

とか実行してみても、しっかり"0″, “37"と返ってきます。つまりはシートから読みこんでDate型に変換された際に"37分"に変換されていることになります。なんじゃこれ。

ちなみに、以下のように日付を記入すると ”Thu Jun 30 00:00:00 GMT+09:00 2022”と正しく返ってきます。

原因と解決策

結論から言うと、スプレッドシートとApps Scriptのタイムゾーンの設定に差がありました。

まず、Apps Scriptの方は、左の歯車ボタンを押すと確認できます。JSTですね。

スプレッドシートの方ですが、ファイル>設定 で確認できます。
こいつがなぜか、同じ+9:00なんですが、"Dili"になっておりました。

で、これを Tokyo に変更して、「設定を保存」するわけです。

これで再度スクリプトを実行してみますと、”Sat Dec 30 00:00:00 GMT+09:00 1899”と、日付はともかく、時刻は正しく読み込まれました。

同じ GMT+09:00 のタイムゾーンなのですが、なぜかズレますね。気づきにくいです。

ちなみにこのスプレッドシートは、Googleフォームより回答の記録用として自動生成されたものです。
この際に生成されたシートのタイムゾーンのデフォルトが、なぜか"Dili"になっているわけですね。

同じ+9:00のタイムゾーンだけに、気づくのにえらく時間がかかりましたよ・・・
(そもそも同じ時差なのに37分ズレるのかも疑問ですが、面倒なので深く追わないことにします・・・)