LoginSignup
11
9

More than 5 years have passed since last update.

[GAS]Spreadsheetの日付がシリアル値に変わる

Last updated at Posted at 2016-03-01

Google Spreadsheetで作成したシフト表スケジュールをGoogle Calendarに登録するGAS(Google Apps Script)を作って運用していたのだが、年が変わったタイミングでSpreadsheet側のシフト表レイアウトデザインを変更したら、日付の値が日付文字列からシリアル値に変わってしまって、GASがうまく動かなかった。

どうも日付セルの表示形式を変えるとExeclのようなシリアル値になってしまうようで、結構ハマってしまった。

レイアウト変更前

日付の表示形式(MM/DD)
date0201.png

Logger.log(values[row][col]); //Mon Feb 01 00:00:00 GMT+09:00 2016
var d = new Date(values[row][col]);
var yy  = d.getYear();
var mm  = d.getMonth() + 1;
var dd  = d.getDate();
var ymd = yy + "/" + mm + "/" + dd;
Logger.log(ymd); //2016/2/1 (正常)

レイアウト変更後

日付の表示形式(d)
date123.png

Logger.log(values[row][col]); //42401.0 シリアル値!
var d = new Date(values[row][col]);
var yy  = d.getYear();
var mm  = d.getMonth() + 1;
var dd  = d.getDate();
var ymd = yy + "/" + mm + "/" + dd;
Logger.log(ymd); // 70/1/1 (異常)

シリアル値とは

シリアル値は「1899年12月30日午前0時」からの経過日数です。Excelで使われている形式のようです。

シリアル値→UnixTimeStamp

↓で、GAS側は結局このように修正しました。

Logger.log(values[row][col]); //42401.0 シリアル値!
// excel_date_no(1900から加算日数)からUnixTime(1970からのmsec)に変換
var uxtime = (values[row][col] - 25569) * 86400000;
//日付セルから
var d   = new Date(uxtime);
var yy  = d.getYear();
var mm  = d.getMonth() + 1;
var dd  = d.getDate();
var ymd = yy + "/" + mm + "/" + dd;
Logger.log(ymd); //2016/2/1 (正常)

【参考】

GoogleスプレッドシートとGoogle Apps Scriptの日付
http://stabucky.com/wp/archives/7442

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9