好きなものだけ書く。ポジティブに。

好きなことを楽しく。自分がふりかえれるようなものとか。プログラミング、写真、音楽、ガジェットとか。

Salesforce でDateTime(日付/時間)データ型に分(minutes)を足す項目は1から作りたくないから残しておく

皆さんはSalesforceで今日も長くて難解で楽しい数式書いてますか?私は今日も元気に楽しく数式を書いています。

もし同じ事をしようとしている人がいたら(いない事を祈る)簡単に出来るといいなと思ったので書きます。

前提条件

  • Datetime型(日付/時間データ型)の項目が既にある
  • 30分とか45分とか60分とか追加したい分数の選択リストがある
  • 分数を元の項目に加算した項目を作りたい
  • (大変だから)日付をまたいだ加算はしない

という場面の解決法です。

わかりづらいので具体的な例

これから 『終了時間』という項目を足したいこんなオブジェクトがあるとします。

f:id:noblejasper:20200327230930p:plain
項目を作る前の状態はこんな状態

参照名はこんな感じ

  • 開始時間 = StartDatetime__c
  • 必要時間 = RequireMinutes__c

これを加算したい!

StartDatetime__cRequireMinutes__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つ分解してみていきましょう。

  1. Time型に変換
  2. 必要時間を加算
  3. 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 にする関数です。 DATETIMEVALUE2020-3-5 11:30 のように0で埋まってないと表示されないのでLPADを使います。

DATETIMEVALUEでくくれば完成

はじめに書いた結論の通りになりました。

もっと簡単なやり方知ってるぞって方は是非教えてください・・・

f:id:noblejasper:20200327234805p:plain
結果はこんな感じになりました。必要時間を変更すれば自動で計算してくれるよ

FYI

この辺のヘルプを参考にしました