見出し画像

和暦変換・和暦対応 TEXT関数の拡張 Googleスプレッドの名前付き関数

知らないうちにGoogleスプレッドシートに「名前付き関数」の機能が追加されていました。
メニュー「データ」→「名前付き関数」→「新しい関数の追加」で名前付き関数を追加できます。
GAS使わなくてもできるし便利ですね。

Googleスプレッドシートで使える、和暦表示の関数を作ってみました。
どうぞ自由にお使いください。
よかったら「スキ」を押してもらえると嬉しいです。


名前付き関数 TEXTW

メニュー「データ」→「名前付き関数」→「新しい関数の追加」で
関数名:TEXTW
関数の説明:簡易的な和暦対応TEXT関数
引数のプレースホルダ(2つ追加):日付、フォーマット

数式のコード

最新版です。更新2024/9/29

=LET(
	 tlist,{"ggge","ge","e"}
	,wlist,LET(
		 y,INT(TEXT(日付,"yyyy"))
		,ymd,INT(TEXT(日付,"yyyymmdd"))
		,wtable,{
			 {18680908,19120730,19261225,19890107,20190501}
			;{"明治","大正","昭和","平成","令和"}
			;{"\M","\T","\S","\H","\R"}
			;{"","","","",""}}
		,REDUCE({y,y,y},SEQUENCE(COLUMNS(wtable)),LAMBDA(res,cur,IF(ymd>=INDEX(wtable,1,cur),{INDEX(wtable,2,cur)&y-ROUNDDOWN(INDEX(wtable,1,cur)/10000-1),INDEX(wtable,3,cur)&y-ROUNDDOWN(INDEX(wtable,1,cur)/10000-1),INDEX(wtable,4,cur)&y-ROUNDDOWN(INDEX(wtable,1,cur)/10000-1)},res)))
	)
	,TEXT(日付,REDUCE(フォーマット,SEQUENCE(COLUMNS(tlist)),LAMBDA(resi,curi,SUBSTITUTE(resi,INDEX(tlist,1,curi),INDEX(wlist,1,curi)))))
)

使い方・仕様

TEXT関数に"ggge"と"ge"と"e"も使えるようにしました。
改良しました。
"勤務管理表ggge年m月 ge.m.d"のような形式も対応できるようになった改良バージョンです。
拡張もしやすくなっていますのでお勧めです。

=TEXTW(DATEVALUE("1989/1/1"),"ggge年m月d日")
→昭和64年1月1日
=TEXTW(DATEVALUE("1989/1/1"),"ge.m.d")
→S64.1.1
=TEXTW(DATEVALUE("1989/1/10"),"e年生まれ")
→1年生まれ

総括

今回の関数のつくり方はいろんなことに応用できると思います。
テンプレートとして用いたいと思います。

学んだポイントは以下の通り

  • 2次配列は疑似テーブルとして使用できる。

  • 順次処理LET()の階層を用いて実現する。

  • 反復処理REDUCE()LAMBDA()を用いて実現する。

  • REDUCE()では配列の添え値用にSEQUENCE()で生成すると簡単。

  • LAMBDA()で反復処理にした場合、Break(中断)はできないのでIFで分岐して同じ値を上書きする。

仕様覚書メモ

ポイント1:IFSとIFで返値の仕様が異なる。
IFSは{}配列で値を返すことができない。
IFは{}配列で値を返すことができる。

ポイント22次配列は要素数を合わせれば「,」と「;」の組み合わせで表記可能。
1次配列をINDEX関数で指定するときは列を使用。
{}配列を受け取るときはINDEX関数で。基準値は1より。
→INDEX({1,2,3,4,5},1,4)→4

2次配列は要素数を合わせれば「,」と「;」の組み合わせで表記可能。

{1,2,3}
→ ROWS=>1 COLUMNS=>3

{{1,2,3};{"a","b","c"};{"d","f","g"};{4,5,6}}
→ ROWS=>4 COLUMNS=>3

=LET(a,{{1,2,3};{2,3,4};{1,1,2};{1,1,2}},rows(a)&"|"&COLUMNS(a))

→ 4|3

ポイント3:REDUCE()やLAMBDA()で使用する変数名は数字で終われない
変数名で数字を使用するときは間で使用する。 i2iなど。

下は旧バージョンですが残しておきます
簡易的ですので先頭にしか対応していません。"勤務管理表ggge年m月"のようなことはできません。その場合は文字列を分けて使ってください。
旧バージョン2024/9/28

=LET(
	y,INT(TEXT(日付,"yyyy")
	,ymd,INT(TEXT(日付,"yyyymmdd")
	,fmt,SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(フォーマット,"ggge",""),"ge",""),"e","")
	,tp,IF(SUBSTITUTE(フォーマット,"ggge","")<>フォーマット,{"明治","大正","昭和","平成","令和"},IF(SUBSTITUTE(フォーマット,"ge","")<>フォーマット,{"M","T","S","H","R"},IF(SUBSTITUTE(フォーマット,"e","")<>フォーマット,{"","","","",""},{})))
	,IF(ROWS(tp)>0, 
		IFS(
		 ymd>20190430,INDEX(tp,1,5)&y-2018&TEXT(日付,fmt)
		,ymd>19890106,INDEX(tp,1,4)&y-1988&TEXT(日付,fmt)
		,ymd>19261224,INDEX(tp,1,3)&y-1925&TEXT(日付,fmt)
		,ymd>19120730,INDEX(tp,1,2)&y-1912&TEXT(日付,fmt)
		,ymd>18680907,INDEX(tp,1,1)&y-1868&TEXT(日付,fmt)
		,true,y&TEXT(日付,fmt))
	,TEXT(日付,フォーマット))
)

いいなと思ったら応援しよう!

和魂LOVE
よろしければサポートお願いします! いただいたサポートはクリエイターとしての活動費に使わせていただきます!