GoogleスプレッドシートとGoogle Apps Scriptの日付

GoogleスプレッドシートからGoogleカレンダーにインポート」を書いたのですが、今回、こんな質問をいただきました。
「開始時刻を設定し、終了時刻は自動的にその1時間後にする方法はないか」
そこでGoogle Apps Scriptで日時がどのように扱われているか、調べてみました。

Googleスプレッドシート

スプレッドシート上のセルの表示は次のとおりだったとします。

2015/05/07 10:00:00

実際には、ここにはシリアル値「42131.4166666667」が入っています。
シリアル値は「1899年12月30日午前0時」からの経過日数です。
起点が少し違いますがExcelと同じ考え方です。Excelのシリアル値は「1899年12月31日午前0時」からの経過日数です。Excelには有名な「バグ」あるいは「変な仕様」があって、1900年は閏年ではないのに「1900年2月29日」が存在します。Googleスプレッドシートはこれに合うように起点をずらしたのだと思います。実際に1900年3月以降のシリアル値はExcelとGoogleで一致します。

Google Apps Script

「getValue()」を使ってセルの値を取得すると次のようになります。Chromeでログを取りました。

Thu May 07 10:00:00 GMT+09:00 2015

これはJavaScriptの日付オブジェクトです。
したがってJavaScriptの日付関係のメソッドが使えます。
Googleカレンダーに予定をセットするには、createEventメソッドを使いますが、ここで日時をJavaScriptの日付オブジェクトで指定すればよいです。

終了時刻を開始時刻の1時間後にする

次のサンプルでは、Googleスプレッドシート上のB2セル(2, 2)を開始時刻とし、終了時刻に1時間後の日付オブジェクトをセットします。

sheet = SpreadsheetApp.getActiveSheet();
start = sheet.getRange(2, 2).getValue();
end = new Date(start.getTime() + 1 * 60 * 60 * 1000);

「start.getTime()」で開始時刻の通算ミリ秒を取得します。
JavaScriptは日付を「1970年1月1日午前0時」からの通算ミリ秒で管理しています。
1日は「24時間×60分×60秒×1000ミリ=86400000ミリ秒」となります。
1時間は「1 * 60 * 60 * 1000」ミリ秒となるのでこれを加えると1時間後の通算ミリ秒になります。
「new Date(通算ミリ秒)」とすることで日付オブジェクトが得られます。

コメント

タイトルとURLをコピーしました