【Salesforce】特定のレコードを開いたときにユーザーにメッセージを表示する方法

標準機能では設定できそうでできない、そんな設定を Apex, LWC を用いて設定する方法を紹介していきたいと思います。
コードを書いたことがない人でも、コピー＆ペーストで、基本的に設定が完了します！

本記事では、「特定のレコードを開いたときにユーザーにメッセージを表示する方法」について紹介します。

## はじめに・・・
特定のレコードを開いた際に、メッセージを表示させる方法として標準機能を使う場合、以下のような方法が挙げられます。

-  Lightning ページにリッチテキストコンポーネントを配置して表示ルールを設定する
-  画面フローを作成する
-  強調表示パネルにテキスト項目を配置して手動で値を入力しておく
etc...

しかし今回は、一時的にポップアップで表示される「トースト表示」を使用して、メッセージを表示させる方法をご案内します。
※トースト表示とは、レコード作成後などに表示される、下記のようなポップアップです。

　
![image (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976080/a0591c41-0821-ef7f-eeef-1412b1e88bd0.png)


# 設定方法

今回は LWC を開発しますので、まず初めに下記の Qiita 等を参考に、VScode の開発環境を整えましょう。

[lwc] あなたにもできる、Lightning Web Component 開発の始め方 [Salesforce] #LightningWebComponents - Qiita
https://qiita.com/sho7650/items/91e3d3023dd4d9b23d6f
　
 #### コード例（js）
   
開発環境が整いましたら、js に下記のコードを書きます。
下記では、リードの標準項目「評価」が「見込み有り」の場合に、トースト表示させる LWC を作成しています。

```js
import { LightningElement, api, wire } from 'lwc';
import { getRecord } from 'lightning/uiRecordApi';
import { ShowToastEvent } from 'lightning/platformShowToastEvent';
import Rating_FIELD from "@salesforce/schema/Lead.Rating";

export default class Toasttest extends LightningElement {
    @api recordId;

    @wire(getRecord, { recordId: '$recordId', fields: [Rating_FIELD] })

    lead({ error, data }) {
        if (data) {
            const Rating = data.fields.Rating.value;
            if (Rating == '見込み有り') {
                this.showToast();
            }
        } else if (error) {
            console.error('Error fetching lead data:', error);
        }
    }

    showToast() {
        const event = new ShowToastEvent({
            title: 'このリードの評価',//ここの文章は任意
            message: 'このリードは「見込みあり」です。',//ここの文章は任意
            variant: 'warning',
        });
        this.dispatchEvent(event);
    }
}
```

上記例では、リードの標準項目「評価」の値を条件に、トースト表示を行いますが、他のオブジェクトの項目を条件にされたい場合は、下記をカスタマイズしてください。

1．4行目の「import Rating_FIELD from "@salesforce/schema/Lead.Rating";」
「Lead.Rating」の部分を、「任意のオブジェクト.項目のAPI参照名」となるよう変更

2．10行目の「const Rating = data.fields.Rating.value;」
「data.fields.Rating.value」の部分を、「data.fields.項目のAPI参照名.value」となるよう変更

3．11行目の「if (Rating == '見込み有り') {」
トースト表示を行いたい条件を任意で指定

 #### コード例（html）
今回はコンポーネント上に何か表示する必要はないため、デフォルトのコードから変更は必要ありません。

```html
<template>

</template>
```


 #### コード例（xml）
```xml
<?xml version="1.0" encoding="UTF-8"?>
<LightningComponentBundle xmlns="http://soap.sforce.com/2006/04/metadata">
    <apiVersion>61.0</apiVersion>
    <isExposed>true</isExposed>
    <targets>
        <target>lightning__RecordPage</target>
    </targets>
</LightningComponentBundle>
```

コードが書けましたら、環境へデプロイし、リード（もしくは任意のオブジェクト）の Lightning ページに作成したコンポーネントを配置します。
※今回は HTML をカスタマイズしておらず、トースト表示を行うのみなので、コンポーネントを配置しても何も表示されません。


## 結果
リードの評価が「見込み有り」のレコードを開いた際、下記のようにトースト表示されます。

![スクリーンショット 2025-01-05 17.52.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3976080/91d4590a-7a26-574e-1322-7a2499ecfc68.png)


### js のコードについて
レコードの情報の取得には、uiRecordApi から import した @wire の getrecord ワイヤアダプタを用いています。
@salesforce/schema でインポートした項目への参照を getrecord ワイヤアダプタで使用しています。

```js
import { LightningElement, api, wire } from 'lwc';
import { getRecord } from 'lightning/uiRecordApi';
import Rating_FIELD from "@salesforce/schema/Lead.Rating";
//省略
    @wire(getRecord, { recordId: '$recordId', fields: [Rating_FIELD] })
```

■ご参考
・ワイヤサービスを使用したデータの取得 
https://developer.salesforce.com/docs/platform/ja-jp/lwc/guide/data-wire-service.html
・getRecord
https://developer.salesforce.com/docs/platform/ja-jp/lwc/guide/reference-wire-adapters-record.html


またトースト表示は、lightning/platformShowToastEvent モジュールから ShowToastEvent をインポートして使用します。

```js
    showToast() {
        const event = new ShowToastEvent({
            title: 'このリードの評価',//ここの文章は任意
            message: 'このリードは「見込みあり」です。',//ここの文章は任意
            variant: 'warning',
        });
        this.dispatchEvent(event);
    }
```

variant や mode の値を変更することで、トースト表示の色や表示時間を変更することができます。
具体的な値については、下記ドキュメントを参照ください。

■ご参考：トースト通知
https://developer.salesforce.com/docs/platform/ja-jp/lwc/guide/use-toast.html