2021年8月12日

[Salesforce®初心者でもできる!UiPathによるオペレーションの自動化] Vol.21 Salesforceの状態変化に連動した見積書の作成

2021年8月12日

[Salesforce®初心者でもできる!UiPathによるオペレーションの自動化] Vol.21 Salesforceの状態変化に連動した見積書の作成

Salesforceの状態変化に連動した見積書の作成

前回はUiPath Connector for Salesforce(以降、Connector)をSalesforceに組み込み、Orchestrator接続情報を設定する流れをご紹介しました。もし見逃したという方は「UiPath Connector for Salesforce 接続設定」も併せてご覧ください。

今回はロボットと連携するまでの流れを、具体例を使ってご紹介します。

以降の流れは次の通りです。

本例のシナリオ概要

本例では次のシナリオを実現するものとします。
  • 営業担当が見積内容を登録し承認を得る
  • Salesforceプロセスが状態変化を検知しOrchestratorに連携
  • Orchestratorがロボットを起動
  • ロボットが見積書作成処理を実行(作成された見積書は商談&見積に添付され、営業担当に完了を通知します)

このシナリオを実現するための作成手順は、次の通りです。
  • 見積書を作成し商談&見積に添付するワークフローの作成
  • Orchestratorへのプロセスの登録
  • Connectorへのテンプレート(ジョブ)の登録
  • Salesforceプロセスの登録

本例ではSalesforceの見積情報から見積書を作成しますが、別の社内システムの情報から作成される場合もあると思います。その場合は「見積書を作成し商談&見積に添付するワークフローの作成」の取得元を社内システムに読み替えてください。

見積書を作成し商談&見積に添付するワークフローの作成

見積情報から見積書を作り、商談と見積に添付するワークフローを作成します。
見積書のフォーマットはExcelとし、明細転記後にPDF形式で出力するものとします。
添付した後に営業担当者にChatterで通知します。

本例が関係するオブジェクトの構造を確認しておきます。
※本記事から読み始められた方で"オブジェクト"という単語を初めて目にした方は第2回「Salesforce連携ソリューションを活用するための基礎知識1」を先にご覧ください。

「見積商品」は見積書の明細にあたり、明細の行数分だけレコードが存在します。各明細(見積商品)の商品名は、「商品エントリ」を介して「商品」から取得します。アップロードする見積書1ファイルに対し、「見積」と「商談」の各オブジェクトに添付するため、「ContentDocumentLink」は2レコードとなります。

商談および見積の画面イメージ、見積書フォーマット、ワークフローの全体像は次の通りです。

見積書作成前のイメージ

見積書添付後のイメージ

見積書Excelフォーマット

ワークフロー全体像

①「Main.xaml」を作成します。

「Main.xaml」を作成

  1. 「Quote_見積書作成.xaml」を呼び出します。
  2. 引数「Id (入力, String)」を設定します。
    • 処理対象の見積レコードのIDをOrchestrator経由で受け取るためのものです。
    • 引数名は「UiPath Connector for Salesforceのテンプレート(ジョブ)設定」に関連していますので、後述も併せて確認ください。

②「Quote_見積書作成.xaml」を作成し引数を設定します。

「Quote_見積書作成.xaml」を作成

  1. Main.xamlから見積レコードのIDを受け取る引数を設定します。
    • 名称は任意でOKです。
    • 本例では「in_sfdcQuoteId (入力, String)」を設定します。

    ※なお本例では初期処理の説明は割愛します。以降で使用するExcel,PDF各形式の見積書の出力先パスは、初期処理で変数「quoteExcelPath」「quotePdfPath」に設定されているものとします。

③見積レコードのIDから見積の詳細を取得します。

見積レコードのIDから見積の詳細を取得

  1. SOQL詳細:
    "SELECT Quote.QuoteNumber, Quote.Account.Name, Quote.Name, Quote.ExpirationDate, PricebookEntry.Product2.Name, Quantity, UnitPrice, Subtotal, Quote.Subtotal, Quote.Tax, Quote.GrandTotal, Quote.OpportunityId, Quote.Opportunity.OwnerId 
    FROM QuoteLineItem
    WHERE QuoteId='" + in_sfdcQuoteId + "'"
    • Quote.QuoteNumber(見積番号), Quote.Account.Name(取引先名), Quote.Name(見積名), Quote.ExpirationDate(有効期限), PricebookEntry.Product2.Name(商品名), Quantity(数量), UnitPrice(販売価格), Subtotal(明細の小計), Quote.Subtotal(見積の小計), Quote.Tax(消費税), Quote.GrandTotal(総計), Quote.OpportunityId(商談ID), Quote.Opportunity.OwnerId(商談所有者)を、見積商品(QuoteLineItem)オブジェクトから取得するSOQLです
    • レコードの絞込条件として、
      • 見積レコードのIDがSalesforceから連携されたIDであること
      を指定しています。本例では引数「in_sfdcQuoteId」を設定します。
  2. Salesforceステータスは必要に応じて設定します。
    ※本例では設定していますが、後続では使用しません。
  3. SOQLの結果を格納するため変数を設定します。
    • 変数の型はDataTableです。
    • DataTable内の列はSELECTの項目名になるため、14列になります。※下図、出力イメージ参照
    • 見積書のヘッダおよびフッタ情報は各明細に同じ値が含まれています。

    出力イメージ

④見積書に見積詳細を転記します。 ※冗長となる部分の説明は割愛しています。

  1. 見積番号を転記します。
    • ヘッダ情報は各明細に同じ値が含まれているため、代表して1行目から取得します。
    • 「sfdcQuoteItemList(0)("Quote.QuoteNumber").ToString()」を設定します。
    • 以降のヘッダ項目も同様です。

  1. 繰り返しの回数を利用して明細項目「No.」を入力しています。
    • 繰り返しの回数は、Activity「繰り返し(商品明細ごと)」の出力「現在のインデックスを」基にします。
    • 0から開始となるため、1を加算しています。

  1. Excel形式の見積書をPDF形式で保存しています。

⑤見積書(PDF形式)を見積と商談に添付します。

  1. ※設定の詳細は第10回「ファイルUploadと関連付け」をご参照ください。

  2. ファイルをアップロードします。
  3. 見積に添付します。
    • レコードIDに添付する見積レコードのIDを設定します。本例では引数Salesforceから受け取った値を保持する、引数「in_sfdcQuoteId」を設定します。
  4. 商談に添付します。
    • レコードIDに商談レコードのIDを設定します。本例では③で取得した見積詳細より商談ID「sfdcQuoteItemList(0)("Quote.OpportunityId").ToString()」を設定します。

⑥営業担当者にメンションしてChatterで通知します。

  1. ※下記以外の設定の詳細は第13回「Chatterへの投稿」をご参照ください
  2. 関連付ける商談レコードのIDをメッセージ雛型に差し込みます。
    左辺:
    sfdcChatterBody("subjectId")
    右辺:
    sfdcQuoteItemList(0)("Quote.OpportunityId").ToString()
    • 左辺の「("subjectId")」は常に固定です
    • 右辺は③で取得した商談IDを指定しています
  3. メンションするユーザのIDを差し込みます。
    左辺:
    sfdcChatterBody("body")("messageSegments")(0)("id")
    右辺:
    sfdcQuoteItemList(0)("Quote.Opportunity.OwnerId").ToString()
    • 左辺の「("body")("messageSegments")(0)("id")」は固定です
    • 右辺は③で取得した商談の所有者のIDを指定しています

ワークフローの作成はここまでです。完成したワークフローをOrchestratorに登録します。登録されたワークフローはOrchestratorでは「パッケージ」と呼ばれます。

Orchestratorと接続してる場合、Orchestratorと接続していない場合

Orchestratorと接続してる場合、「パッケージのプロパティ」画面でパブリッシュします。

Orchestratorと接続していない場合、「パブリッシュのオプション」を開いて、パブリッシュ先を「カスタム」、カスタムURLに任意のフォルダパスを設定しパブリッシュします。指定したフォルダにファイルが出力されたら、手動でOrchestratorにアップロードします。

Orchestratorへのプロセスの登録

Orchestratorにプロセスを登録します。
本例でConnectorがOrchestratorに依頼するのは、実は「ジョブの起動」です。
Orchestratorにおいてジョブは、ロボットの実行状況を管理する単位で、処理の依頼を受け付けるたびにOrchestrator内に生成されます。管理される実行状況には、「どのユーザが」「どのマシンで」「どのプロセスを」「どんな情報受け取って起動し」「今どんな状況か」などが含まれています。
プロセスはパッケージをOrchestrator内で扱う際の単位です。そのためプロセスを登録する際にパッケージ名を指定します。「どのユーザが」「どのプロセスを」「どんな情報受け取って起動し」の部分はConnectorが依頼時に指定します。
その他Orchestratorの基礎的な登録事項(ユーザ、マシン、フォルダなど)についてはここでは説明を割愛します。もし登録が未済の場合は、Orchestratorのマニュアル(https://docs.uipath.com/orchestrator/lang-ja/)を参照し設定してください。

①次の順で操作しプロセスを追加します。

②プロセスの詳細を設定します。

  1. パッケージを選択します。
    • パブリッシュした際の名称が選択肢に表示されない場合は、検索ボックスから検索します。
      ※本例では使用しませんが、その他の設定については必要に応じて設定してください。

下図のように登録されれば完了です。

Connectorへのテンプレート(ジョブ)の登録

Connectorにテンプレート(ジョブ)を登録します。
テンプレートには「ジョブ」と「キュー」の2種類があります。
テンプレート(ジョブ)はOrchestratorへ依頼するジョブの起動内容をパターンとして登録したものです。ジョブの起動内容には「プロセス名」「起動時のユーザ名」「引き渡すオブジェクトの情報」などが含まれます。

①次の順で操作しテンプレート(ジョブ)を追加します。

②テンプレートの詳細を設定します。

  1. テンプレート名を設定します。
    • 名称は任意でOKです。本例ではOrchestratorのプロセス名から「見積書作成」を指定しています。
  2. テンプレートの種類「ジョブ」を選択します。
  3. ※本例では使用しませんが、必要に応じて「テンプレートの説明」を設定してください。

  1. Orchestratorのプロセス名を選択します。
    • ボックス内に選択肢が表示されない場合は、検索欄にプロセス名の頭文字を入力し選択してください。
  2. 同時ジョブ起動数を設定します。
    • 複数の端末で同時にプロセスを実行させる場合、2以上の値を設定します。本例では「1」を指定しています。
  3. 端末にログインする際のユーザを選択します。
    • ボックス内に選択肢が表示されない場合は、検索欄にユーザ名の頭文字を入力し選択してください。

  1. ロボットに引き継ぐ項目を含むオブジェクトを選択します。
    • ワークフロー「Main.xaml」の引数で想定した値を持つオブジェクトを選択します。本例では、見積レコードのIDでしたので「見積」を設定しています。
    • ボックス内に選択肢が表示されない場合は、検索欄にオブジェクト英名の頭文字を入力し選択してください。
  2. ロボットに引き継ぐ項目を選択します。
    • ワークフロー「Main.xaml」の引数名が「Id」となった理由は、値が引き継がれる際ここで選択した「項目のAPI参照名」に対応する引数に、自動的に値が引き継がれる仕様のためでした。

これでテンプレート(ジョブ)を登録は完了です。下図のように表示されれば成功です。

Salesforceプロセスビルダーの設定

見積の状態変化を検知しConnectorを呼び出してOrchestratorに連携する「プロセス」を、プロセスビルダーで設定します。

①[設定] > [プロセスの自動化] > [プロセスビルダー] からプロセスを新規追加します。

②プロセス名等の概要を設定します。

  1. プロセス名を設定します。
    • 名称は任意でOKです。本例ではOrchestratorのプロセス名から「見積書作成」を指定しています。
  2. プロセスのAPI参照名を設定します。
    • 一意な名称である必要があります。
    • 日本語は使用できません。
  3. プロセスを開始するタイミグを設定します。
    • 本例では「レコードが変更されたとき」を設定します。

③プロセス詳細を設定します。

  1. 「オブジェクト」を選択します。
  2. プロセスが変化を監視するオブジェクトを選択します。
    • 本例では「見積」を設定します。
  3. オブジェクトがどう変化したときにプロセスを実行するかを選択します。
    • 本例では「レコードを作成または破棄したとき」を選択します。

  1. 「条件を追加」を選択します。
  2. 条件名を設定します。
    • 名称は任意でOKです。本例では「見積書の作成条件を満たした」を設定します。
  3. アクションの実行条件を設定します。
    • 本例では「条件を満たしている」を選択します。
  4. 具体的な実行条件を設定します。
    • 条件は任意でOKです。本例では「見積が承認済みであること」と「見積が係る商談のフェーズがProposal/Price Quoteであること」を設定しています。
  5. 実行条件が複数ある場合の論理条件を設定します。
    • 本例ではすべて満たした場合のため「すべての条件に一致(AND)」を設定します。

  1. 「アクションを追加」を選択します。
  2. アクション種別「Apex」を選択します。
  3. アクション名を設定します。
    • 任意の名称でOKです。本例では「見積書作成」を設定します。
  4. Apexのクラス「UiPath - Create Job Notifications」を設定します。
  5. Apexクラスへの入力情報を設定します。
    • Connection Template Name は種別「文字列」、値「テンプレート名称」を設定します。 本例では「見積書作成」を設定します。
    • Record Idは種別「項目の参照」、値「見積ID([Quote].ID)」を設定します。”Connectorへのテンプレート(キュー)の登録”②-6ではオブジェクト名の指定のみでしたが、ここで具体的なレコードを指定しています。

④プロセスを有効化します。

プロセスの設定は完了です。下図のように表示されれば成功です。

以上で全ての設定は完了です。見積の状態を「承認済み」に変化させると、ロボットが起動し見積書が商談や見積ページで添付されます。

まとめ

今回は具体例を使ってロボットを連携させるまでの流れをご紹介しました。

最後に今回の記事の中で取り上げた部品のリンク先などをお知らせします。
Activityの公開先 (UiPathマーケットプレイス):
Connectorの公開先 (AppExchange日本):
Salesforce連携ソリューションご案内:
その他連携ソリューションご案内:
Orchestratorのマニュアル
かんたん Excel アクティビティパック

https://marketplace.uipath.com/ja/listings/easy-excel-activity-pack

次回はConnectorを使った「Connectorテンプレート(キュー)による効率のよい連続処理」をお届けします。お楽しみに。

※SalesforceはSalesforce.com,Incの商標であり、許可のもとで使用しています。

 

また、UiPathでは、本記事で解説した内容に加えて、CRM/SFAの定着化のためのRPA活用について、実際の事例や、UiPathの連携ソリューションについてご紹介するeBookを無料で公開しています。eBookは下記よりダウンロードください。
download-crm-sfa-ebook

by Hidetaka Obata

TOPICS: Salesforce

Show sidebar