【Salesforce】1つの日付項目を変換して『和暦表示』してくれるカスタム項目を作成してみた
記事タイトルの通り。
ある1つの日付項目(例 : 2017/10/16)が別にあるとして、その中身を和暦に変換した状態で表示(例 : 平成29年10月16日)してくれるような項目を作りたかったんだけれども、これでちょっと苦戦した。
とりあえずなんとか完成させることはできたので、メモがてらここに記事として残しておくことにする。
具体的には、次のような要件を満たす項目を作りたかった。
- 商談の標準項目『完了予定日(CloseDate)』に入力されている日付を、“[元号]XX年XX月XX日” の形式で表示するカスタム項目。(数字は必ず2桁。1桁の年・月・日は頭に0をつけて埋める)
- 今回はとりあえず明治~平成を対象とし、明治よりも前の日付である場合は “対象外” の文字を出力する。
- 現在より未来の日付については特に深く考えなくてよい(”平成30年10月16日” とかになってもOK)。
- ただし、各元号で最初の年は “[元号]元年XX月XX日” と表示されるようにする。
ちなみに、この問題を解くには元号の仕組みについて知っておく必要がある。
元号が明治・大正・昭和・平成になるのは、それぞれ次の期間が該当する。
- 明治 : 1868/1/25 ~ 1912/7/29 (明治元年~45年)
- 大正 : 1912/7/30 ~ 1926/12/24 (大正元年~15年)
- 昭和 : 1926/12/25 ~ 1989/1/7 (昭和元年~64年)
- 平成 : 1989/1/8 ~ 現在 (平成元年~)
最初は自力で作ろうとして色々と試行錯誤していたんだけれども、色んなところで躓いてなかなかうまくいかず。
ちょっとぐぐってみたらこんなページを発見。
[Salesforce]日付を和暦で表示するには?(数式) – ウフルカスタマーサポート
なるほどなるほど。
日付で範囲を指定したいときは、
1 |
AND( CloseDate >= DATE(1868, 9, 8), CloseDate <= DATE(1912, 7, 29) ) |
っていう書き方ができるんだねー。
最初は年月日を3つ合わせて範囲指定する方法がわからなくて、「日付情報をいったん8桁の数値に変換する数式項目を作って、その項目に対して8桁の数値で範囲指定する(※)」っていう滅茶苦茶遠回りな方法を考えてたヨ……。
(※例 : AND( CloseDate_num8__c >= 18680125, CloseDate_num8__c <= 19120729 ) )
このページの数式をそのまま使うだけでは今回自分が作りたい項目の要件を100%完全には満たせないので、適宜調整していきつつ。
(あと、このページだと明治の範囲が 1868/9/8 ~ 1912/7/29 になってるけど、開始は 1868/1/25 のような気が?なのでそこも修正しました。)
最終的には、こんな感じでまとまりましたー。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
IF( NOT( ISNULL( CloseDate ) ), IF( AND( CloseDate >= DATE(1868, 1, 25), CloseDate <= DATE(1912, 7, 29) ), "明治" & IF( YEAR( CloseDate ) = 1868, "元", LPAD(TEXT(YEAR( CloseDate ) - 1867), 2, "0") ) & "年", IF( AND( CloseDate >= DATE(1912, 7, 30), CloseDate <= DATE(1926, 12, 24) ), "大正" & IF( YEAR( CloseDate ) = 1912, "元", LPAD(TEXT(YEAR( CloseDate ) - 1911), 2, "0") ) & "年", IF( AND( CloseDate >= DATE(1926, 12, 25), CloseDate <= DATE(1989, 1, 7) ), "昭和" & IF( YEAR( CloseDate ) = 1926, "元", LPAD(TEXT(YEAR( CloseDate ) - 1925), 2, "0") ) & "年", IF( AND( CloseDate >= DATE(1989, 1, 8), CloseDate <= DATE(2087, 12, 31) ), "平成" & IF( YEAR( CloseDate ) = 1989, "元", LPAD(TEXT(YEAR( CloseDate ) - 1988), 2, "0") ) & "年", "対象外" ) ) ) ), null ) & IF( NOT( ISNULL( CloseDate ) ), IF( AND( CloseDate >= DATE(1868, 9, 8), CloseDate <= DATE(2087, 12, 31) ), "年" & LPAD(TEXT( MONTH( CloseDate )), 2, "0") & "月" & LPAD(TEXT( DAY( CloseDate )), 2, "0") & "日", "" ), null ) |
上のIF文は『元号』と『和暦の年』を出力させるまとまりになってます。
その元号の1年目の年であれば “明治元年” って出るし、2年目以降の年であれば “明治02年” とか “明治10年” のように出る。
また、明治よりも前の年であれば “対象外” の文字を出力。
そして下のIF文は『月』と『日』を出力させるまとまりになってます。
“01月01日” とか “10月16日” のような形で出てきます。
明治よりも前の年であれば何も出力しない。
ちなみに、「なんで平成の範囲の終わりとかに “2087/12/31” が指定されているの?」って話ですが。
2087年は平成がずっと続いたと仮定した場合 “平成99年” になります。
つまりその翌年、2088年は “平成100年” 。
しかし上の数式の書き方だと必ず2桁になるように調整してしまうので、表記上は “平成10年” になってしまいます。
頭の2桁だけを残して3桁目は消してしまうわけですね。
そんな動作を残してしまうと少し問題かなと考え、2087年以降は “対象外” となるように調整しています。
この部分はまあ、要件次第で「”平成100年”として以降も正しくカウントする」とか「そもそも未来の日付はすべて “対象外” となるようにする」とか、いろいろ対応策も変わってきそうですが。
とりあえず今回はこういう仕様にしておきました。
というわけで、この数式を項目に入力して完成!
探せばもっと分かりやすい・見やすい書き方もあるかもしれないけど、今のところ自分の中ではこれが BEST かなー。
ディスカッション
コメント一覧
まだ、コメントがありません