皆さんはSalesforceで今日も長くて難解で楽しい数式書いてますか?私は今日も元気に楽しく数式を書いています。
もし同じ事をしようとしている人がいたら(いない事を祈る)簡単に出来るといいなと思ったので書きます。
前提条件
- Datetime型(日付/時間データ型)の項目が既にある
- 30分とか45分とか60分とか追加したい分数の選択リストがある
- 分数を元の項目に加算した項目を作りたい
- (大変だから)日付をまたいだ加算はしない
という場面の解決法です。
わかりづらいので具体的な例
これから 『終了時間』という項目を足したいこんなオブジェクトがあるとします。
参照名はこんな感じ
- 開始時間 =
StartDatetime__c
- 必要時間 =
RequireMinutes__c
これを加算したい!
StartDatetime__c
に RequireMinutes__c
を分数として追加したい!
画像の入力例だと、 2020/03/27 11:00
に30分を加算して 2020/03/27 11:30
にしたいのです。
結論はこうなりました
DATETIMEVALUE( TEXT(YEAR(DATEVALUE( StartDatetime__c ))) & "-" & LPAD(TEXT(MONTH(DATEVALUE( StartDatetime__c ))), 2, "0") & "-" & LPAD(TEXT(DAY(DATEVALUE( StartDatetime__c ))), 2, "0") & " " & LPAD(TEXT(HOUR( TIMEVALUE( StartDatetime__c ) + (VALUE(TEXT( RequireMinutes__c )) * 60 * 1000) )), 2, "0") & ":" & LPAD(TEXT(MINUTE( TIMEVALUE( StartDatetime__c ) + (VALUE(TEXT( RequireMinutes__c )) * 60 * 1000) )), 2, "0") & ":00" )
なんかもっと楽な方法がある気がします
が、私の実力ではこうなってしまいました。
簡単に解説だけしておきます。
時間の計算はTime(時間型)に変換してから計算する
今回のキモはこれですね。
Datetime型のままで計算すると日付が加算されてしまいます。 StartDatetime__c + 1
にすると 2020/03/28 11:00
になってしまいます。
そのため今回のようにDatetimeから年、月、日、時、分を取得して計算した上で戻す事をしています。
それでは数式でやっている事を1つ1つ分解してみていきましょう。
- Time型に変換
- 必要時間を加算
- Datetime型に戻す
1. Time型に変換
TIMEVALUE( StartDatetime__c )
2. 必要時間を加算
必要時間は選択リストなので文字列→数値にする
VALUE(TEXT( RequireMinutes__c ))
Time型に追加するのでミリ秒にする
時間値の加算または減算の単位はミリ秒です。 @時間カスタム項目 - Salesforce Help
VALUE(TEXT( RequireMinutes__c )) * 60 * 1000
足す
TIMEVALUE( StartDatetime__c ) + (VALUE(TEXT( RequireMinutes__c )) * 60 * 1000)
3. Datetime型に戻す
これは簡単ですね最終的に
DATETIMEVALUE("2020-03-27 11:30")
という形式になっていればOKです
DATETIMEVALUE("2005-11-15 17:00:00") は、日時値として November 15, 2005 5:00 PM GMT を表示します。 @数式の演算子と関数 A – H - Salesforce Help
ということで文字列を作る
TEXT(YEAR(DATEVALUE( StartDatetime__c ))) & "-" & LPAD(TEXT(MONTH(DATEVALUE( StartDatetime__c ))), 2, "0") & "-" & LPAD(TEXT(DAY(DATEVALUE( StartDatetime__c ))), 2, "0") & " " & LPAD(TEXT(HOUR( TIMEVALUE( StartDatetime__c ) + (VALUE(TEXT( RequireMinutes__c )) * 60 * 1000) )), 2, "0") & ":" & LPAD(TEXT(MINUTE( TIMEVALUE( StartDatetime__c ) + (VALUE(TEXT( RequireMinutes__c )) * 60 * 1000) )), 2, "0") & ":00"
LPADは 3
とかを 03
にする関数です。 DATETIMEVALUE
は 2020-3-5 11:30
のように0で埋まってないと表示されないのでLPADを使います。
DATETIMEVALUEでくくれば完成
はじめに書いた結論の通りになりました。
もっと簡単なやり方知ってるぞって方は是非教えてください・・・
FYI
この辺のヘルプを参考にしました