逆引きFormula 2.0 に戻る

いつもおなじみ Red Gregory さんの Formula 説明。文字列から日付を作成するという素晴らしいアイディアでした。Red さんのは文字列を切り出しているのですが、これだとフォーマットに縛りがあります。日本人向けに「Y年M月D日」、「Y-M-D」、「Y/M/D」のフォーマットのどれでも対応する汎用性のあるものを作ってみました。ついでに、「月日」だけのものも作りました。ただし、こちらはあくまで相対日付なので、年が変わると違う日付になるので注意してください。

https://twitter.com/RedGregory1/status/1518214997813473281

  1. 数値が二つまたは三つ存在するものならどんな表記でも可能。Formula 2.0 の match, parseDate を使いました。

    lets(
    	/* numbers 変数: 数字だけを取り出した配列 */
    	numbers, 
    		/* 年月日 の数値を取り出し */
    		prop("Name").match("\\d+")
    			/* 文字列の配列を数値の配列に変更 */
    			.map(current.toNumber()),
    	/* ymd 変数, [年, 月, 日]の配列、年がなければ今年の年を追加 */
    	ymd,
    		/* 配列の長さが2の場合、先頭に今年を追加 */
    		numbers.length() == 2 ? [today().year(), numbers].flat() : numbers,
    	/* y を 10000 倍、 m を 100、d はそのままに。*/
    	/* 例 [2023, 9, 10] -> [20230000, 900, 10] */
    	ymd.map(current * 100^(2-index))
    		/* それらを加算。 例 [20230000, 900, 10] -> 20230910 */
    		.sum()
    		/* 日付に変換 */
    		.parseDate()
    )
    

    matchmaptoNumberlengthnowyearflatsumparseDate

日付変換

P.S. 田原さんに数値のままでも parseDate が動くことを教えてもらいました。上の formula は sum() の後に文字列に変換する .format() を入れていたのですが、なくても動くようなので消してしまいました。基本形式だと日付までは数値だけで表現できるので、たくさん応用が効きそうですね。

https://twitter.com/shogocat/status/1701011821984088499