Google Spreadsheetで作成したシフト表スケジュールをGoogle Calendarに登録するGAS(Google Apps Script)を作って運用していたのだが、年が変わったタイミングでSpreadsheet側のシフト表レイアウトデザインを変更したら、日付の値が日付文字列からシリアル値に変わってしまって、GASがうまく動かなかった。
どうも日付セルの表示形式を変えるとExeclのようなシリアル値になってしまうようで、結構ハマってしまった。
レイアウト変更前
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 (正常)
レイアウト変更後
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