【Salesforce】発注元ごとの専用注文フォームを作る｜FAX文化にも対応できるExperience Cloudの画面フロー活用法

# FAXで注文書受信するのと同じレベルが欲しい
本記事では、SalesforceのExperience Cloudと画面フローを活用して、発注元ごとに異なる簡易注文フォームを提供する仕組みを構築する手順を紹介します。

IT界隈では見かける機会が少ないかもしれませんが、B2B取引の現場ではFAX注文が今も主流のケースが多く見られます。


株式会社◯◯ 御中
以下の注文をお願いします。

| 注文品目名 | 数量 |
|:-:|:-:|
| 鮭おにぎり| 20個 |
| いくらおにぎり  |   |
| おかかおにぎり  |   |
| 梅干しおにぎり  | 5個  |
| お茶 500ml  | 255本  |

株式会社　☓☓

色々と言いたいことは皆さんあると思うのですが、これが日本の実態です。
そして、この注文書のフォーマットは数量をブランクにした状態のExcelを受注側が作っておいて、
発注側企業は数量だけ手書きして入力するという流れです。
発注側が普段注文する商品だけ掲載しておいてあげるなんて運用が多いですね。
つまり顧客毎に注文書が違います。

さて、発注側がこの状態でいきなりweb注文とか伝えても
「FAXのが楽だった」
「載っている商品が多すぎてどれだかわからない」
と言われ、FAXどころか電話注文になってしまうケースも。

そこで「ほぼFAX注文と同じ」状態の簡易注文フォームをSalesforce上に作ってみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4017914/e77d22da-ab18-4d45-8674-d05e7a6db8cf.png)

そしてこのフォームではURLパラメータの値を読み取って、発注先毎に違う注文フォームを提供できるようにしています。注文フォームはカスタムオブジェクトで用意しますので、ビジネスユーザーが取引先毎に作成・編集が可能です。

実際に触ってもらったほうがわかるかと思いますので、送信だけできるサイトを作りました。

おにぎり大好き株式会社用の注文フォームが表示される。
https://resourceful-hawk-dzyq4d-dev-ed.trailblaze.my.site.com/s/order?ordertoken=a00WU00000jaWh0YAE

パン大好き合同会社用の注文フォームが表示される
https://resourceful-hawk-dzyq4d-dev-ed.trailblaze.my.site.com/s/order?ordertoken=a00WU00000jatIbYAI

この構成はセキュリティ上の懸念があります。
パラメーターの値を書き換えてたまたま他の会社のSalesforceIdを開いてしまえばどの会社が何の注文をしているのかがわかってしまいます。また、SalesforceIdをそのまま露出するのもあまりよろしくないでしょう。
セキュリティを考えればゲスト公開するのではなく、ログインして利用する形式にするのがベストでしょう。
しかしながら、弥生会計が運営しているMisocaの注文フォームなどは当記事と同様の構成をしております。
注文テンプレートの会社名も非表示にしてしまえば、「どこかの会社がいつも注文する商品一覧」というテンプレートが流出するだけであり、実施する会社によっては問題ないと判断するかもしれません。
※実際に懸念あると判断した会社もあれば、他サービスと同じ構造だから問題無しとした会社もあります

それではこれ以降構築方法について説明します。

### 技術紹介
#### 業務とシステムの流れの概要
```mermaid
sequenceDiagram
    participant 顧客
    participant Salesforce
    participant スタッフ

    顧客->>Salesforce: QRコードからアクセス
    顧客->>Salesforce: 注文入力（Experience Cloud画面フロー）
    Salesforce->>Salesforce: 注文レコードを作成(フロー)
    Salesforce-->>スタッフ: 新規注文を通知・表示
    スタッフ->>Salesforce: 注文内容を確認・承認
    Salesforce->>顧客: 注文請書（番号付き）を送信
    Salesforce->>Salesforce: 商談へ転記（フロー）
    スタッフ->>Salesforce: 発送予定日を商談に入力
    顧客->>Salesforce: 注文番号で発送状況を照会
    Salesforce-->>顧客: 発送予定日と商品内容を表示
    スタッフ->>顧客: 商品受け取り
```
このブログでは顧客側が注文を送信ところまでの技術を紹介します。

### カスタムオブジェクトの作成
作成するオブジェクトは２つ。
1. テンプレート(注文フォームのヘッダー)
2. テンプレート明細(注文フォームの明細行)
```mermaid
erDiagram
    Account ||--|{ Template : has
    Template ||--|{ TemplateLineitem : contains

    Account {
        string id
        string name
    }

    Template {
        string id
        string title
    }

    TemplateLineitem {
        string id
        string item_name
        int quantity
    }
```
<table>
  <caption>テンプレート</caption>
  <thead>
    <tr>
      <th>項目名</th> <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td> テンプレート名 </td> <td>テンプレートの名前です。自動連番でもOKです</td>
  </tr>
  <tr>
    <td> 識別名 </td> <td>オプションです。SalesforceIDを表に出したくない場合は作成してください。使用する場合はユニークにします。</td>
  </tr>
</table>

<table>
 <caption>テンプレート明細</caption>
 <thead>
   <tr>
    <th>項目名</th><th>データ型</th><th>説明</th>
   </tr>
 </thead>
 <tr>
  <td> テンプレート名 </td><td>参照(テンプレートオブジェクト)</td><td>テンプレートレコードを参照します。</td>
 </tr>
 <tr>
  <td> 明細名 </td><td>テキスト</td><td>明細行に表示する内容です。商品名が入ります。</td>
 </tr>
 <tr>
  <td> 数量 </td><td>数値</td><td>発注者が入力をするために項目として作成しておきます。</td>
 </tr>
 <tr>
  <td> 商品Id </td><td>参照(商品オブジェクト)</td><td>現時点ではオプションです。後工程で発注者が入力した内容を商談や注文オブジェクトに転記する場合は必要になります。
 
</table>

オブジェクトが出来ましたら、後ほどのフローで利用できるようにサンプルレコードを作成しておいてください。


### フローの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4017914/ab028502-408d-423f-9d83-6988d6ac233e.png)

1画面目でURLパラメーターの値をフローに取り込みし、
その値を基にテンプレート及びテンプレート明細のレコードを取得しています。
2画面目が実際の注文フォームです。

以降では実際の構築内容を記載します。

始めにテキスト変数を作成します。
ここにはExperience cloud側でテキスト変数にURLパラメータの値が入るように後ほど行います。
"入力で使用可能"にチェックをします。

<table>
 <caption>作成する変数</caption>
 <thead>
  <tr>
    <th>変数名</th>
    <th>データ型</th>
    <th>コレクション</th>
    <th>入力で使用可能</th>
  </tr>
 <thead>
 <tbody>
  <tr>
   <td>token</th>
   <td>テキスト</th>
   <td>FALSE</th>
   <td>TRUE</th>
</table>

1画面目にはテキストコンポーネントを設置します。
デフォルト値は事前に作成した"token"変数を設定します。
これにより、
1. URLパラメータが変数に入る
2. (今回)変数が画面フローの入力値に自動で入る

までが行われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4017914/e0d8a171-d343-46aa-a593-ea813de072c0.png)

次にレコードの取得です。
今回はURLパラメータにSalesforceIdを用います。
検索条件の項目にIdを選択し、"token"の値で検索されるようにします。
これにより以下が行われます。
1. URLパラメータが変数に入る
2. 変数が画面フローの入力値に自動で入る
3. (今回)変数の値とSalesforceIdが一致するテンプレートレコードを取得

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4017914/6f463da2-cee8-43a5-9049-f45a18c2508a.png)

テンプレート明細も同様の手順で取得します。但し、こちらでは複数レコードを取得します。
これにより以下までが行われました。
1. URLパラメータが変数に入る
2. 変数が画面フローの入力値に自動で入る
3. 変数の値とSalesforceIdが一致するテンプレートレコードを取得
4. (今回)変数の値とSalesforceIdが一致するテンプレートレコードを全て取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4017914/98305bb6-9a54-49e1-9103-5846b75dea6b.png)

次に注文フォーム画面を用意します。
ここは繰り返しコンポーネントの利用方法がわかれば苦労しないと思います。
繰り返しコンポーネントの利用方法についてはわかりやすいブログを記載いただいている方々がいらっしゃいます。
※私はこちらの記事が好きですhttps://sfdctechsite.com/2023/12/17/spring24_repeater/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4017914/94b01b42-5ad0-4a4f-8ad9-601b405f0bf8.png)

これでフロー側の設定は終わりです。
最後の画面はただの送信確認画面ですので省略します。


### Experience cloudに画面フローを設定

Experience cloudにページを追加し、フローコンポーネントを設置します。
フロー側で設定した変数(今回で言えば"token")の入力欄が表示されます。
ここに{!パラメーター名}の形式で入力します。
画像のサンプルでは{!ordertoken}としています。
この設定をすることで以下のようにパラメーターを入れたURLから値を読み取れます。
```
https://Experiencecloudサイトのフローが埋め込まれたページ?{!パラメータ名}=XXXXパラメーターの値
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4017914/e7e742e4-fda2-437c-b39f-63e1b7bba345.png)

これで設定完了です。
以下が実現します。
0. (今回)フローがURLパラメーターを認識する
1. URLパラメータが変数に入る
2. 変数が画面フローの入力値に自動で入る
3. 変数の値とSalesforceIdが一致するテンプレートレコードを取得
4. 変数の値とSalesforceIdが一致するテンプレートレコードを全て取得


あとはゲストが使用できるように共有設定やフローの共有設定等をしてください。
これでパラメーター付きのURLにアクセスし、専用注文フォームが開き送信するところまで実装できます。

## まとめ

- FAX文化にも対応した注文フォームをSalesforceで再現可能
- URLパラメーターと画面フローを使えば、顧客専用フォームがノーコードで実現
- セキュリティには注意（IDの露出は業務要件に応じて判断）

今後は「注文レコード作成〜商談登録〜通知」の処理も記事化できればと思っています。  
Qiitaでフォローいただければ、更新時にお知らせが届きます！