
目次
「集計表の日付欄が、いつの間にか5桁の数字になっている」「アプリの画面では正しいのに、スプレッドシートを開くと1日前の日付になっている」——業務自動化の現場で、地味に多いトラブルがこれです。
私たちが担当した実案件(匿名)でも、スプレッドシート・GAS・AppSheetの3層でデータをやり取りする仕組みで、日付が壊れる事象が2パターン発生しました。厄介なのは、どちらも画面上は正しく見える瞬間があることです。気づいたときには、集計結果や日報の締め日がずれている。
この記事では、その2つの原因と対処法、導入時に確認しておくべきチェックリストを整理します。
この記事の結論
- 日付が数字になる原因は型の不一致。文字列で書き込むと壊れる
- 日付が1日ズレる原因はタイムゾーン設定の不一致
- 対策は開発の最初に型とタイムゾーンを揃えること
スプレッドシートの日付が数字になる原因とは
前提として、スプレッドシートは日付を内部的に連番の数値として保持しています。画面に「2026/08/08」と表示されていても、中身は数値です。表示形式が日付になっているから、日付らしく見えているだけ、と考えると分かりやすくなります。
つまり、日付が「45857」のような数字で表示されているとき、データが壊れているわけではありません。中身の数値に対して、日付の表示形式が当たっていない状態です。
問題は、この数値と表示形式のズレが、GASや外部アプリからの書き込みをきっかけに起きることです。人が手で入力しているうちは滅多に起きませんが、自動化の仕組みを挟んだ瞬間に表面化します。
3層でデータが流れる仕組みでは、壊れる箇所は次のとおりです。
パターン1:文字列で書き込んだ日付がシリアル値と誤解釈される
1つ目は、GASからスプレッドシートへ日付を文字列として書き込んだケースです。
プログラム側では、日付を扱いやすいように「2026-08-08」といった文字列に整形することがよくあります。ところが、その文字列や、処理の途中で数値に変わった値をそのままセルに書き込むと、スプレッドシート側が「これは日付の連番だな」と判断してしまうことがあります。
結果として現れたのが、「45857/01/01」のような表示でした。本来の日付の連番が「年」として解釈され、そこに月日が補われた形です。
このパターンの厄介な点は3つあります。
- 一部の行だけ壊れることがあり、全件チェックしないと見つからない
- エラーにならないため、処理は正常終了してしまう
- 集計関数やピボットは「日付として」計算するため、とんでもない値が静かに混ざる
見た目の異常に気づけた時点で、まだ運がいい方です。数字が数字のまま集計に流れ込むと、月次レポートの数字だけがおかしくなり、原因追跡に時間がかかります。
対処はシンプルで、日付は文字列ではなくDateオブジェクトで渡すことです。 そのうえで、書き込み先の列の表示形式を「日付」に固定しておきます。整形した文字列が必要なのは、あくまでメール本文やファイル名など「見せる」場面だけ、と切り分けておくと迷いません。
パターン2:シートとスクリプトのタイムゾーン不一致で1日ズレる
2つ目は、より気づきにくいトラブルです。
スプレッドシートにはファイルごとのタイムゾーン設定があり、GASのプロジェクトにもスクリプト側のタイムゾーン設定があります。この2つは別物で、それぞれ独立して設定されています。
実案件で起きたのは、シート側が米国の時間(ロサンゼルス)のまま、スクリプト側は日本時間(JST)という組み合わせでした。新規に作成したファイルやプロジェクトが、初期設定のまま使われていたためです。
日本時間と米国西海岸の時間には十数時間の差があります。そのため、日付の境目をまたぐ時間帯のデータだけ、1日ズレるという現象が起きます。
| 症状 | 疑うべき原因 |
|---|---|
| 日付が5桁の数字で表示される | 書き込みの型/表示形式 |
| 「45857/01/01」のような表示 | 文字列・数値の誤解釈 |
| 全件ではなく一部の行だけズレる | タイムゾーンの不一致 |
| 深夜・早朝の登録分だけズレる | タイムゾーンの不一致 |
「一部だけ」というのが、この問題の見つけにくさの正体です。日中に入力したデータは正しく見えるため、テスト時には問題が出ません。運用が始まり、残業時間帯や早朝の入力が発生して初めて、締め日をまたぐデータが前日・翌日に紛れ込むことになります。
日報や勤怠、売上の日次集計のように「その日のうちに入ったかどうか」が意味を持つ業務では、これは実害に直結します。
なお、各サービスの設定画面の場所や仕様は変わるため、最新の手順は公式ドキュメントで確認してください。
日付ズレの対策:最初に型とタイムゾーンを揃える
2つのパターンを踏まえた対処は、次の3ステップです。あとから直すより、開発の最初にやってしまう方が圧倒的に安く済みます。
- タイムゾーンを統一する:スプレッドシート側とスクリプト側、両方の設定を日本時間に揃えます。新規ファイル・新規プロジェクトを作った直後に確認するのを習慣にします。
- 書き込む値の型を揃える:日付はDateオブジェクトで渡し、書き込み先の列は表示形式を日付に固定します。文字列に整形するのは表示用途だけに限定します。
- 日付の境目でテストする:日中のデータだけで検証を終わらせないこと。深夜・早朝の時刻を含むデータでテストすると、タイムゾーンのズレはその場で表面化します。
この3つを外すと、「画面では合っているのに、集計だけ合わない」という最も追いにくい不具合を抱えることになります。
導入時チェックリスト
自社で仕組みを作る場合も、外注する場合も、次の項目を着手前に確認しておくと安全です。
- スプレッドシートのタイムゾーンは日本時間か
- GASプロジェクトのタイムゾーンは日本時間か
- 日付を扱う列の表示形式は「日付」に固定されているか
- 日付はDateオブジェクトで書き込む設計になっているか
- 深夜・早朝の時刻を含むテストデータで検証したか
- 外部アプリ(AppSheet等)側の日付設定も揃っているか
- 既存データに、数値のまま残っている日付がないか
チェック項目そのものは難しくありません。難しいのは「疑うきっかけがない」ことです。だからこそ、チェックリストとして最初に潰しておく価値があります。
よくある質問
Q. スプレッドシートの日付が45857のような数字になるのはなぜ? スプレッドシートは日付を内部的に連番の数値で持っているためです。書式が「数値」になっているか、文字列として書き込まれた値が数値と判定されると、その連番がそのまま表示されます。
Q. GASで書き込んだ日付が1日ズレるのはなぜ? スプレッドシート側とスクリプト側のタイムゾーン設定が異なることが主な原因です。米国時間と日本時間では日付の境目が数時間ずれるため、深夜や早朝のデータで1日分の差が出ます。
Q. 日付ズレを防ぐには何をすればいいですか? 開発の最初にシートとスクリプトのタイムゾーンを日本時間に統一し、日付は文字列ではなくDateオブジェクトで渡すことです。列の表示形式も日付に固定しておきます。
まとめ
- 日付が数字になるのは、スプレッドシートが日付を連番の数値で持っているため
- 文字列で書き込むと誤解釈され、「45857/01/01」のような表示になる
- シートとスクリプトのタイムゾーン不一致で、一部データだけ1日ズレる
- 対処は、最初にタイムゾーンを統一し、日付はDateオブジェクトで渡すこと
- 検証は必ず日付の境目の時刻を含めて行う
RENOYでは、GASやAppSheetを使った業務自動化の設計・開発から、運用が回るまでの伴走を行っています。「作ったものの、数字が合わない気がする」という状態からのご相談も歓迎です。まずはお気軽に無料個別相談(オンライン・60分)をご利用ください。サービス内容をまとめた資料は資料請求からご覧いただけます。
