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

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

## 作る

* Googleスプレッドシートで、 `ツール` > `スクリプトエディタ` を開き、スクリプトを書きます。

```javascript
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);
  }
}
```

### 保存

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

<img width="1440" alt="スクリーンショット 2019-11-25 14.22.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62318/86522a17-1c44-d7e1-d957-b601e1832910.png">


## 使う

### 西暦→和暦変換(s2w)

| 入力値 | 関数 | 変換結果 |
|:--|:--|:--|
| 2019/2/3 | =s2w(A1) | H31.2.3 |


<img width="274" alt="スクリーンショット 2019-11-25 14.25.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62318/8d475712-c89c-08c6-6adf-496bc8781be1.png">

↓↓↓

<img width="261" alt="スクリーンショット 2019-11-25 14.25.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62318/ce7e1114-7d81-88c8-e068-dc576de555d8.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 |