###現状
スプレッドシート上にある和暦のデータを西暦に変換したのですが、コードが場当たり的で効率化したいです。
Excelであれば必要がないのですが、スプレッドシートでは日本語書式に対応していないことに加えて、徐々にExcelからスプレットシートに移行する流れがあるため、その対策として組みました。
###ソースコード上の課題
和暦で使われる令和と平成を変換したのですが、令和なら令和、平成なら平成と直接記述しているため、応用性が低くなったように感じます。取得元が最近になって始まった制度のため、平成と令和しかないのですが、この書き方だと拡張性に問題があると思いました。
データとコートは以下のものになります。
年月日 | 列2 | 列3 |
---|---|---|
平成25年10月1日 | ||
平成26年4月1日 | ||
平成27年7月1日 | ||
平成28年6月1日 | ||
平成29年10月1日 | ||
平成30年9月1日 | ||
令和元年11月1日 | ||
令和2年3月1日 | ||
※年月日の列を直接選択 |
const ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); function myfunc(){ let rng = ss.getActiveRange(); if(rng.getNumColumns() > 1) { Browser.msgBox("1列のみ選択してください"); return; } let strList = rng.getValues(); let setList = []; this.str = ""; for(str of strList){ this.str = str.toString(); this.str = changeKeyWord(this.str); this.str = changeWarekiYear(this.str); setList.push([this.str]); } rng.setValues(setList); } const changeKeyWord = function(str) { if(str.match("令和") === null || str.match("平成") === null){ Browser.msgBox("対象外の列か既に修正済みのデータが選択されています。"); return; } const yearWordMap = { '元年':'1/', '年':'/', '月':'/', '日':'' } const reg = new RegExp('(' + Object.keys(yearWordMap).join('|') + ')', 'g'); return str.replace(reg, (match) => { return yearWordMap[match]; }); } const changeWarekiYear = function(str) { let ymd = str.split('/'); let yy = ymd[0].split(/\d/g); ymd[0] = ymd[0].substr(2, ymd[0].length -2); yy = yy[0].replace("令和", "2019").replace("平成", "1989"); return Number(yy) + Number(ymd[0]) + "/" + ymd[1] + "/" + ymd[2]; }
回答2件
あなたの回答
tips
プレビュー