Salesforce Compact Layouts によるユーザーエクスペリエンスの最適化:Lightning とモバイル向け詳細ガイド

背景と応用シーン

現代のビジネス環境において、ユーザーエクスペリエンス(UX)はソフトウェアの成功に不可欠です。特に、情報が溢れる中、SalesforceのようなCRMシステムでは、必要な情報に素早くアクセスできることが、生産性の向上とユーザー満足度の向上に直結します。この課題に対するSalesforceの重要な解決策の一つが、Compact Layouts(コンパクトレイアウト)です。

コンパクトレイアウトは、Salesforce Lightning Experience(Lightning Experience)およびSalesforce モバイルアプリケーション(Salesforce Mobile App)におけるレコードの詳細ページ上部にあるHighlights Panel(ハイライトパネル)に表示される主要なフィールドを定義する機能です。これにより、ユーザーはレコードを開いた瞬間に最も重要な情報を一目で把握でき、特にモバイルデバイスのような限られた画面スペースでの作業効率を大幅に向上させます。

具体的な応用シーンとしては、以下のようなケースが挙げられます:

  • 営業担当者が、顧客や商談のレコードを開いた際に、金額、ステージ、クローズ日などのキー情報を素早く把握し、次のアクションに繋げる。
  • サービス担当者が、顧客対応時にケースのステータス、優先度、顧客の連絡先などの必要な情報を素早く参照し、迅速な解決を図る。
  • 外出先からモバイルデバイスでSalesforceを利用するユーザーが、重要なレコード情報を効率的に確認し、場所を選ばずに業務を遂行する。

原理説明

コンパクトレイアウトの主な役割は、各オブジェクトのレコードヘッダーに表示されるフィールドを最大10個まで定義することです。これらのフィールドは、Highlights Panelに表示され、ユーザーがレコードの概要を把握するのに役立ちます。常に最初のフィールドは、レコード名(または自動採番フィールド)となり、これは明示的に追加する必要はありません。

Page Layouts(ページレイアウト)と比較すると、その目的は異なります。ページレイアウトがレコードに関する詳細な情報を網羅的に表示するのに対し、コンパクトレイアウトは「要約」に特化しており、最も重要な情報のみを厳選して表示します。

コンパクトレイアウトの設定は、Salesforceの標準的なObject Manager(オブジェクトマネージャー)を通じて行われるため、主にDeclarative(宣言的)な設定となります。設定手順は以下の通りです:

  1. Salesforceの「設定」から「オブジェクトマネージャー」に移動します。
  2. 対象のオブジェクトを選択し、「Compact Layouts」セクションにアクセスします。
  3. 「新規」ボタンをクリックして新しいコンパクトレイアウトを作成するか、既存のレイアウトを編集します。
  4. Highlights Panelに表示したいフィールドを最大10個まで選択し、順序を決定します。
  5. 作成したコンパクトレイアウトを、オブジェクトのデフォルトとして割り当てるか、Record Types(レコードタイプ)がある場合は、レコードタイプごとに異なるコンパクトレイアウトを割り当てます。

ユーザーが特定のフィールドを表示する権限(Field-Level Security(項目レベルセキュリティ)やObject Permissions(オブジェクト権限)により)を持たない場合、たとえそのフィールドがコンパクトレイアウトに設定されていても、自動的にユーザーには表示されません。これにより、セキュリティが常に維持されます。


示例コード

コンパクトレイアウトの定義や変更は主に宣言的な設定で行われますが、Apexコードを使用して、現在設定されているコンパクトレイアウトの情報をプログラム的に取得することは可能です。これにより、どのようなフィールドがコンパクトレイアウトに含まれているか、どのコンパクトレイアウトがどのレコードタイプに割り当てられているかなどを動的に確認できます。

以下のApexコードは、指定されたSObjectのコンパクトレイアウト情報を取得する方法を示しています。これは`Schema.SObjectType`および`Schema.CompactLayout`クラスを使用しており、Salesforceの公式ドキュメントでサポートされているメソッドです。

// Salesforce公式ドキュメント (developer.salesforce.com) より抜粋・構成
// Schema.CompactLayout: https://developer.salesforce.com/docs/atlas.en-us.apexref.meta/apexref/apex_Schema_CompactLayout.htm
// Schema.SObjectType: https://developer.salesforce.com/docs/atlas.en-us.apexref.meta/apexref/apex_Schema_SObjectType.htm

public class CompactLayoutInfo
{
    /**
     * 指定されたSObjectのコンパクトレイアウト情報を取得します。
     * このメソッドは、Apexからコンパクトレイアウトの定義自体を直接変更するものではありませんが、
     * どのコンパクトレイアウトが使用されているか、およびその中に含まれるフィールドを
     * プログラムで確認する方法を示しています。
     *
     * @param objectName 情報を取得したいSObjectのAPI名 (例: 'Account', 'Custom_Object__c')
     * @return SObjectCompactLayoutInfo オブジェクトのリスト
     */
    @AuraEnabled
    public static List<SObjectCompactLayoutInfo> getSObjectCompactLayoutDetails(String objectName)
    {
        List<SObjectCompactLayoutInfo> layoutInfos = new List<SObjectCompactLayoutInfo>();

        try
        {
            // オブジェクトのDescribeSObjectResultを取得
            Schema.DescribeSObjectResult describeResult = Schema.getGlobalDescribe().get(objectName).getDescribe();

            // オブジェクトに割り当てられたすべてのコンパクトレイアウトを取得
            // キーはCompactLayoutId、値はCompactLayoutオブジェクト
            Map<Id, Schema.CompactLayout> compactLayoutsMap = describeResult.getCompactLayouts();

            // レコードタイプごとのコンパクトレイアウト割り当てを取得
            Map<Id, Id> recordTypeToCompactLayoutIdMap = describeResult.getCompactLayoutId();

            System.debug('Compact Layouts for ' + objectName + ': ' + compactLayoutsMap.size() + ' found.');
            System.debug('Record Type assignments for ' + objectName + ': ' + recordTypeToCompactLayoutIdMap.size() + ' found.');


            // 各コンパクトレイアウトの詳細を処理
            for (Id layoutId : compactLayoutsMap.keySet())
            {
                Schema.CompactLayout layout = compactLayoutsMap.get(layoutId);
                SObjectCompactLayoutInfo info = new SObjectCompactLayoutInfo();
                info.compactLayoutId = layout.getId();
                info.compactLayoutName = layout.getName();
                info.compactLayoutLabel = layout.getLabel();

                // コンパクトレイアウトに含まれるフィールド名を取得
                List<String> fieldNames = new List<String>();
                for (Schema.CompactLayoutField field : layout.getFields())
                {
                    fieldNames.add(field.getName());
                }
                info.fields = fieldNames;

                // このコンパクトレイアウトが割り当てられているレコードタイプを特定
                List<String> assignedRecordTypeIds = new List<String>();
                for (Id rtId : recordTypeToCompactLayoutIdMap.keySet())
                {
                    if (recordTypeToCompactLayoutIdMap.get(rtId) == layoutId)
                    {
                        assignedRecordTypeIds.add(String.valueOf(rtId)); // IDを文字列として追加
                    }
                }
                info.assignedRecordTypeIds = assignedRecordTypeIds;

                layoutInfos.add(info);
            }

        }
        catch (Exception e)
        {
            System.debug('Error getting compact layout info for ' + objectName + ': ' + e.getMessage());
            // エラー処理を適切に行う
        }

        return layoutInfos;
    }

    /**
     * コンパクトレイアウトの情報を保持するための内部クラス。
     * Lightning Web Component (LWC) や Aura Component からの呼び出しを想定し、@AuraEnabled を付与しています。
     */
    public class SObjectCompactLayoutInfo
    {
        @AuraEnabled public Id compactLayoutId;
        @AuraEnabled public String compactLayoutName;
        @AuraEnabled public String compactLayoutLabel;
        @AuraEnabled public List<String> fields;
        @AuraEnabled public List<String> assignedRecordTypeIds; // 割り当てられたレコードタイプのIDリスト
    }

    /**
     * このメソッドの呼び出し例(匿名実行ウィンドウまたはLWC/Auraコンポーネントから):
     * List<CompactLayoutInfo.SObjectCompactLayoutInfo> accountLayouts = CompactLayoutInfo.getSObjectCompactLayoutDetails('Account');
     * System.debug(accountLayouts);
     *
     * LWCからの呼び出し例:
     * import getCompactLayoutDetails from '@salesforce/apex/CompactLayoutInfo.getSObjectCompactLayoutDetails';
     *
     * getCompactLayoutDetails({ objectName: 'Contact' })
     *     .then(result => {
     *         console.log(result);
     *     })
     *     .catch(error => {
     *         console.error(error);
     *     });
     */
}

このコードは、既存のコンパクトレイアウトの構造を理解するためのものであり、Apexから直接コンパクトレイアウトを新規作成したり、そのフィールド構成を変更したりするものではありません。コンパクトレイアウトの定義変更は、引き続き宣言的な設定で行うのが適切です。


注意事項

  • フィールド数の制限: Highlights Panelには最大10個のフィールドしか表示できません。この制限を超えるフィールドを選択した場合、最初の10個のみが考慮されます。
  • 非対応フィールドタイプ: Long Text Area(ロングテキストエリア)、Rich Text Area(リッチテキストエリア)、Multi-Select Picklist(複数選択リスト)などの特定のフィールドタイプは、コンパクトレイアウトには含められません。これらのフィールドは、Highlights Panelに表示されるのに適さないと判断されています。
  • パフォーマンスへの影響: コンパクトレイアウトに表示するフィールド数を少なく、かつ本当に必要な情報に絞ることで、レコードページの読み込み速度、特にモバイルデバイスやネットワーク環境が不安定な場所でのパフォーマンスが向上します。
  • セキュリティとアクセス権: ユーザーがコンパクトレイアウトに表示されるフィールドを見るためには、そのフィールドに対する適切なField-Level Security(項目レベルセキュリティ)と、オブジェクトに対するObject Permissions(オブジェクト権限)が必要です。これらの権限がないフィールドは、コンパクトレイアウトに設定されていてもユーザーには表示されません。
  • レコードタイプとの連携: レコードタイプごとに異なるコンパクトレイアウトを割り当てる場合、各レコードタイプに対して適切なレイアウトが設定されているか確認することが重要です。設定漏れがあると、オブジェクトのデフォルトのコンパクトレイアウトが適用される可能性があります。
  • デフォルトのコンパクトレイアウト: 新しいカスタムオブジェクトを作成すると、Salesforceは「System Default」というコンパクトレイアウトを自動的に作成します。これには通常、レコード名フィールドのみが含まれます。ビジネス要件に応じて、このデフォルトレイアウトをカスタマイズする必要があります。

まとめとベストプラクティス

コンパクトレイアウトは、Salesforceのユーザーエクスペリエンスを最適化し、特にLightning ExperienceとSalesforce Mobile Appにおいて、ユーザーが最も必要とする重要な情報を効率的に提供するための強力なツールです。

成功的な実装のためのベストプラクティスを以下に示します:

  • 要点の抽出: ユーザーがレコードを迅速に理解するために不可欠な、最も重要なフィールドを厳選します。多すぎるフィールドは情報の過負荷となり、目的を損ないます。
  • 情報の一貫性: コンパクトレイアウトのフィールド選択は、関連するページレイアウトや、モバイルエクスペリエンス全体のデザインと連携させることで、情報の一貫性を保ち、ユーザーの混乱を防ぎます。
  • モバイルファーストのアプローチ: モバイルデバイスでの利用を強く意識し、限られた画面スペースで最大限の価値を提供できるようなフィールド選択を行います。モバイルでの確認とテストは不可欠です。
  • 定期的な見直し: ビジネス要件やユーザーのフィードバックは常に変化します。コンパクトレイアウトも、定期的に見直し、ユーザーのニーズに合わせて最適化することで、その有効性を維持します。
  • テストと検証: 設定変更後は、必ず実際のユーザープロファイルでLightning ExperienceとSalesforce Mobile Appの両方で表示をテストし、意図通りに機能しているか、そしてユーザーにとって本当に役立つものであるかを確認します。

これらのプラクティスを遵守することで、Salesforce Compact Layoutsは、ユーザーの生産性を向上させ、より快適なSalesforce利用体験を提供するための基盤となるでしょう。

コメント