Salesforceの数式項目。よく使う関数と書き方の例

公開 書いた人 大林 諒

数式項目は、他の項目の値から計算した結果を表示する項目です。人が入力しなくても、導入プロジェクトの遅れ日数や商談の値引き後金額が、開いた瞬間の値で出ます。ここでは社員30名ほどの法人向けサービス会社の営業チームで実際に使っている数式を例に、関数の使い分け、選択リストと日付の扱い、上限に当たったときの逃がし方まで書きます。作り方の基本は「Salesforceのカスタムオブジェクトと項目の作り方。選択リスト・数式・主従関係」で一度通しているので、ここではその先を扱います。数式項目の作成・変更・削除には「アプリケーションのカスタマイズ」権限が要り、詳細を見るだけなら「設定・定義の参照」権限で足ります。数式項目そのものはすべてのエディションで使えます。

この記事の内容
  1. 先に決めること
  2. 設計表
  3. 作る手順
  4. よく使う関数
  5. 例の会社で使っている数式
  6. 選択リストを数式で扱う
  7. 日付と日付/時間、タイムゾーンのずれ
  8. 数式の上限と、当たったときの対処
  9. レポートの行レベルの数式・集計項目との違い
  10. 使えるエディション
  11. できないことと、その代わり
  12. よく詰まるところ
  13. 次にやること

先に決めること

数式項目にするか、別の手段にするか

計算した値を出す方法は数式項目だけではありません。ここを間違えると、作った後で「レポートで集計できない」「通知のきっかけにできない」と気づいて作り直しになります。

手段計算の単位値の持ち方向いている場面
数式項目1レコード保存しない。表示のたびに計算一覧・レポート・入力規則で同じ値を使い回す
レポートの行レベルの数式レポートの1行そのレポートの中だけ1本のレポートで一度だけ見たい計算
レポートの集計項目グループの小計・総計そのレポートの中だけ受注率・平均値引き率
積み上げ集計項目子レコードの集まり親に保存取引先ごとの導入プロジェクト件数
フローで普通の項目に書く1レコード保存する変わった日時を残す、通知のきっかけにする

複数のレポートや画面で同じ値を見るなら数式項目です。1本のレポートで足りるならレポート側で計算します。過去の値を覚えておく必要がある、または値の変化をきっかけに何かを動かすなら、フローで普通の項目に書きます。

戻り値のデータ型

数式項目は、作るときに「数式の戻り値のデータ型」を選びます。計算結果の型と合っていないと構文チェックで止まります。

データ型返すもの例の会社での使い道注意
チェックボックスtrue か false失注理由の入力漏れNULL を返す式は使えない
通貨金額(最大18桁)値引き後金額23.5 は 24、-22.5 は -23 に丸まる
日付年月日完了予定日の月末TODAY() で今日
日付/時間年月日と時分秒作成から48時間後NOW() で現在。保存は GMT
数値整数か小数(最大18桁)遅れ日数小数点の桁数を作成時に決める
パーセント% 付きの数値期間の経過率内部は100で割った値。90% は 0.90
テキスト文字列(最大3,900文字)四半期、リンクレポートのカスタム集計項目では使えない
時間日付の無い時刻営業時間の判定TIMENOW() は GMT で返る

数値・通貨・パーセントの丸めは0から遠い側への四捨五入で、12.345 は 12.35 になります。マルチ通貨の組織では、通貨項目の桁数の指定は無視され、通貨の設定の小数点の位置が使われます。

空白をどう扱うか

数値・通貨・パーセントの項目を参照する数式では、最後に「空白の項目を 0 として処理」か「空白項目を空白として処理」を選びます。

  • 値引き率が空の商談で、値引き後金額を金額そのままにしたい → 0として処理
  • 進捗率が未入力の案件を、0% と区別して空欄で見せたい → 空白として処理
  • ISBLANK() で未入力を数える数式 → 空白として処理(0として処理にすると、空の数値項目が空白と判定されない)

設計表

この記事で作る数式項目です。導入プロジェクト(Implementation_Project__c)の元の項目は「Salesforceのカスタムオブジェクトと項目の作り方。選択リスト・数式・主従関係」で作ったものを使います。

オブジェクト表示ラベルAPI参照名戻り値中身
導入プロジェクト遅れ日数Days_Late__c数値(0桁)完了予定日を過ぎた日数。完了したら止まる
導入プロジェクト期間の経過率Elapsed_Rate__cパーセント(0桁)開始日から完了予定日までの何%が過ぎたか
導入プロジェクト進捗遅れBehind_Schedule__cチェックボックス経過率より進捗率が20ポイント以上遅い
導入プロジェクト取引先と業種Account_Label__cテキスト取引先名と業種を1行で
導入プロジェクト元の商談を開くOpportunity_Link__cテキスト元の商談へのリンク
導入プロジェクト並び順Sort_Order__c数値(0桁)状況を一覧の並び順の番号に
商談値引き後金額Net_Amount__c通貨(0桁)金額から値引き率を引いた額
商談完了予定の四半期Close_Quarter__cテキスト4月始まりの年度と四半期
商談見込み区分Forecast_Rank__cテキスト確度からA・B・Cに分ける
商談フェーズ経過日数Days_In_Stage__c数値(0桁)今のフェーズに入ってからの日数
商談失注理由なしMissing_Lost_Reason__cチェックボックス失注なのに失注理由が空

フェーズ経過日数だけは、元になる日付項目「フェーズ変更日」(Stage_Changed_Date__c)を別に作り、フローで書き込みます。

作る手順

数式項目を作る

商談の「値引き後金額」を例にします。他の数式も、オブジェクトと型と式が変わるだけです。

  1. 画面右上の歯車アイコンから「設定」を開きます。
  2. 「オブジェクトマネージャー」タブを開きます。
  3. 「商談」をクリックします。
  4. 左のメニューで「項目とリレーション」をクリックします。
  5. 「新規」をクリックします。
  6. 「データ型の選択」で「数式」を選び、「次へ」をクリックします。
  7. 「項目の表示ラベル」に「値引き後金額」と入力します。
  8. 「項目名」を「Net_Amount」に書き換えます。
  9. 「数式の戻り値のデータ型」で「通貨」を選びます。
  10. 「通貨」を選ぶと下に「オプション」が出るので、「小数点の位置」を2から0に変えます。
  11. 「次へ」をクリックします。
数式の戻り値のデータ型で「通貨」を選び、小数点の位置を0にした状態
数式の戻り値のデータ型で「通貨」を選び、小数点の位置を0にした状態
  1. 「高度な数式」タブを開きます。
  2. 「項目の挿入」をクリックし、「金額」を選んで「挿入」をクリックします。
  3. 残りの式を入力します(式は実例の節に載せています)。
  4. 「構文を確認」をクリックし、「構文エラーはありません」と出るのを確かめます。
  5. 「説明」に、何を計算している項目かを1行で書きます。
  6. 空白の扱いで「空白の項目を 0 として処理」を選びます。
  7. 「次へ」をクリックします。
  8. 項目レベルセキュリティで、見せるプロファイルにチェックを入れて「次へ」をクリックします。
  9. 項目を入れるページレイアウトを選び、「保存」をクリックします。
高度な数式タブ。左に式、右に関数の一覧、下に「構文を確認」ボタン
高度な数式タブ。左に式、右に関数の一覧、下に「構文を確認」ボタン

「簡単な数式」タブは項目と演算子しか選べないので、関数を使う数式は最初から「高度な数式」タブで書きます。右側の関数一覧はカテゴリで絞り込め、関数を選んで「選択した関数を挿入」をクリックすると書式ごと入ります。関数を選ぶと下に説明が出て、「この関数に関するヘルプ」で公式の説明が開きます。

関数名は大文字に揃え、IF の中身は改行して字下げすると括弧の閉じ忘れが見つけやすくなります。空白と改行は計算に影響しません。/* と */ で囲んだ部分はコメントになるので、閾値を決めた理由を書き残します。構文チェックで止まる原因は、括弧やカンマの不足、引数の型や数の誤り、結果と戻り値の型の不一致、項目名の綴り、文字列の引用符漏れがほとんどです。

数式項目は編集画面には出ず、詳細画面では参照のみです。値が変わってもレコードの「最終更新日」は変わりません。

よく使う関数

例の会社の項目で書いた書き方です。関数名と引数の並びは公式の「数式の演算子と関数」で確かめています。

関数何をする書き方の例
IF条件が真なら1つ目、偽なら2つ目を返すIF(Amount > 1000000, "大型", "通常")
CASE値ごとに返す結果を変える。最後が「どれでもない」CASE(Status__c, "進行中", 1, "保留", 2, 9)
AND / ORすべて真 / どれか真AND(IsClosed, NOT(IsWon))
ISBLANK値が空なら真ISBLANK(Planned_End_Date__c)
BLANKVALUE空なら代わりの値を返すBLANKVALUE(Completed_Date__c, TODAY())
ISPICKVAL選択リストが指定の値かISPICKVAL(StageName, "Closed Lost")
TEXT数値・日付・選択リストを文字にするTEXT(Account.Industry)
TODAY / NOW今日の日付 / 今の日時TODAY() - Start_Date__c
DATE年・月・日から日付を作るDATE(YEAR(CloseDate), MONTH(CloseDate), 1)
YEAR / MONTH日付から年・月を取り出すMONTH(CloseDate)
ADDMONTHS何か月後の日付。月末は月末に合わせるADDMONTHS(Start_Date__c, 3)
DATEVALUE日付/時間を日付にするDATEVALUE(CreatedDate)
ROUND指定の桁で四捨五入ROUND(Amount * 0.9, 0)
CEILING整数に切り上げCEILING(MONTH(CloseDate) / 3)
MAX / MIN一番大きい / 小さい数MAX(0, TODAY() - Planned_End_Date__c)
HYPERLINKクリックできるリンクを作るHYPERLINK("/" & Opportunity__c, "商談", "_self")
IMAGE画像を表示するIMAGE("画像のURL", "遅延", 16, 16)

IF の2つの戻り値は同じ型にします。CASE は最後の値が必須で、比べる項目が空のときもその値が返ります。ISNULL と NULLVALUE は古い関数で、新しく書くならテキスト項目も扱える ISBLANK と BLANKVALUE を使います。IMAGE は数式項目とメールテンプレートでしか使えず、高さと幅は省略できます。

例の会社で使っている数式

1. 遅れ日数(完了したら止まる形)

完了した案件が何日遅れて終わったかも残したいので、完了日で止まる形にします。

IF(
  OR(ISPICKVAL(Status__c, "中止"), ISBLANK(Planned_End_Date__c)),
  0,
  MAX(0, BLANKVALUE(Completed_Date__c, TODAY()) - Planned_End_Date__c)
)

完了日が入っていれば完了日、空なら今日から完了予定日を引きます。日付同士を引くと日数が返ります。MAX(0, …) で、早く終わった案件をマイナスではなく0にしています。

2. 期間の経過率と進捗遅れ

担当者が入力する進捗率は、期間がどれだけ過ぎたかと並べると遅れが数字で見えます。経過率はパーセントで作ります。

IF(
  OR(ISBLANK(Start_Date__c), ISBLANK(Planned_End_Date__c),
     Planned_End_Date__c <= Start_Date__c),
  NULL,
  MIN(1, MAX(0, (TODAY() - Start_Date__c) / (Planned_End_Date__c - Start_Date__c)))
)

開始日と完了予定日が同じだと0で割ることになり、「#Error!」が出ます。先に IF で外します。MIN(1, …) は100%を超えないための上限です。進捗遅れはチェックボックスで作ります。

AND(ISPICKVAL(Status__c, "進行中"), Progress__c < Elapsed_Rate__c - 0.2)

パーセントは小数で比べるので、20ポイントは 0.2 です。数式項目から別の数式項目を参照できるので、経過率を2度書かずに済みます。営業マネージャーの一覧ビューを「進捗遅れ = True」で絞ると、毎週の確認先がそのまま出ます。

導入プロジェクトの一覧ビュー。進捗遅れにチェックが付いた行だけが並んでいる
導入プロジェクトの一覧ビュー。進捗遅れにチェックが付いた行だけが並んでいる

3. 値引き後金額

商談の金額は値引き前の見積額で入れ、値引き率は別の項目で持っています。

ROUND(Amount * (1 - Discount_Rate__c), 0)

値引き率20%は内部で 0.2 なので 1 - 0.2 を掛けます。「空白の項目を 0 として処理」にしておくと、値引き率が空の商談は金額そのままになります。空白として処理にすると値引き後金額も空欄になり、見込みを合計するレポートで合計が小さく見えます。

4. 完了予定の四半期(4月始まり)

完了予定日を「2026年度 Q3」のような文字で出します。

TEXT(YEAR(ADDMONTHS(CloseDate, -3))) & "年度 Q" &
TEXT(CEILING(MONTH(ADDMONTHS(CloseDate, -3)) / 3))

1月始まりなら CEILING(MONTH(CloseDate) / 3) で四半期の番号が出ます。4月始まりは日付を3か月前にずらしてから同じ計算をします。2027年1月15日は3か月戻すと2026年10月15日なので「2026年度 Q4」です。数値を文字とつなげるときは TEXT() で包まないとエラーになります。

5. 見込み区分(確度で分ける)

確度はパーセント項目なので、70%は 0.7 と書きます。完了した商談を先に外します。

IF(IsClosed,
  IF(IsWon, "受注", "失注"),
  IF(Probability >= 0.7, "A", IF(Probability >= 0.4, "B", "C"))
)

IsClosed と IsWon は商談の標準のチェックボックスで、フェーズに連動して Salesforce が値を入れます。フェーズの値を1つずつ並べるより短く、フェーズの値を増やしても直さずに済みます。確度はフェーズを変えると自動で書き換わりますが、編集権限のある人は手で上書きできます。

6. 取引先の項目を参照する(クロスオブジェクト数式)

導入プロジェクトの一覧に、取引先名と業種を出します。

Account__r.Name & "(" & TEXT(Account__r.Industry) & ")"

自分で作ったリレーション項目は、たどるときに __c を __r に変えます。商談から標準の取引先をたどるなら Account.Name です。業種は選択リストなので TEXT() で文字にしてからつなげます。元の商談の金額なら Opportunity__r.Amount です。

最大10リレーション先まで、たどれます。これはたどる深さの上限で、後半の上限表にある「一意のリレーション」の数とは別の話です。「項目の挿入」では関連オブジェクトが「>」付きで出てくるので、クリックして奥へ進みます。オブジェクトそのものは参照できず、Account__r.Owner はエラー、Account__r.Owner.LastName なら通ります。

項目の挿入で「商談 >」「取引先 >」とたどり、業種を選んでいるところ
項目の挿入で「商談 >」「取引先 >」とたどり、業種を選んでいるところ

7. 選択リストを条件にした判定

失注にしたのに失注理由が空の商談に印を付けます。チェックボックスで作ります。

AND(ISPICKVAL(StageName, "Closed Lost"), ISBLANK(TEXT(Lost_Reason__c)))

選択リストが空かは、TEXT() で文字にしてから ISBLANK() に渡します。フェーズの値は画面の表示ラベルではなく値の API 参照名で書き、標準のフェーズは公式の例でも "Closed Lost" のように英語の値です。自分の組織の値は「フェーズ」項目の値一覧で確かめます。保存そのものを止めたいなら、数式項目ではなく入力規則にします。

8. 状況を並び順の番号にする

選択リストのままだと、一覧の並べ替えが見たい順になりません。

CASE(Status__c, "進行中", 1, "保留", 2, "未着手", 3, "完了", 8, "中止", 9, 99)

値が空のときは最後の99が返り、一覧の末尾に回ります。

9. 元の商談へのリンク

導入プロジェクトから受注した商談へ1クリックで戻れるようにします。戻り値はテキストです。

IF(ISBLANK(Opportunity__c), "",
  HYPERLINK("/" & Opportunity__c, Opportunity__r.Name, "_self"))

Salesforce の画面へのリンクは / で始まる相対リンクで書きます。3つ目を "_self" にすると Lightning Experience の中で同じタブのまま開き、省くと新しいブラウザータブで開きます。外部サイトへのリンクは常に新しいタブです。使えるプロトコルは http・https・mailto・tel などに限られ、対応外を書くとリンク先が消えます。

導入プロジェクトの詳細画面。「元の商談を開く」に商談名のリンクが出ている
導入プロジェクトの詳細画面。「元の商談を開く」に商談名のリンクが出ている

10. フェーズ経過日数(数式とフローを組み合わせる)

「今のフェーズに何日いるか」は数式だけでは作れません。数式は今の値しか見られず、いつ変わったかを覚えておけないからです。前の値と比べる ISCHANGED や PRIORVALUE は入力規則などのルール用の関数で、数式項目では使えません。

日付項目「フェーズ変更日」を作り、レコードトリガーフローで「フェーズが変わったら今日の日付を書く」ようにしてから、数式を作ります。

IF(IsClosed || ISBLANK(Stage_Changed_Date__c), NULL, TODAY() - Stage_Changed_Date__c)

完了した商談は空欄にして、進行中の滞留だけを見ます。既存の商談はフェーズ変更日が空なので、使い始める前にデータローダで値を入れておくと一覧が揃います。

選択リストを数式で扱う

選択リストは他の型と保存のされ方が違い、= や != で比べるとエラーになります。数式で使えるのは次の3つです。

関数使う場面例
ISPICKVAL特定の1つの値か調べるISPICKVAL(Status__c, "保留")
CASE値ごとに返す結果を変えるCASE(Status__c, "完了", "済", "未")
TEXT文字列にして他とつなげる・比べるTEXT(Lost_Reason__c) & " / " & Name

ISPICKVAL の2つ目には引用符で囲んだ値しか書けず、他の項目や関数の結果は渡せません。ISPICKVAL(Status__c = "保留") のように = を書くとパラメーター数のエラーになります。2つの選択リストが同じ値かを比べるときは、TEXT(項目A) = TEXT(項目B) と両方を文字にします。

後から選択リストの値の名前を変えると、その値を書いた数式はエラーにならず偽を返し続けます。値を変える前に、参照している数式と入力規則を探します。複数選択の選択リストは INCLUDES(項目, "値") と ISBLANK() でしか扱えず、レポートや自動化でも苦労するので、例の会社では作らずにチェックボックスを並べています。

日付と日付/時間、タイムゾーンのずれ

日付と日付/時間は別物

商談の「完了予定日」は日付、「作成日」と「最終更新日」は日付/時間です。名前だけでは区別できません。混ぜて計算すると型のエラーになるので、日付/時間は DATEVALUE() で日付にしてから使います。YEAR()・MONTH()・DAY() も日付しか受け取りません。

  • 日付 − 日付 は日数(整数)
  • 日付/時間 − 日付/時間 は日数(小数)。5.52 なら5日と約12時間半
  • 日付 + 数値 は日付。TODAY() + 7 は1週間後
  • 日付に小数を足すと小数部分は捨てられる。TODAY() + 0.7 は今日のまま

日本時間で9時間ずれるところ

日付/時間は GMT で保存され、見る人のタイムゾーンに直して表示されます。数式の中で文字や日付に変換すると直す処理が効かない場面があり、日本の組織では9時間のずれとして出ます。

場面起きること直し方
TEXT(CreatedDate)GMT のまま末尾に Z が付く。朝8時の作成が前日23時で出る時刻は日付/時間項目のまま表示する
一覧ビュー・レポートでの DATEVALUE(CreatedDate)詳細画面はユーザーのタイムゾーン、一覧ビュー・レポート・関連リストは協定世界時で計算。0時〜9時前の作成が前日になる日付で集計するなら、レポートの絞り込みとグループ化を作成日そのものに掛ける
DATETIMEVALUE(TODAY())GMT の0時なので、日本時間では当日の9時日付だけで足りるなら変換しない
作成時刻の「時」を取り出すHOUR(TIMEVALUE(CreatedDate)) は GMT の時HOUR(TIMEVALUE(CreatedDate + 9/24)) と9時間足す
商談を受注にしたときの完了予定日完了予定日が未来なら UTC の今日に書き換わる。日本時間の0時〜9時前だと前日になる朝一の受注処理が多いチームは受注後に完了予定日を確かめる

数式からユーザーのタイムゾーンを知る方法はありません。日本の組織は夏時間が無いので 9/24 を足す方法で安定しますが、海外拠点のユーザーが混ざるなら Apex で扱います。

数式の上限と、当たったときの対処

上限値症状
数式の文字数3,900文字(空白・改行・コメントを含む)保存できない
計算結果として表示できる文字数1,300文字長いテキストが切れる
保存サイズ・コンパイルサイズ各15,000バイト(エディション別の割り当て表には古い4,000・5,000バイトの記載が残っている)サイズ超過のエラーで保存できない
数式の出力19桁未満18桁を超えると「#Too Big!」
オブジェクトあたりの一意のリレーション15(ヒントのページは10と表記)新しいクロスオブジェクト数式が保存できない

エディション別の割り当て表に保存時4,000・コンパイル時5,000バイトと書かれていることがありますが、現在の上限は15,000バイトです。日本語の文字列を多く並べた数式は要注意で、マルチバイト文字を使うと保存サイズは文字数より大きくなります。コンパイルサイズは参照しているすべての項目・数式を含んだ大きさで、TEXT・DATEVALUE・DATETIMEVALUE・DATE を使うと大きく膨らみます。一意のリレーションの上限は15で、超えたときのエラー表示も15です。ヒントのページには10と書かれた箇所があるので、10以内に収めておけば確実です。数え方は、すべての数式項目・ルール・ルックアップ検索条件の合計で、同じ親への参照は何項目あっても1つです。

  • 文字数に当たった → 途中の計算を別の数式項目に分け、本体から参照する
  • コンパイルサイズに当たった → 分けても効かない(参照先の大きさも足し込まれる)。同じ部分式の繰り返しを減らし、入れ子の IF を CASE にまとめる。それでも大きければ、重い部分をフローで普通の項目に書き、数式からは保存済みの値を参照する
  • 一意のリレーションに当たった → 使っていないクロスオブジェクト数式やルックアップ検索条件を整理する

レポートの行レベルの数式・集計項目との違い

観点数式項目行レベルの数式集計項目
どこに作るオブジェクトの項目レポートの列レポートの列(グループ単位)
使える範囲画面・一覧・全レポート・入力規則・フローそのレポートだけそのレポートだけ
数・参照の制限カスタム項目の枠の中1レポート2つ、1つの数式で一意の項目5つまでグループが1つ以上必要
画面Lightning Experience と ClassicLightning Experience だけ両方

行レベルの数式は、「アウトライン」ペインの「列」の横の▼から「行レベルの数式を追加」で作ります。開く「行レベルの数式列を編集」で「列の名前」「数式出力種別」「数式」を入れ、「検証」で確かめてから「適用」をクリックします。数式出力種別は数値・日付・日付/時間・テキストの4つで、通貨はありません。結合レポートと、有無を問わない形のカスタムレポートタイプでは使えず、バケット列・集計項目・他の行レベルの数式も参照できません。チェックボックス・時間・メール・電話・複数選択リストの型も扱えません。

1件ごとの値を2本以上のレポートや一覧で使うなら数式項目です。1本のレポートで試すだけなら行レベルの数式から始め、定着したら数式項目に移します。グループの合計同士の比率なら集計項目です。レポート側の作り方は「Salesforceのレポートの作り方。レポートタイプ・グループ化・結合レポートまで」にまとめています。

レポートビルダーの「行レベルの数式列を編集」ウィンドウ。数式出力種別と数式を入れた状態
レポートビルダーの「行レベルの数式列を編集」ウィンドウ。数式出力種別と数式を入れた状態

使えるエディション

機能StarterPro SuiteProfessionalEnterpriseUnlimited
数式項目・クロスオブジェクト数式使える使える使える使える使える
数式での $Profile の参照使えない使えない使えない使える使える
レポートの行レベルの数式・集計項目対応表に記載なし対応表に記載なし使える使える使える

数式項目は公式の表記が「すべてのエディション」です。ただし Starter はオブジェクトあたりのカスタム項目が25までで、カスタムオブジェクトも作れないので、導入プロジェクトの数式は Pro Suite 以上が前提です。ログイン中のユーザーのプロファイルで分ける $Profile は Professional では使えないので、見せ分けはページレイアウトや項目レベルセキュリティで行います。

できないことと、その代わり

やりたいことできない理由代わりの手
受注時点の値引き後金額を固定で残す数式は表示のたびに計算し直すフローで通貨項目に書き込む
子レコードの件数や合計を親に出す数式は親はたどれるが子の集まりは見られない主従関係なら積み上げ集計。参照関係ならフローで数えて書く
TODAY() を含む数式を積み上げ集計するTODAY・NOW・DATEVALUE を含む数式とクロスオブジェクト数式は集計できない毎朝動くスケジュールトリガーフローで数値項目に書き、それを集計する
値が変わった日時を残すISCHANGED・PRIORVALUE は数式項目で使えないレコードトリガーフローで日付項目に書く。記録だけなら項目履歴管理
遅れ日数が1を超えたら通知する数式の値が変わってもレコードは更新されず、フローが起動しないスケジュールトリガーフローで毎日条件を見て通知する
祝日を除いた営業日を数える公式の平日数のサンプル式も土日しか除けない営業時間と休日を使う Apex
見せたくない項目を数式経由で隠す数式は項目レベルセキュリティを無視して値を出す数式項目そのものに項目レベルセキュリティを掛ける

最後の行は見落としやすいところです。取引先に営業だけが見られる項目があっても、導入プロジェクトの数式で参照して画面に置くと導入担当者にも値が見えます。クロスオブジェクト数式は、参照先のレコードを見る権限が無いユーザーにも値を表示します。見せる範囲の設計は「Salesforceの入力規則とアクセス権。入力漏れと見せたくないデータを防ぐ」で扱っています。

よく詰まるところ

症状原因直し方
「エラー: 項目○○は選択リスト項目です。選択リスト項目は、特定の関数でのみサポートされます。」選択リストを = で比べているISPICKVAL() か CASE()、または TEXT() で包んで比べる
構文は通るのに選択リストの判定が常に偽値の表示ラベルで書いている値の API 参照名で書く
「#Error!」と表示される0で割っているIF で分母が0のときを先に外す
文字をつなげたところでエラー数値や日付をそのまま & でつないでいるTEXT() で包む
IF で型のエラー真と偽で返す型が違う同じ型にそろえる。空にしたいなら NULL か ""
値引き率が空の商談で値引き後金額が空欄「空白項目を空白として処理」を選んでいる「空白の項目を 0 として処理」に変える
作成日の日付がレポートで1日前になる一覧ビュー・レポートでは DATEVALUE が協定世界時で計算される絞り込みとグループ化は作成日そのものに掛ける
時刻を文字で出すと9時間ずれるTEXT() は日付/時間を GMT のまま文字にする日付/時間のまま表示するか、9/24 を足してから取り出す
積み上げ集計で数式項目が選べないTODAY() を含む、または他オブジェクトを参照しているフローで普通の項目に書き、それを集計する
Account__r.Owner でエラーオブジェクトそのものを参照しているAccount__r.Owner.LastName のように項目まで書く
遅れ日数が増えても通知フローが動かない数式の変化ではレコードが更新されないスケジュールトリガーフローで判定する

長い数式で原因が分からないときは、外側の IF を外して内側だけで構文チェックを通し、少しずつ戻すと早く見つかります。

構文チェックでエラーが出たところ。エラー文と該当箇所が表示されている
構文チェックでエラーが出たところ。エラー文と該当箇所が表示されている

次にやること

数式で作った「進捗遅れ」「見込み区分」「四半期」は、レポートの軸にすると効きます。続きは「Salesforceのレポートの作り方。レポートタイプ・グループ化・結合レポートまで」です。失注理由の入力漏れを保存の時点で止めたいなら「Salesforceの入力規則とアクセス権。入力漏れと見せたくないデータを防ぐ」に進みます。入力規則の条件にも、ここで書いた関数がそのまま使えます。状況や失注理由の値を後から整理するなら「Salesforceの選択リスト。連動選択リストとグローバル値セット」を読んでください。

あわせて読む