シートでは11月1日なのに、GASのログには10月31日と出る場合は、まず同じ日時をどのタイムゾーンで表示したかを比べます。日付が変わったことと、違う地域の時刻として表示されたことを区別しないと、正しい日時へ1日を加えてしまうことがあります。
Apps Scriptのプロジェクトとスプレッドシートは、それぞれ別のタイムゾーンを持ちます。処理を直す前に両方の設定を読み、表示用に渡したタイムゾーンも確かめます。このページは画面へ値を送る際の型変換ではなく、シートとスクリプトの時刻設定の違いを調べる例です。
シートとスクリプトの設定を読む
スクリプト側はSession.getScriptTimeZone()、シート側はgetSpreadsheetTimeZone()で取得できます。公式のSession資料でも、2つの設定が別であることが説明されています。
両方が違っていても、必ず設定ミスとは限りません。日本の締め日を日本時間で扱い、外部サービスとの日時はUTCで保存する設計もあります。「どの日に集計したいのか」を決めてから、表示する側の設定を選びます。
練習では、絶対的な日時が分かる2026-10-31T15:30:00Zを使います。末尾のZはUTCです。これを日本時間で表示すると11月1日0時30分、UTCなら10月31日15時30分です。日付だけを比べると、1日違って見える例になります。
同じDateを並べて表示する
以下は設定と表示結果を読み取るだけで、プロジェクトやシートの設定を書き換えません。日付パターンは、月が大文字のMM、分が小文字のmmである点にも注意してください。
function describeDateZones(value, scriptZone, sheetZone) {
if (!(value instanceof Date) || !Number.isFinite(value.getTime())) {
throw new Error('有効なDateを指定してください');
}
const pattern = 'yyyy-MM-dd HH:mm';
return {
instant: value.toISOString(),
scriptZone: scriptZone,
scriptText: Utilities.formatDate(value, scriptZone, pattern),
sheetZone: sheetZone,
sheetText: Utilities.formatDate(value, sheetZone, pattern)
};
}
function previewTimeZones() {
const book = SpreadsheetApp.getActiveSpreadsheet();
const sample = new Date('2026-10-31T15:30:00Z');
console.log(JSON.stringify(describeDateZones(
sample, Session.getScriptTimeZone(), book.getSpreadsheetTimeZone()
)));
}
スクリプトがUTC、シートがAsia/Tokyoなら、scriptTextは2026-10-31 15:30、sheetTextは2026-11-01 00:30になる想定です。instantは同じUTCの日時のままです。表示した結果だけを見て、元のDateを翌日へずらさないようにします。
日付だけの入力へ時刻を足さない
「11月1日の締め日」と「11月1日0時の瞬間」は用途が違います。日付だけの文字列をDateへ変えるときに、どの地域の何時なのかを決めずに進めると、境界のずれが入り込みます。
特に文字列へZを足す操作は、見た目をそろえるための加工ではありません。その時刻をUTCとして指定する意味になります。入力元のタイムゾーンが分からない日時へ、推測でZや時差を付けないでください。
シートの値もgetValuesで受け取るDateと、getDisplayValuesで得る表示文字列は別です。表示文字列は読み手向けの形式なので、地域や表示形式が違えば、同じ解析方法で読めるとは限りません。スプレッドシートの値と表示から使い分けを確認できます。
調べる順番を固定する
まず対象セルの値と表示を確認し、次にプロジェクトとシートの設定を控え、最後に文字列化している箇所へ渡すタイムゾーンを見ます。どの段階で日付が変わったかを分けると、設定を一度に変えずに済みます。
公式のUtilities.formatDateとSpreadsheetを基にしています。ローカルでは日時を固定した代用formatDateで、2つのタイムゾーンが別々に渡ることと不正なDateの拒否を確認しました。Google上の表示と設定画面は未確認です。
カレンダーへ登録するときは、表示だけでなく登録先のタイムゾーンも関係します。予定登録の基本と合わせて、日付だけなのか、時刻を持つ予定なのかを決めてください。
