数式項目は、他の項目の値から計算した結果を表示する項目です。人が入力しなくても、導入プロジェクトの遅れ日数や商談の値引き後金額が、開いた瞬間の値で出ます。ここでは社員30名ほどの法人向けサービス会社の営業チームで実際に使っている数式を例に、関数の使い分け、選択リストと日付の扱い、上限に当たったときの逃がし方まで書きます。作り方の基本は「Salesforceのカスタムオブジェクトと項目の作り方。選択リスト・数式・主従関係」で一度通しているので、ここではその先を扱います。数式項目の作成・変更・削除には「アプリケーションのカスタマイズ」権限が要り、詳細を見るだけなら「設定・定義の参照」権限で足ります。数式項目そのものはすべてのエディションで使えます。
この記事の内容
先に決めること
数式項目にするか、別の手段にするか
計算した値を出す方法は数式項目だけではありません。ここを間違えると、作った後で「レポートで集計できない」「通知のきっかけにできない」と気づいて作り直しになります。
| 手段 | 計算の単位 | 値の持ち方 | 向いている場面 |
|---|---|---|---|
| 数式項目 | 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)を別に作り、フローで書き込みます。
作る手順
数式項目を作る
商談の「値引き後金額」を例にします。他の数式も、オブジェクトと型と式が変わるだけです。
- 画面右上の歯車アイコンから「設定」を開きます。
- 「オブジェクトマネージャー」タブを開きます。
- 「商談」をクリックします。
- 左のメニューで「項目とリレーション」をクリックします。
- 「新規」をクリックします。
- 「データ型の選択」で「数式」を選び、「次へ」をクリックします。
- 「項目の表示ラベル」に「値引き後金額」と入力します。
- 「項目名」を「Net_Amount」に書き換えます。
- 「数式の戻り値のデータ型」で「通貨」を選びます。
- 「通貨」を選ぶと下に「オプション」が出るので、「小数点の位置」を2から0に変えます。
- 「次へ」をクリックします。

- 「高度な数式」タブを開きます。
- 「項目の挿入」をクリックし、「金額」を選んで「挿入」をクリックします。
- 残りの式を入力します(式は実例の節に載せています)。
- 「構文を確認」をクリックし、「構文エラーはありません」と出るのを確かめます。
- 「説明」に、何を計算している項目かを1行で書きます。
- 空白の扱いで「空白の項目を 0 として処理」を選びます。
- 「次へ」をクリックします。
- 項目レベルセキュリティで、見せるプロファイルにチェックを入れて「次へ」をクリックします。
- 項目を入れるページレイアウトを選び、「保存」をクリックします。

「簡単な数式」タブは項目と演算子しか選べないので、関数を使う数式は最初から「高度な数式」タブで書きます。右側の関数一覧はカテゴリで絞り込め、関数を選んで「選択した関数を挿入」をクリックすると書式ごと入ります。関数を選ぶと下に説明が出て、「この関数に関するヘルプ」で公式の説明が開きます。
関数名は大文字に揃え、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 と Classic | Lightning Experience だけ | 両方 |
行レベルの数式は、「アウトライン」ペインの「列」の横の▼から「行レベルの数式を追加」で作ります。開く「行レベルの数式列を編集」で「列の名前」「数式出力種別」「数式」を入れ、「検証」で確かめてから「適用」をクリックします。数式出力種別は数値・日付・日付/時間・テキストの4つで、通貨はありません。結合レポートと、有無を問わない形のカスタムレポートタイプでは使えず、バケット列・集計項目・他の行レベルの数式も参照できません。チェックボックス・時間・メール・電話・複数選択リストの型も扱えません。
1件ごとの値を2本以上のレポートや一覧で使うなら数式項目です。1本のレポートで試すだけなら行レベルの数式から始め、定着したら数式項目に移します。グループの合計同士の比率なら集計項目です。レポート側の作り方は「Salesforceのレポートの作り方。レポートタイプ・グループ化・結合レポートまで」にまとめています。

使えるエディション
| 機能 | Starter | Pro Suite | Professional | Enterprise | Unlimited |
|---|---|---|---|---|---|
| 数式項目・クロスオブジェクト数式 | 使える | 使える | 使える | 使える | 使える |
数式での $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の選択リスト。連動選択リストとグローバル値セット」を読んでください。