UiPath Blog
前回は、ケース(Case)を操作するワークフローをご紹介しました。もし見逃したという方は「ケース(Case)の操作」も併せてご覧ください。
商品や数量、ファイルの添付など1案件につき複数の登録が必要なため、作業に時間がかかっている・・・
こうした「一括転記の手間」に悩まれたことはないでしょうか。
Salesforceはサブシステムとして扱われており商品情報などは他システムから一括入力したり、少量多品種業務のため案件情報はExcelで管理し決裁等の社内手続きのためSalesforceに転記している、というケースを耳にします。
今回は、商談および商品&価格表の一括登録を中心に次の内容でお届けします。なお、ファイルの添付については、第10回「ファイルUploadと関連付け」でご紹介する予定です。
商談の主要関連オブジェクト
商談の登録
商品&数量の一括登録
商談フェーズ(Stage)の更新
本記事を読み終えたあと、ワークフローを作成すれば転記の手間がなくなると思います。
商談の主要オブジェクト群を確認しておきましょう。
※本記事から読み始められた方で"オブジェクト"という単語を初めて目にした方は「Salesforce連携ソリューションを活用するための基礎知識1」を先にご覧ください。
「商品」は商品名やコードといった売価以外の商品情報を管理します。「価格表」は定価やキャンペーンなど販売パターンの名称を管理します。各価格表に含まれる商品と単価は「価格表エントリ」が管理します。
「商談」はいずれかの「価格表」に関連付けられ、その中の商品を「商談商品」を介して組み合わせられるようになっています。
その他「ToDo」「見積」「契約」「取引先」などと関連しています。なお「ToDo」については第15回「行動(Event)とToDo(Task)の操作」で、「見積」については第22回「Connectorテンプレート(キュー)による効率のよい連続処理」でご紹介予定です。
取引先に関連付けて商談を登録するワークフローを作成します。
登録後のイメージとワークフローの全体像は次の通りです。
なお、取引先やは予めSalesforceに登録されている必要がありますので、ない場合はWeb画面から準備してください。
Actvityの設定方法を中心にお届けしているため、Salesforceアプリケーションスコープの設定やエラー制御は含まれておりません。また、Excelへの出力部分の実装は解説を割愛しておりますのでご了承ください。
個別にプロパティの設定内容を見てみます。
SELECT Id,Name FROM Account WHERE Name = 'サンプル株式会社'
Id,取引先名(Name)を取引先(Account)オブジェクトから取得するSOQLです
レコードの絞込条件として、
特定の取引先名であること
を指定しています。本例では「'サンプル株式会社'」を設定します。
SELECTの項目「Name」は後続で使用しませんが、デバッグ時に確認の補助となるため入れています
①-2 Salesforceステータスは必要に応じて設定します。
※本例では設定していますが、後続では使用しません。
①-3 SOQLの結果を格納するため変数を設定します。
変数の型はDataTableです。
DataTable内の列はSELECTの項目名になるため、Id,Nameの2列になります。
②-1 登録対象オブジェクト「Opportunity」を選択します。
②-2 登録対象の項目を選択する子ウインドウを開き、次の項目を選択します。
AccountId(取引先ID)
②-3 各項目に登録する値を設定します。
Nameは任意の商談名称を設定します。
StageNameは商談フェーズを設定します。フェーズ名称は会社の慣例により異なりますので、確認して設定してください。本例では「Prospecting」を設定します。
CloseDateは商談の完了予定日を設定します。設定する際は10桁の「yyyy-mm-dd」形式で設定する必要があります。本例では「2021-03-31」を設定します。
AccountIdは関連付ける取引先レコードのIDです。本例では①で取得した「sfdcAccountList(0)("Id").ToString()」を設定します。
これで完成です。ワークフローを実行してみてください。商談が指定の名称で登録されていれば成功です。
Excelの商談案件一覧をもとに、商談に商品と数量を一括登録するワークフローを作成します。
登録後のイメージとワークフローの全体像は次の通りです。
なお、商品や価格表の登録、および、商談への価格表の関連付けは予めSalesforceに登録されている必要がありますので、ない場合はWeb画面から準備してください。
個別にプロパティの設定内容を見てみます。
①-1 読み込んだ一覧を格納する変数を設定します。
変数名は任意でOKです。本例では「opportunityList」を設定します。
※その他プロパティは図の通りとします。
②-1 SOQL詳細:
SELECT Id,Name,Pricebook2Id FROM Opportunity WHERE Name = 'サンプル商談' AND Account.Name = 'サンプル株式会社'
Id,Name(商談名),Pricebook2Id(価格表ID)を商談(Opportunity)オブジェクトから取得するSOQLです
レコードの絞込条件として、
特定の商談名であること
特定の取引先名であること
を指定しています。本例では「'サンプル商談'」「'サンプル株式会社'」を設定します。
②-2 Salesforceステータスは必要に応じて設定します。
※本例では設定していますが、後続では使用しません。
②-3 SOQLの結果を格納するため変数を設定します。
変数の型はDataTableです。
DataTable内の列はSELECTの項目名になるため、Id,Name,Pricebook2Idの3列になります。
"SELECT Id,Product2.ProductCode,UnitPrice FROM PricebookEntry WHERE Pricebook2Id='" + sfdcOpportunityList(0)("Pricebook2Id").ToString() + "'"
Id, Product2.ProductCode(商品コード), UnitPrice(販売価格)を価格表エントリ(PricebookEntry)オブジェクトから取得するSOQLです
販売価格とは各価格表における定価を表します。
レコードの絞込条件として、
商談に関連付けられた価格表IDであること
を指定しています。本例では②で取得した「sfdcOpportunityList(0)("Pricebook2Id").ToString() 」を設定します。
③-2 Salesforceステータスは必要に応じて設定します。
※本例では設定していますが、後続では使用しません。
③-3 SOQLの結果を格納するため変数を設定します。
変数の型はDataTableです。
DataTable内の列はSELECTの項目名になるため、Id,Product2.ProductCode,UnitPriceの3列になります。
④-1 結合前データ:商談案件一覧を設定します。
本例では①で読み込んだ「opportunityList」を設定します。
④-2 結合前データ:Salesforceの商品一覧 を設定します。
本例では③で取得した「sfdcProductList」を設定します。
④-3 結合後データを格納する変数を設定します。
変数名は任意でOKです。
④-4 結合方法「Inner」を選択します。
④-5 結合時に比べる列を指定します。
本例では「商品コード」と「Product2.ProductCode」を設定します。
⑤-1 「取引先かつ商談案件ごと」に繰り返します。
本例では「opportunityListWithProductId.AsEnumerable.GroupBy(Function(row) row("取引先名").ToString() + row("案件名").ToString())」を設定します。
「.AsEnumerable.GroupBy(Function(row) グルーピング単位)」は特定の単位でグルーピングする際の式です。
本例ではグルーピング単位は取引先の商談案件ごとのため「row("取引先名").ToString() + row("案件名").ToString()」を設定します。
grpの型は「System.Linq.IGrouping<String, DataRow>」となります。
繰り返しの流れはExcelの列フィルターを各回切り替えるイメージです。今回の例にはありませんがサンプル株式会社の案件に"商談2"があった場合、1回目は"サンプル株式会社"&"サンプル商談"でフィルター、2回目は"サンプル株式会社"&"商談2"でフィルターという流れになります。grpには各回の明細行一式(商談案件の明細)が格納されます。
⑤-2 「商談案件の明細ごと」に繰り返します。
商談案件は⑤-1のgrpを設定します。
rowの型は「DataRow」となります。
②-1 登録対象オブジェクト「OpportunityLineItem」を選択します。
②-2 登録対象の項目を選択する子ウインドウを開き、次の項目を選択します。 PricebookEntryId(価格表エントリID)
②-3 各項目に登録する値を設定します。
OpprtunityIdは登録対象の商談レコードのIDを設定します。本例では②で特定した「sfdcOpportunityList(0)("Id").ToString()」を設定します。
Quantityは数量を設定します。本例では③で取得し⑤-2でグルーピングした「row("数量").ToString()」を設定します。
PricebookEntryIdは価格表エントリレコードのIDを設定します。本例では「row("Id").ToString()」を設定します。
UnitPriceは販売価格を設定します。本例では「row("UnitPrice").ToString()」を設定します。
これで完成です。ワークフローを実行してみてください。商談に商品と数量が登録されていれば成功です。
商談フェーズ(Stage)を更新するワークフローを作成します。
本例ではQualificationに更新するものとします。
登録後のイメージとワークフローの全体像は次の通りです。
なお、商談は予めSalesforceに登録されている必要がありますので、ない場合はWeb画面から準備してください。
個別にプロパティの設定内容を見てみます。
SELECT Id,Name FROM Opportunity WHERE Name = 'サンプル商談' AND Account.Name = 'サンプル株式会社'
Id,Name(商談名)を商談(Opportunity)オブジェクトから取得するSOQLです
レコードの絞込条件として、
特定の商談名であること
特定の取引先名であること
を指定しています。本例では「'サンプル商談'」「'サンプル株式会社'」を設定します。
①-2 Salesforceステータスは必要に応じて設定します。
※本例では設定していますが、後続では使用しません。
①-3 SOQLの結果を格納するため変数を設定します。
変数の型はDataTableです。
DataTable内の列はSELECTの項目名になるため、Id,Nameの2列になります。
②-1 更新対象オブジェクト「Opportunity」を選択します。
②-2 更新対象の項目を選択する子ウインドウを開き、次の項目を選択します。
StageName(フェーズ)
②-3 各項目に更新する値を設定します。
Idは更新対象の商談レコードのIDを設定します。本例では①で特定した「sfdcOpportunityList(0)("Id").ToString()」を設定します。
StageNameは商談フェーズを設定します。フェーズ名称は会社の慣例により異なりますので、確認して設定してください。本例では「Qualification」を設定します。
これで完成です。ワークフローを実行してみてください。商談フェーズが更新されていれば成功です。
商談フェーズは、Salesforce内の処理を起動するきっかけとしてもよく使われていると思います。商品や数量の登録に合わせてフェーズを更新するなど、商談に対する他の更新処理と合わせてフェーズを更新すると効果的です。
今回は「商談の操作」に関するワークフローの作り方をお届けしました。
皆様のワークフロー開発の一助になれば幸いです。
最後に今回の記事の中で取り上げた部品のリンク先などをお知らせします。
Activityの公開先 (UiPathマーケットプレイス):
https://marketplace.uipath.com/ja/listings/salesforce-activity-pack
Salesforce連携ソリューションご案内:
https://www.uipath.com/ja/solutions/technology/salesforce-automation
その他連携ソリューションご案内:
https://www.uipath.com/ja/solutions/application-cooperation-solutions
次回は「ユーザ(User)の操作」を行うワークフローをお届けします。お楽しみに。
※SalesforceはSalesforce.com,Incの商標であり、許可のもとで使用しています。
また、UiPathでは、本記事で解説した内容に加えて、CRM/SFAの定着化のためのRPA活用について、実際の事例や、UiPathの連携ソリューションについてご紹介するeBookを無料で公開しています。eBookは下記よりダウンロードください。
詳しくはこちら
Topics:
SalesforceSenior Sales Engineer, UiPath
Sign up today and we'll email you the newest articles every week.
Thank you for subscribing! Each week, we'll send the best automation blog posts straight to your inbox.