数式での選択リストの使用
学習の目的
数式での選択リストの使用の概要
選択リスト項目では、事前入力されたリストから値を選択できます。結果を選択リストにして返す数式を記述することはできませんが、数式項目で選択リストを参照する必要があるものと思われます。
取引先の [種別] に [その他] を選択したユーザに、説明を記入してもらう入力規則が必要であるとします。この入力規則数式では、ユーザが取引先の [種別] に [その他] を設定した場合に、[Other Type (その他の種別)] というテキスト項目への記入を必須にします。
ISPICKVAL(Type, "Other") && ISBLANK(Other_Type__c)
Type を「その他」に設定したユーザが Other_Type__c を空白のままにすると、入力規則が実行され、ユーザがフォームを保存できません。
一般的な選択リスト関数と演算子
ISPICKVAL()、CASE()、TEXT() の 3 つの関数は、すべての数式項目で選択リスト値を引数に取ります。
ISPICKVAL(picklist_field, text_value) は、picklist_field の値が text_value と一致した場合に true を返し、それ以外の場合は false を返します。ISPICKVAL() は PRIORVALUE() と組み合わせることができます。この関数は、以前の値を見つける目的で、割り当てルール、入力規則、項目自動更新、ワークフロールールで使用できます。
たとえば、次の入力規則は、ユーザがケースの [種別] を以前に選択した値から空白に戻せないようにします。
NOT(ISPICKVAL(PRIORVALUE(Type), "")) && ISPICKVAL(Type, "")
つまり、[種別] の前の値が空白ではなく、現在の値が空白の場合に、入力規則が実行されます。
CASE() は、選択リストの値に基づいて結果が異なる数式を記述する場合に役立ちます。次の数式は、戻り値のデータ型が数値で、ケースの種別に基づいて優先度を割り当てます。
CASE(Type, "Electrical", 1, "Electronic", 2, "Mechanical", 3, "Structural", 4, "Other", 5, 5)
まず [種別] を各ケースと比較して、一致した場合は優先度を割り当てます。Electrical (電気関係) のケースには優先度 1、Electronic (電子関係) のケースには 2 などのように指定します。
TEXT() は、選択リスト値を、現在のユーザの言語ではなく、組織のマスタ言語のテキスト値に変換します。選択リスト値がテキスト値に変換されると、その値で BEGINS() や CONTAINS() などのテキスト関数を使用できるようになります。
たとえば、次の数式は、ケースの [状況] を文で示します。
"This case is " & TEXT(Status)
数式での選択リスト項目の使用
選択リストに基づく入力規則の作成
選択リスト値によって、レコードの他の項目が必須かどうかが決まることはよくあります。ISPICKVAL() と CASE() は、特定の選択リスト値が選択されたかどうかをチェックする入力規則の作成に役立ちます。たとえば、ケースの [状況] 選択リスト値を [エスカレーション済] に変更したユーザに、その理由を入力してもらいたいとします。
最初に、ケースオブジェクトに [Reason for Escalating (エスカレーション理由)] というカスタムテキスト項目を作成します。
- [設定] で、[クイック検索] ボックスを使用して [オブジェクトマネージャ] を検索します。
- [ケース] | [項目とリレーション] をクリックし、[新規] をクリックします。
- [テキストエリア] を選択して、[次へ] をクリックします。
- [項目の表示ラベル] に、「Reason for Escalating」 (エスカレーション理由) と入力します。[項目名] は自動入力されます。
- [次へ] をクリックします。
- もう一度 [次へ] をクリックして、[保存] をクリックします。
ここで、[状況] 選択リスト項目を使用して、[Reason for Escalating (エスカレーション理由)] に入力規則を設定します。
- 新たに作成した [Reason for Escalating (エスカレーション理由)] 項目をクリックします。
- [入力規則] で、[新規] をクリックします。
- [ルール名] に、「Reason_Required」 (理由 (必須)) と入力します。
-
[エラー条件数式] に、次の入力規則を入力します。
AND( ISPICKVAL(Status, "Escalated"), ISBLANK(Reason_for_Escalating__c) )
- [エラーメッセージ] に、「Please enter a reason for changing the case status to Escalated」 (ケースの状況を「エスカレート済」に変更した理由を記入してください) と入力します。
- [保存] をクリックします。
入力規則は、[状況] が [エスカレーション済] に設定された場合に、[Reason for Escalating (エスカレーション理由)] が空白でないことを確認します。作成した数式をテストする場合は、ケースの [状況] を [エスカレーション済] に変更し、[Reason for Escalating (エスカレーション理由)] には記入せずにレコードを保存します。フォームの [Reason for Escalating (エスカレーション理由)] 項目の下にエラーメッセージが表示されます。
![ユーザが [Reason for Escalating (エスカレーション理由)] に記入しない場合は、このエラーメッセージが表示されます。「Error: Please enter a reason for changing the case status to escalated (エラー: ケースの状況を「エスカレート済」に変更した理由を記入してください)」](https://res.cloudinary.com/hy4kyit2a/f_auto,fl_lossy,q_70/learn/modules/advanced_formulas/picklist_formulas/images/ja-JP/cd19c753d2752117fbfae701f4f6407b_advanced-formulas-reason-for-escalating-error.png)
取引先責任者の優先度の割り当て
関連取引先の評価に基づいて、取引先責任者に優先度を割り当てたい場合に、選択リスト項目を活用することはできるでしょうか? この数式では、取引先責任者による取引先評価のクロスオブジェクト参照と、「チェックボックス数式での基本的なロジックの使用」で作成した [Is Executive (エグゼクティブに該当)] チェックボックス数式項目を使用します。取引先責任者の [役職] に「エグゼクティブ」「社長」「最高」のいずれかの言葉が含まれている場合は、[Is Executive (エグゼクティブに該当)] がオンになります。
取引先評価には「見込み有り」「将来見込み有り」「見込み無し」の 3 つの選択肢があり、[Is Executive (エグゼクティブに該当)] にはオンとオフの 2 つのオプションがあるため、合わせて 6 種類のパターンが考られます。ここでは CASE() を使用して、次の条件に基づいて、各パターンに優先度を割り当てます。
Account.Rating | Is_Executive_c | 優先度 |
---|---|---|
見込み有り | はい | 1 |
見込み有り | いいえ | 1 |
将来見込み有り | はい | 1 |
将来見込み有り | いいえ | 2 |
見込み無し | はい | 2 |
見込み無し | いいえ | 3 |
取引先責任者オブジェクトに、「Priority (優先度)」という名前の数値データ型の数式項目を作成します。
- [設定] で、[クイック検索] ボックスを使用して [オブジェクトマネージャ] を検索します。
- [取引先責任者] | [項目とリレーション] をクリックし、[新規] をクリックします。
- [数式] を選択して、[次へ] をクリックします。
- [項目の表示ラベル] に、「Priority」 (優先度) と入力します。[項目名] は自動入力されます。
- [数値] を選択して、[小数点の位置] を 0 に変更します。
- [次へ] をクリックします。
- 次の数式を入力します。
CASE(Account.Rating, "Hot", 1, "Warm", IF(Is_Executive__c, 1, 2), "Cold", IF(Is_Executive__c, 2, 3), 3)
この数式では、比較的大きな CASE() ステートメントの内部に IF() ステートメントを使用して、6 つのすべてのパターンを効率的にチェックします。
選択リストの例
- 次の数式は、[Contract Status (契約状況)] というカスタム選択リスト項目と、[Contract Activated Date (契約有効日)] というカスタム日付項目に基づいて、取引先との契約有効日以降の経過日数を返します。[Contract Status (契約状況)] が [Activated (有効)] でない場合は、この項目は空白です。
IF(ISPICKVAL(Contract_Status__c, "Activated"), TODAY() - Contract_Activated_Date__c, null)
- 次の数式は、契約オブジェクトの [Payment Due Date (支払期日)] というカスタム日付項目と、[Paid (既払)] と [Unpaid (未払)] という選択肢のある [Payment Status (支払状況)] というカスタム選択リスト項目を使用します。[Payment Status (支払状況)] が [Unpaid (未払)] で、支払期日を経過している場合は、数式項目に [Payment overdue! (支払い遅延!)] と表示されます。それ以外の場合は、項目が空白です。
IF(AND(Payment_Due_Date__c < TODAY(), ISPICKVAL(Payment_Status__c, "UNPAID")), "Payment overdue!", null)
- 次の入力規則は、ISPICKVAL() と PRIORVALUE() を使用して、誰かがリードの [状況] を [完了 - 取引開始済み] または [完了 - 取引未開始] から [進行中 - 未連絡] に変更したときに、エラーを表示します。
ISPICKVAL(Status, "Open - Not Contacted") && BEGINS(TEXT(PRIORVALUE(Status)), "Closed")
ユーザがリードの [状況] を完了から進行中に変更すると、レコードを保存しようとしたときにエラーが表示されます。
選択リストの一般的なエラー
- すべての数式項目で選択リスト項目をパラメータに取れる関数は、ISPICKVAL()、CASE()、TEXT() のみです。他の関数で選択リスト値を使用するとエラーが生じます。たとえば、次のチェックボックス数式項目の意図は、[リードソース] が「パートナー紹介」かどうかを示すチェックボックスを表示することです。けれども、選択リスト項目では「次の文字列と一致する」演算子 (=) がサポートされていないため、この数式はエラーを表示します。
LeadSource = "Partner Referral"
代わりに、ISPICKVAL() を使用して選択リスト項目の値をチェックするか、TEXT() を使用して選択リスト値をテキストに変換してから「次の文字列と一致する」演算子を使用します。ISPICKVAL(LeadSource, "Partner Referral")
TEXT(LeadSource) = "Partner Referral"