【Salesforce】OmniScriptについて

# OmniScript
ドラッグ＆ドロップのノーコード開発により、動的なマルチステップのフォームが実装できます。
ユーザビリティの高いUIをより簡単に実装できるようにするため、OmniScriptにはOmniScript Designerと呼ばれるツールが用意されています。

## OmniScript Designer
インターフェースはドラッグアンドドロップ形式で、仕上がりを確認しながら作成できる編集機能を備えています。
OmniScript Designerでは、次の操作を実行できます。
+ データの抽出と保存やメールの送信を行うアクションを追加する。
+ ユーザの名前、住所、その他の情報などのデータを入力するための入力項目を追加する。
+ ユーザにフィードバックやエラーチェックをすぐに提供する計算とメッセージを設定する。
+ OmniScript内で計算を実行する数式などの関数を作成する。
+ ユーザがガイド付きプロセス内で行った選択に応じて、コントロールを動的に調整したり、ステップを有効または無効にしたりする分岐を作成する。
+ ステップの作成や、お客様が選択する項目リストの表示を行うことにより、項目をグループ化する。
+ HeadlineやText Blockを使用して表示を調整する。

OmniScript Designerの詳細については、下記のTrailheadをご確認ください。
[OmniScript Designer の詳細を説明する](https://trailhead.salesforce.com/ja/content/learn/modules/omnistudio-omniscript/dig-into-the-omniscript-designer)

## アクション
OmniScriptのアクションは、大きく分けて種類に分けられます。
+ **OmniStudioの他の機能を呼び出して実行する**

|アクション名|詳細|
|--|--|
|DataRaptor Extract Action|DataRaptor Extractを呼び出し、複数のSalesforceオブジェクトから情報を取得する。|
|DataRaptor Turbo Action |DataRaptor Turbo Extractを呼び出し、1つのSalesforceオブジェクトから情報を取得する。|
|DataRaptor Post Action |DataRaptor Loadを呼び出し、データをSalesforceに格納する。|
|DataRaptor Transform Action |DataRaptor Transformを呼び出し、データ出力フォーマットの変換などを実行する。|
|Integration Procedure Action | Integration Procedureを呼び出し、ルックアップテーブルから値を取得する。|
|Calculation Action |Calculation Procedureを呼び出し、計算処理を実行する。|
|Matrix Action | Calculation Matrixを呼び出し、ルックアップテーブルから値を取得する。|

※DataRaptor LoadはDataRaptor Load Actionではなく、DataRaptor Post Actionで呼び出します。

+ **APIなどを使って、処理を実行する**

|アクション名|詳細|
|--|--|
|DocuSign Envelope Action | ドキュメントのコピーを電子メールで送り、署名を要求する。 |
|DocuSign Signature Action | ドキュメントに署名する。 |
|Email Action | Salesforce APIを使用してメールを送信する。 |
|Remote Action | Salesforce Apexクラスを呼び出す。 |
|HTTP Action | 内外のWEBサービスを、Salesforce APIを経由せずに直接呼び出す。|

※後で記載しますが、Remote ActonやHTTP Actionは主にデータ取得のために使用します。

+ **直接実行する**

|アクション名|詳細|
|--|--|
| Delete Action | レコードを削除する。|
| Navigate Action | 外部サイトやSalesforceレコードに遷移する。 |
| Set Errors | 例外が発生した場合に表示するテキストを設定する。 |
| Set Value | ランタイムテスト用に使う値を設定する。 |

## 要素
OmniScriptの要素は、大きく分けて下記のように分類できます。

+ **表示**

|要素名|詳細|
|--|--|
|Line Break| 改行を挿入する。 |
|Text Block| 文字列やテーブルを整形する。<br>また、画像やハイパーリンクを追加する。 |

+ **演算を伴う機能**

|要素名|詳細|
|--|--|
|Aggregate| 要素の平均や合計などの集計を目的とした関数を呼び出す。 |
|Formula| 一般的な数式項目。 |
|Messaging| 先に行ったバリデーションの真偽に基づき、メッセージを表示する。 |

※Aggregateは和訳すると、「集計」になります。
別途記載しようと思いますが、Calculation Procedureでもでてきますが、一般的な数式との使い分けは言葉の通りになります。

+ **機能**

|要素名|詳細|
|--|--|
|Block| 要素を任意の論理的グループにまとめる。 |
|Action Block| 複数のOmniScript Actionが非同期で並行して動作できるようにグループ化する。 |
|Edit Block| Salesforceや外部のレコードを作成、編集、削除できるようにグループ化する。 |
|Radio Block| ラジオボタン型の選択肢をグループ化する。 |
|Step| ユーザ対話型のフォームを作成してガイドする。 |
|Type Ahead Block| 入力した文字列をもとにレコード値を検索し、サジェスト表示する。 |

+ **インプット**
インプットは種類が多いため、割愛します。
Omni Studio コンサルタント試験でよく問われるのが、**Text BlockとText、Text Area**の違いです。
インプット系は入力に特化した機能になるため、リンクを設置したい、改行を挿入したい等の要件があればText Blockを使います。

## プロパティ
OmniScriptには、数多くのプロパティが用意されています。
その中でも、特に覚えておいたほうが良さそうなものは下記になります。

|プロパティ名|詳細|
|--|--|
|Enable LWC| ライトニングWEBコンポーネントとして有効化する。 |
|Reusable| このOmniScriptを別のOmniScriptに埋め込むことを許可する。 |
|Knowledge Option| Salesforceナレッジ記事の表示 |
|Cancel Option| ユーザのキャンセルを有効化するオプション。<br>また、キャンセルにおける挙動などを設定する。 |
|Save Option| ユーザーが編集中のOmniScriptを保存し、後で再開できるようにする。 |
|Error Message| OmniScript内のエラーメッセージのオプション |
|Conditional View | 論理式に基づき、表示/非表示を設定する。 |

項目設定用のプロパティは下記になります。

|プロパティ名|詳細|
|--|--|
|Read Only| 読み取り専用にする。 |
|Required?| 必須項目にする。 |

OmniScriptは、Integration Procedure ActionによりIntegration Procedureを実行することができます。
そのため、Integration Procedureが備えているチェーニング設定に関するプロパティもあります。

## チェーニング設定
チェーニングを有効にすると、Integration Procedureの処理はステップが構成された制限を超えた場合、中間結果が保存され、以降のステップは新しいトランザクションで実行されます。
この機能を使うことで、処理時間が長く、ガバナ制限に引っかかるような処理でも完了できるようになります。
チェーニングには下記の２種類があり、OmniScriptではそれぞれに対応したプロパティが用意されています。
+ **Chainable**：同期Apexガバナ制限対策で使用します。
+ **Queable Chainable**：非同期Apexガバナ制限対策で使用します。
+ **Chain On Step**：アクションの次のステップを常に新しいトランザクションで実行します。

※チェーニングの有効化は、Remort Propertiesで設定します。
Remort Propertiesは主にガバナ制限への対策を設定するプロパティであり、チェーニングのほかにDataRaptor Transformの指定やApex Future メソッドの使用を設定できます。

## Invoke Mode
OmniScriptがIntegration Procedureを呼び出すアクションのレスポンス動作を規定します。
Invoke Modeには、下記の３種類があります。

+ **Default**：リクエスト実行後、レスポンスを待つ間、ローディングスピナを表示しながら待機します。
+ **Fire and Forget**：リクエスト実行後、レスポンスを待たずに次に進みます。(投げっぱなし）
+ **Non-Blocking**：非同期実行。デフォルト値を使用している要素は、レスポンスが戻る前に表示されます。

## Remote Options
Integratiron Procedureへの追加プロパティを、JSONのKey/Valueペアにより設定します。

### Extra Payload
追加パラメータのKey/Valueを設定します。
Valueは、下記のようなマージフィールド構文をサポートします。
````
%ContextId%
````
※OmniScriptのData JSONを含まずに、Extra PayloadのKey/Valueペアのみを送信したい場合は **Send Only Extra Payload** を設定します。
※マージフィールド構文で要素をつなぐときは、「：」を用います。例えば、下記のようになります。
````
%Details:ProductId%
````


### Send/Response Transformation

|プロパティ名|詳細|
|--|--|
|Send JSON Path| アクション実行前に送信するJSONを、指定するパスでトリミングします。 |
|Send JSON Node| 送信するJSONを、指定するノード下の親子関係に再構築します。 |
|Response JSON Path| アクション実行後に受け取るJSONを、指定するパスでトリミングします。 |
|Send JSON Node| 受け取るJSONを、指定するノード下の親子関係に再構築します。 |

## Conditional View
条件式に基づいて、要素の属性を設定します。

### Conditional Type

|プロパティ名|詳細|
|--|--|
|Show Element if True| 条件式がTRUEの場合、要素を表示します。 |
|Disable Read Only if True| 条件式がTRUEの場合、読み取り専用設定を無効化します。 |
|Set Element to Required if True| 条件式がTRUEの場合、必須項目に設定します。 |

### View Condition
条件式ダイアログボックスにて、条件式を編集します。

## エラー検証
OmniScriptでは、エラー検証を行う際にSet Values/Set Errorsを使います。

**Set Values アクション**
条件式を評価した結果の値を返します。
条件式は、複数の条件を組み合わせることもできます。

**Set Errors アクション**
指定した場所にエラーメッセージを表示します。

## Type Ahead Block
Block内のデータ要素と各種データソースを連携し、Type Ahead Blockが使用する検索パラメータとデータソースに送信する情報を定義します。
そのため、サジェスト機能だけでなく、検索時にOmniScriptで付随する情報も表示できます。
データソースは、Salesforceオブジェクトだけでなく、Google Maps Auto Completeなどからも取得できます。

## データの受け渡し
OmniScriptと各種データの受け渡しは下記のようになります。

### インプット
+ **Integration Procedureからのインプット**<br>Integration Procedure →　Integration Procedure Action → OmniScript

+ **Salesforceオブジェクトから1つの項目のみをインプット**<br>Salesforce → LookUp → OmniScript<br>※1つの項目のみを取得する場合は、LookUpのみで対応できます。

+ **1つのSalesforceオブジェクトからインプット**<br>Salesforce → DataRaptor Turbo Extract Action → OmniScript

+ **複数のSalesforceオブジェクトからインプット**<br>Salesforce → DataRaptor Exract Action → OmniScript

+ **APIからのインプット**<br>API → HTTP Action → OmniScript

+ **APIからの高度なインプット**<br>API → DataRaptor Transform → HTTP Action → OmniScript

+ **Apexを利用したインプット**<br>Apex Class → Remote Action → OmniScript

### Type Ahead Blockを使用したインプット
+ **ユーザによるインプット**<br>User → Type Ahead Block → OmniScript

+ **Google Mapsからのインプット**<br>Google Maps API →　Type Ahead Block → OmniScript

+ **APIからのインプット**<br>API → HTTP Action → Type Ahead Block → OmniScript

+ **APIからの高度なインプット**<br>API → DataRaptor Transfrom → HTTP Action　→ Type Ahead Block → OmniScript

+ **Salesforceからのインプット**<br>Salesforce → DataRaptor Extract Action → Type Ahead Block → OmniScript

+ **Apexを利用したインプット**<br>Apex Class → Remote Action → Type Ahead Block → OmniScript

### アウトプット
+ **Integration Procedureへのアウトプット**<br>OmniScript → Integration Procedure Action → Integration Procedure

+ **Salesforceへのアウトプット（UpInsert）**<br>OmniScript → DataRaptor Post Action → Salesforce

+ **Salesforceへのアウトプット（データ削除）**<br>OmniScript → Delete Action → Salesforce

+ **APIへのアウトプット**<br>OmniScript → HTTP Action → API<br>※変換が必要な場合は、DataRaptor Transformを使用します。

+ **PDFへのアウトプット**<br>OmniScript → PDF Action →　DataRaptor Transform → PDF<br>※DataRaptor Transformは、PDFへの値の設定を行うために使用します。

+ **メールへのアウトプット**<br>OmniScript → Email Action → メール

+ **DocuSignを使用したメールへのアウトプット**<br>OmniScript → DocuSign Envelope Action → DataRaptor Transform → Docusign Template → メールの送信

※メールの送信は、DocuSignで行います。
DocuSign Templateへの入力までがDataRaptor Transformの役割になります。
[Populating a DocuSign Template Using DataRaptor Transform](https://help.salesforce.com/s/articleView?id=sf.os_populating_a_docusign_template_using_dataraptor_transform.htm&type=5)


## その他
+ Webサイトのスタイルガイドを用いて新しいプロセスを実装したい場合は、カスタムスタイルタイプを使用します。<br>企業ブランディングキットを使いたい場合は、Newport Design Systemを使用します。<br>カスタムスタイルタイプとNewport Design Systemは、併用できます。

+ OmniScriptとLightning Web Componentの互換性を有効にするためには、下記の設定を行います。<br>1. isExposedMetaデータを有効化する。<br>2. 管理パッケージの名前空間を、runtimeNamespaceメタデータタグに追加する。

+ OmniScript Base Mixinをインポートすることで、カスタムLightning Webコンポーネントの開発をより効率化することができます。<br>[OmniScript Base Mixin](https://help.salesforce.com/s/articleView?id=sf.os_extend_the_omniscriptbasemixin_component.htm&type=5)