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分ズレるのかも疑問ですが、面倒なので深く追わないことにします・・・)