何が起きているのか
Google スプレッドシートに日付の列を貼り付けると、44562 や 45012 のような5桁の整数に変わってしまう。あるいは TEXT() 関数を使って日付をフォーマットしようとすると、まったく予期しない結果が返ってくる — 月が違う、区切り文字が違う、またはフォーマット文字列がそのまま表示されてしまう。
ほとんどの人が一度は経験することだ。根本原因はこうだ: Google スプレッドシートはすべての日付をシリアル番号として保存している — 1899年12月30日からの経過日数だ。つまり 44562 は2022年1月1日を意味する。セルに人間が読める日付が表示されるのは、適切なフォーマットが適用されているときだけだ。そのフォーマットを削除するか、最初から設定していなければ、生の整数が表示される。
エラーの状態は具体的には次のようなものだ:
Date values appear as numbers (e.g., 44562) instead of formatted dates, or the TEXT function returns an unexpected date format.
問題の診断
まず、3つのシナリオのどれに当たるかを特定しよう — それぞれ対処法が異なる。
シナリオ1 — セルに生の数値が表示される
44562 が表示されているセルをクリックする。ツールバーのフォーマットドロップダウンを確認しよう(通常は「自動」または「数値」と表示されている)。日付ではなく数値と表示されていれば、セルの日付フォーマットが失われている。内部の値は有効な日付シリアル番号のままだ — 適切な表示フォーマットを設定するだけでよい。
簡単な確認方法: 別のセルに =A1+0 と入力し、そのセルを日付としてフォーマットしてみよう。Jan 1, 2022 のような実際の日付が表示されれば、データは問題ない。表示だけが壊れている。
シナリオ2 — TEXT() が間違ったフォーマットを返す
たとえばこのように書いたとする:
=TEXT(A1, "MM/DD/YYYY")
すると 15/01/2022 を期待していたのに 01/15/2022 が返ってくる。または #VALUE! が返ってくる。あるいは出力フォーマットがドキュメントに書かれている内容と一致しない。
十中八九、これはロケールの不一致が原因だ。TEXT() 内のフォーマットコードは Google スプレッドシートではロケールに依存する — スプレッドシートの地域設定によって、同じ文字列でも動作が異なる。
シナリオ3 — インポートまたは貼り付けたデータが数値として表示される
CSVを取り込んだり、別のアプリからデータをコピーしたりすると、日付が生の整数として届く。スプレッドシートには読み取るべきフォーマットのメタデータがないため、44562 が数量やIDではなく日付であることを判断できない。そのため数値のまま残される。
日付であるべき生の数値を修正する
方法1 — メニューから日付フォーマットを適用する
- 生の数値が表示されているセルを選択する。
- 表示形式 → 数値 → 日付(時刻も必要な場合は日時)を選択する。
- 数値がすぐに日付として表示されるはずだ。
YYYY-MM-DD のような特定のフォーマットが必要な場合は、表示形式 → 数値 → カスタム日時から設定できる。
方法2 — カスタム数値フォーマット
セルを選択し、表示形式 → 数値 → カスタム数値形式を開いて、パターンを入力する:
YYYY-MM-DD → 2022-01-15
DD/MM/YYYY → 15/01/2022
MMM DD, YYYY → Jan 15, 2022
DD-MMM-YY → 15-Jan-22
「適用」をクリックし、セルに読み取れる日付が表示されることを確認する。
方法3 — 数式で強制変換する
セルに実際の数値ではなく数値のように見えるテキスト文字列が含まれている場合、フォーマットだけでは対処できない。まず変換しよう:
=DATEVALUE(TEXT(A1,"0"))
または、シリアル番号がテキストとして保存されていて、単純に数値に変換したい場合:
=A1*1
その後、結果の列を日付としてフォーマットする。
TEXT() のフォーマットの不一致を修正する
TEXT() 関数はスプレッドシートのロケールを通してフォーマットコードを解釈する。フランスに設定されていると、日付の区切り文字がピリオドになることがある。日本に設定されていると、月のフォーマットが英語とは異なる動作をする。修正方法は、ロケールを期待する設定に合わせるか、問題を回避できるフォーマットコードを使うかのどちらかだ。
スプレッドシートのロケールを確認・修正する
- ファイル → 設定を開く。
- 全般タブでロケールフィールドを確認する。
- 期待する日付フォーマットの慣習に合わせて変更する。
- 設定を保存をクリックする。
ロケールを変更したら、TEXT() 数式を再評価しよう — 出力は新しい設定を反映する。
ロケールに依存しないフォーマットコードを使う
より良い方法として、ロケールに関わらず同じ動作をする数式を書こう:
=TEXT(A1, "YYYY-MM-DD") → ISO 8601、どこでも一貫して動作
=TEXT(A1, "DD/MM/YYYY") → 日付優先フォーマット
=TEXT(A1, "MM/DD/YYYY") → 米国フォーマット
非英語ロケールでは、表示結果を確認できていない限り、月の省略名は使わないようにしよう。
TEXT() を使わずに文字列を手動で組み立てる
TEXT() が正しく動作しない場合は、使うのをやめよう。代わりに DAY()、MONTH()、YEAR() を直接使う:
=YEAR(A1)&"-"&TEXT(MONTH(A1),"00")&"-"&TEXT(DAY(A1),"00")
これは常に YYYY-MM-DD を生成する — 各パーツから文字列を自分で構築しているため、ロケールは関係しない。
フォーマットが失われたインポート済み日付を修正する
CSVが日付を生のシリアル番号として取り込んだ場合、シリアル番号を基準エポックに加算することで元の日付を復元できる:
=DATE(1899,12,30) + A1
Google スプレッドシートのシリアル日付1 = 1900年1月1日。日付0 = 1899年12月30日(Lotus 1-2-3との互換性バグの産物)。シリアル番号をその基準日付に加算することで正しい日付が復元される。
結果の列を日付としてフォーマットする。その後、元のデータを数式ではなく値で置き換えるには:
- 数式の列をコピーする。
- 元の列に値のみ(Ctrl+Shift+V)として貼り付ける。
- 日付としてフォーマットする。
- 補助用の数式列を削除する。
修正の確認
スプレッドシートを閉じる前に、簡単なサニティチェックを実行しよう:
- セルに5桁の整数ではなく、人間が読める日付が表示されている。
- 修正したセルをクリックする — 数式バーに生の数値ではなく、ロケールのフォーマットで日付が表示されているはずだ(例:
1/15/2022)。 - そのセルで
=ISNUMBER(A1)を実行する —TRUEが返るはずだ。スプレッドシートの日付は数値として保存されているため、これで内部値が有効であることが確認できる。 =ISDATE(A1)を実行する — スプレッドシートがそのセルを日付型と認識していればTRUEが返る。TEXT()を使った場合は、出力文字列が期待するフォーマットと完全に一致していることを確認する。
今後の予防策
この問題を未然に防ぐための3つの習慣:
- **データをインポートする前にロケールを固定する。**インポートや貼り付け操作の前に、ファイル → 設定で設定しよう。後から変更すると、既存の値の表示が変わることがある。
- ソースデータにはISO 8601を使う。
YYYY-MM-DDフォーマットの日付は、ほぼすべてのロケールで曖昧さなく解析される。エクスポートフォーマットを制御できる場合は、これを使おう。 - **Excelからの移行後は必ず確認する。**ExcelとスプレッドシートはどちらもシリアルDateシステムを共有しているが、Excelには1900年のうるう年バグがあり、1900年3月1日以前の日付で1日のずれが生じることがある。移行後は必ずいくつかの日付をスポットチェックしよう。
- **TEXT() は表示専用に限定する。**日付の計算には
DATEDIF()、DATE()、またはEDATE()を使おう。TEXT()は出力用のフォーマット済み文字列が必要なときに、数式チェーンの最後でのみ使うようにしよう。

