4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Google Spreadsheetで西暦を和暦にカンタンに変換する関数 (DateTimeFormatを利用)

Posted at

この投稿では、Google Spreadsheetで、西暦の日付を和暦の年に変換する関数を紹介します。

Google Spreadsheetには和暦を表示する書式がない

Google Spreadsheetは「2022/08/04」のような日付を入力すると、日付フォーマットとしてあつかうことができます。しかし、対応しているフォーマットは西暦だけです。令和のような和暦を表示するフォーマットがありません。

Google Spreadsheetビルトインの日付関係の関数でも、和暦に変換するような関数がありません。

意外とめんどくさい和暦

Google Spreadsheetで、西暦の日付から和暦に変換するには、式を編む方法もあります。

しかし、西暦の年数と和暦の年数は必ずしも一致しないので、式でやってしまうと複雑化するのが問題になります。たとえば、令和元年は2019年5月1日からです。2019年は平成31年と令和元年、どちらの可能性もあるわけです。また、平成元年や令和元年のような1年目を元年とする場合も、分岐が必要になります。こうした分岐処理を式で表現するのは、結構面倒です。

和暦に変換するカスタム関数をGoogle Apps Scriptで自作する

そこで、細かい規則を一切気にしないでやる方法に、JavaScriptのビルトインライブラリDateTimeFormatを使う方法があります。

これを用いると、「令和元年」や「平成31年」といった年数を簡単に求めることができます。

DateTimeFormatを使ったカスタム関数の実装は次のようになります。

コード.gs
const warekiFormat = new Intl.DateTimeFormat("ja-JP-u-ca-japanese", {
  era: "long",
  year: "numeric",
});

/**
 * 日付から和暦の年を返す
 * @param {number|Date} date - 日付
 * @return {string} 和暦の年の文字列
 * @customfunction
 */
function WAREKI(date) {
  let dateObject;
  if (typeof date === "number") {
    dateObject = new Date(date, 0, 1);
  } else if (date instanceof Date) {
    dateObject = date;
  } else {
    throw new Error("Invalid date " + typeof date);
  }
  return warekiFormat.format(dateObject);
}

このコードを見てのとおり、日付による細かい分岐を自分で書く必要はありません。

WAREKI関数の使い方

上で宣言したWAREKI関数がGoogle Spreadsheetで利用できます。

日付の値に対してWAREKI関数を使うと、

20220804_092115.png

次のように和暦の年が求められます。

20220804_092122.png

また、西暦の数値に対して、WAREKI関数を使った場合、

20220804_092254.png

次のように与えられた西暦の1月1日の時点の和暦の年が求められます。

20220804_092258.png

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?