9
1

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 5 years have passed since last update.

オークファングループAdvent Calendar 2019

Day 4

Googleスプレッドシート(Google Apps Script)で西暦⇔和暦変換

Last updated at Posted at 2019-12-03

H31/5/22019/5/2令和元年5月2日 のように、相互変換できるものが必要になり、作りました。
たとえば 2019/4/30 は、 令和元年 ではなく 平成31年 です。このあたりも正確に変換します。

作る

  • Googleスプレッドシートで、 ツール > スクリプトエディタ を開き、スクリプトを書きます。
var map = {
  'R': {'g':'令和', 'd':'2019/05/01'},
  'H': {'g':'平成', 'd':'1989/01/08'},
  'S': {'g':'昭和', 'd':'1926/12/25'},
  'T': {'g':'大正', 'd':'1912/07/30'},
  'M': {'g':'明治', 'd':'1868/01/25'}
};

// arg = アルファベットの和暦年月日(S60/2/3など)
// [optional] symbol = 年月日の区切り記号("/"など)
function w2s(arg, symbol) {
  arg = arg.replace(/[\.-]/g, '/');
  for(var i = 0; i < Object.keys(map).length; i++) {
    var k = Object.keys(map)[i];
    var year = new Date(map[k].d).getFullYear();
    var r = new RegExp(k + '([0-9]+)(.+)', 'gi');
    if(arg.match(r)) {
      var result = (Number(arg.replace(r, "$1")) + year -1).toString() + arg.replace(r, "$2");
      return result.replace(/\//g, (symbol ? symbol : "/"));
    }
  }
}

// arg = 西暦年月日
// [optional] symbol = true: 日本語表記, false: アルファベット表記, "-"など: 指定した記号
// [optional] zerofill = true: 月日のゼロ埋め(2桁固定), false: 埋めない
function s2w(arg, symbol, zerofill) {
  var z = function(i) {
    return ("0" + i).slice(-2);
  }
  var getDate = function(k, d, symbol) {
    var dt = new Date(map[k].d);
    var r = d.getFullYear() - dt.getFullYear() + 1;
    if(typeof(symbol) == 'boolean' && symbol) {
      r = (r == 1) ? '' : (zerofill ? z(r) : r);
      return map[k].g + r + '' + (zerofill ? z(d.getMonth() + 1) : (d.getMonth() + 1)) + '' + (zerofill ? z(d.getDate()) : d.getDate()) + '';
    }
    else {
      var symbol = symbol ? symbol : '.';
      if(zerofill)
        return k + z(r) + symbol + z(d.getMonth() + 1) + symbol + z(d.getDate());
      else
        return k + r + symbol + (d.getMonth() + 1) + symbol + d.getDate()
    }
  }
  var d = new Date(arg);
  for(var i = 0; i < Object.keys(map).length; i++) {
    var k = Object.keys(map)[i];
    if(d >= new Date(map[k].d))
      return getDate(k, d, symbol);
  }
}

保存

保存して、スプレッドシートのページに戻しましょう。

スクリーンショット 2019-11-25 14.22.32.png

使う

西暦→和暦変換(s2w)

入力値 関数 変換結果
2019/2/3 =s2w(A1) H31.2.3
スクリーンショット 2019-11-25 14.25.16.png

↓↓↓

スクリーンショット 2019-11-25 14.25.43.png

第2引数

  • 日付の区切り文字を指定できます。
入力値(A1) 関数 変換結果
2019/5/8 =s2w(A1, "-") R1-5-8
2019/5/8 =s2w(A1, "/") R1/5/8
  • true で日本語表記となります。false でアルファベット表記(デフォルト)です。
入力値(A1) 関数 変換結果
2019/4/30 =s2w(A1, true) 平成31年4月30日

第3引数

  • 2桁固定に0埋めします。
入力値(A1) 関数 変換結果
2019/5/8 =s2w(A1, true, true) 令和元年05月08日
2019/5/8 =s2w(A1, false, true) R01.05.08

和暦→西暦変換(w2s)

入力値 関数 変換結果
H35-10-2 =w2s(A1) 2023/10/2

第2引数

  • 日付の区切り文字を指定できます。
入力値 関数 変換結果
R1-5-8 =s2w(A1, "-") 2019-5-8
M151/9/30 =s2w(A1, ".") 2018.9.30
9
1
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
9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?