[Salesforce®初心者でもできる!UiPathによるオペレーションの自動化] Vol.14

Salesforce-main

メール操作

前回はChatterにメッセージを投稿するワークフローについてご紹介しました。もし見逃したという方は「Chatterへの投稿」も併せてご覧ください。

担当顧客への定期的なメール配信は社内のメーラーで送信しているが、送信記録はSalesforceには記録できていない・・・

このような「Salesforceへのメール内容の記録」に悩まれたことはないでしょうか。

1件1件Salesforceに記録するのは、宛先が多くなると手作業では限界があるものです。

今回はSalesforceへのメール記録作成を中心に、以下の内容でお届します。

  • メールのオブジェクト構造

  • メール記録を登録

  • メール記録にファイルを添付する方法

  • Salesforceメール記録と連動した担当顧客への一括メール配信

通常のメーラーでの配信と組み合わせれば、記録をより充実させることができると思います。

メールのオブジェクト構造

メール(EmailMessage) のオブジェクト構造を確認しておきましょう。

Salesforce-Integration_vol14_image1

メール(EmailMessage)オブジェクトは「宛先をオブジェクトにする」「ファイルを添付する」「各種営業活動と関連する」という場合、他のオブジェクトと関連を持ちます。

「宛先をオブジェクトにする」のは、取引責任者やリードなどSalesforceに登録済みの人の情報を使用する場合を指します。登録されていない場合は項目「ToAddress」「CcAddress」「BccAddress」を設定します。

メール記録の登録

取引先責任者を宛先とし、取引先に関連付けてメール記録を登録する、ワークフローを作成します。

登録イメージとワークフローの全体像は次の通りです。

Salesforce-Integration_vol14_image2
Salesforce-Integration_vol14_image3

なお、取引先は予めSalesforceに登録されている必要がありますので、ない場合はWeb画面から準備してください。

Activityの設定方法を中心にお届けしているため、Salesforceアプリケーションスコープの設定やエラー制御は含まれておりませんのでご了承ください。

個別にプロパティの設定内容を見てみます。

①メール本文を決定します。
Salesforce-Integration_vol14_image4

①-1 メール本文を格納する変数です。

  • 変数名は任意でOKです

①-2 本文を文字列で設定します。

本例では「"サンプル" + vbCrLf + "メールです"」です。

  • 文面は任意でOKです

  • 「vbCrLf」は改行を示しています

※他の情報源(メール雛型を保存したテキストファイルやExcel、メーラー)を使用する場合は、ここを読み替えてください。

②宛先にする取引先責任者とその所属(取引先)を特定します。
Salesforce-Integration_vol14_image5

①-1 SOQL詳細:

SELECT Id,Name,AccountId,Account.Name FROM Contact WHERE Name = 'サンプル 太郎' AND Account.Name = 'サンプル株式会社'

  • Id,担当者名(Name),取引先レコードのID(AccountId),取引先名(Account.Name)を取引先責任者(Contact)オブジェクトから取得するSOQLです

  • レコードの絞込条件として、

    • 特定の担当者名であること

    • 特定の取引先名であること

    を指定しています。本例では「サンプル 太郎」「サンプル株式会社」

  • SELECTの項目「Name」「Account.Name」は後続で使用しませんが、デバッグ時に確認の補助となるため入れています

①-2 Salesforceステータスは必要に応じて設定します。

※本例では設定していますが、後続では使用しません。

①-3 SOQLの結果を格納するため変数を設定します。

  • 変数の型はDataTableです。

  • DataTable内の列はSELECTの項目名になるため、Id,Name,AccountId,Account.Nameの4列になります。

③Salesforceにメール記録をドラフト状態で登録します。
Salesforce-Integration_vol14_image6

③-1 登録対象オブジェクト「EmailMessage」を選択します。

③-2 登録対象の項目を選択する子ウインドウを開き、次の項目を選択します。

Status(状況)、FromAddress(送信元アドレス)、FromName(差出人名)、Subject(件名)、HtmlBody(HTML内容)、RelatedToId(関連先ID)

③-3 各項目に登録する値を設定します。

  • Id(EmailMessage ID)は、登録後のEmailMessageレコードのIDを格納する変数を設定します。変数名は任意でOKです

  • Status(状況)はメール送信状況を設定します。③のタイミングでは「5(Draft)」を設定します。その他の値と意味は次の通りです。0(New)/1(Read)/2(Replied)/3(Sent)/4(Forwarded)

  • FromAddress(送信元アドレス)、FromName(差出人名)、Subject(件名)は任意の値を設定します

  • HtmlBody(HTML内容)は、HTML形式でメール本文を設定します。

    • 次の値をコピーして設定すればOKです。

      "<html><p>" + System.Text.RegularExpressions.Regex.Replace(System.Net.WebUtility.HtmlEncode(mailBody), "¥r¥n", "<br />", System.Text.RegularExpressions.RegexOptions.Multiline) + "</p></html>"

    • ①で決定した本文をHTML形式に自動変換しています。

  • RelatedToId(関連先ID)は関連付ける取引先レコードのID「sfdcContactList(0)("AccountId").ToString()」を設定します

④取引先責任者を宛先として関連付けます。
Salesforce-Integration_vol14_image7

④-1 登録対象オブジェクト「EmailMessageRelation」を選択します。

④-2 登録対象の項目を選択する子ウインドウを開き、次の項目を選択します。

RelationType(リレーション種別)、RelationId(リレーションID)、EmailMessageId(メールメッセージID)

④-3 各項目に登録する値を設定します。

  • RelationType(リレーション種別)は取引先責任者をどのアドレスとして関連付けるかを設定します。本例ではToのため「"ToAddress"」を設定します。その他の値は次の通りです。「CcAddress」「BccAddress」「FromAddress」

  • RelationId(リレーションID)は関連付ける取引先責任者レコードのIDを設定します。本例では「sfdcContactList(0)("Id").ToString()」です。

  • EmailMessageId(メールメッセージID)は③で登録したメール(EmailMessage)レコードのIDとなります。本例では「sfdcEmailMessageId」です。

⑤メールの状態を送信済みに更新します。
Salesforce-Integration_vol14_image8

⑤-1 更新対象オブジェクト「EmailMessage」を選択します。

⑤-2 登録対象の項目を選択する子ウインドウを開き、次の項目を選択します。

Status(状況)

⑤-3 各項目に登録する値を設定します。

  • Id(EmailMessage ID)は、更新対象のEmailMessageレコードのIDを格納する変数を設定します。本例では「sfdcEmailMessageId」です

  • Status(状況)は「3(Sent)」を設定します。

これで完成です。ワークフローを実行してみてください。メール記録が取引先と取引先責任者に登録されていれば成功です。

メール記録にファイルを添付する方法

ファイルを添付してメール記録を登録するワークフロー作成します。

登録イメージとワークフローの全体像は次の通りです。

Salesforce-Integration_vol14_image9
Salesforce-Integration_vol14_image10

なお、本節は前節の続きとなっておりますので、以降で説明していない部分は前節をご参照ください。

個別にプロパティの設定内容を見てみます。

①ファイルをアップロードします。
Salesforce-Integration_vol14_image11

①-1 Salesforce上でのファイルのタイトルを設定します。

  • タイトルは任意でOKです。本例では"サンプルファイル20201221-100500"といった名称になるよう設定しているため「String.Format("サンプルファイル{0:yyyyMMdd-hhmmss}", DateTime.Now)」を設定しています

①-2 アップロードするファイルのパスを設定します。

  • パスは任意でOKです。

①-3 必要に応じて変数を設定します。

※本例では設定していますが、後続では使用しません。

①-4 アップロードしたファイルバージョンのIDを格納する変数を設定します。

①-5 アップロードしたファイルのIDを格納する変数を設定します。

②アップロードしたファイルをメールに関連付けます。
Salesforce-Integration_vol14_image12

②-1 アップロードしたファイルのIDが納された変数を設定します。

②-2 関連付けるメールレコードのIDを設定します。

  • 本例では「sfdcEmailMessageId」です。

②-3 公開範囲を設定します。

  • 本例では「AllUsers」を設定しています。選択肢は次の通りです。

    AllUsers: ファイル参照権限を持つ全ユーザ

    InternalUsers:ファイル参照権限を持つ内部ユーザ

    SharedUsers:フィードを表示できる全ユーザ

②-4 公開ユーザの編集権限を設定します。

  • 本例では「V」を設定しています。選択肢は次の通りです。

    V: 閲覧者権限

    C: 共同作業

    I: 関連レコードに対するユーザの許可から推測

②-5 必要に応じて変数を設定します。

※本例では設定していますが、後続では使用しません。

これで完成です。ワークフローを実行してみてください。ファイルが添付されたメール記録が登録されていれば成功です。

なお、本例ではファイルをアップロードしていますが、別のタイミングでアップロード済みのファイルを関連付ける場合は①を「SOQLを実行」Activityでファイルレコード(ContentDocument)のID取得するものに置き換えると実現可能です。

Salesforceメール記録と連動した担当顧客への一括メール配信

Salesforceにメール記録を残しつつ、担当取引先の顧客に一括でメールを配信するワークフローを作成します。

配信範囲は担当取引先の顧客リストから選択できるものし、リストもワークフローで作成します。メールの配信はOutlookを使用するものとします。

実行の流れと実行後のイメージ、およびワークフローの全体像を以下に示します。

Salesforce-Integration_vol14_image13

なお、本節は前節までの内容を活用しておりますので、以降で説明していない部分は前節をご参照ください。

Salesforce-Integration_vol14_image14
Salesforce-Integration_vol14_image15

(ワークフロー1)担当取引先の顧客を抽出し配信先リストを作成します。

①担当取引先の顧客を抽出します
Salesforce-Integration_vol14_image16

①-1 SOQL詳細:

SELECT Id,Email,Name,Account.Name FROM Contact WHERE AccountId IN (    SELECT Id    FROM Account    WHERE Owner.Username='dummydummy@example.com')

  • Id,Email(メールアドレス),Name(氏名),Account.Name(取引先名)を取引先責任者(Contact)オブジェクトから取得するSOQLです。

  • レコードの絞込条件として、

    • 取引先の担当者が特定の営業担当者であること

    を指定しています。営業担当者が受け持つ取引先は複数あるため、Accountオブジェクトから自身が担当者となっている取引先のIDを先に抽出して、比較しています。本例では「(SELECT Id FROM Account WHERE Owner.Username='dummydummy@example.com')」を設定します。

①-2 Salesforceステータスは必要に応じて設定します。

※本例では設定していますが、後続では使用しません。

①-3 SOQLの結果を格納するため変数を設定します。

  • 変数の型はDataTableです。

  • DataTable内の列はSELECTの項目名になるため、Id, Email,Name,Account.Nameの4列になります。

②配信先リストに出力します。 ※設定内容は割愛します。
Salesforce-Integration_vol14_image17

配信先リストのイメージは次の通りです。左からAccount.Name列までが②の出力範囲です。

Salesforce-Integration_vol14_image18

営業担当者は配信したい顧客を選び「配信対象」列に〇を入力します。

この配信先リストには本文シートがあり、ここでメール本文などを設定するものとします。

Salesforce-Integration_vol14_image19

(ワークフロー2)配信リストをもとにメールを一括配信します。

③配信先リストからメール本文や配信先を取得します。
Salesforce-Integration_vol14_image20

③-1 本文シートから差出人名, 差出人アドレス, タイトル, 本文を取得します。

  • 結果は変数「mailFromName」「mailFromAddress」「mailTitle」「mailBodyRaw」に格納します。

    ※その他、設定内容は割愛

③-2 配信先リストシートから配信先リストを取得します。

  • 結果は変数「mailDeliveryListRaw」に格納します。

    ※その他、設定内容は割愛

③-3 ③-2から営業担当者が〇を付けた対象のみを抽出します。

  • 本例では「mailDeliveryListRaw.Select("ISNULL(配信対象, '')='〇'").CopyToDataTable()」と設定します。

    ※図「抽出後のイメージ」参照

    Salesforce-Integration_vol14_image21
④メール記録に関連付ける取引先レコードのIDを特定し、配信先リストに結合します
Salesforce-Integration_vol14_image22

④-1 SOQL詳細:

"SELECT Id,AccountId FROM Contact WHERE Id IN ('" + String.Join("','", mailDeliveryList. AsEnumerable().Select(Function(row) row("Id").ToString()).ToArray()) + "')"

  • Id,AccountId(取引先のID) を取引先責任者(Contact)オブジェクトから取得するSOQLです。

  • レコードの絞込条件として、

    • 配信先リストのIdをもつレコードであること

    を指定しています。本例では「('" + String.Join("','", mailDeliveryList.AsEnumerable().Select(Function(row) row("Id").ToString()).ToArray()) + "')"」を設定します。

  • 「String.Join(区切り文字, 配列)」は配列から区切り文字で区切られたの文字列を生成するものです。例:{"hello","world"}→"hello,world"

  • 「AsEnumerable().Select(Function(row) row("Id").ToString())」はデータテーブルmailDeliveryListのId列だけの値を抽出しています。

  • つづく「.ToArray()」はString.Joinの第2引数に型を合わせるための変換です。

  • 抽出後のイメージをこの式に当てはめると「('0032v00003gajTEAAY','0032v00003gakMfAAI')」となります。

④-2 Salesforceステータスは必要に応じて設定します。

※本例では設定していますが、後続では使用しません。

④-3 SOQLの結果を格納するため変数を設定します。

  • 変数の型はDataTableです。

  • DataTable内の列はSELECTの項目名になるため、Id, Email,Name,Account.Nameの4列になります。

    Salesforce-Integration_vol14_image23

④-4 結合前データ:抽出後の一覧を設定します。

  • 本例では③-3で抽出した「mailDeliveryList」を設定します。

④-5 結合前データ:Salesforce取引先一覧を設定します。

  • 本例では④-3で取得した「sfdcContactList」を設定します。

④-6 結合後データを格納する変数を設定します。

  • 変数名は任意でOKです。

④-7 結合方法「Inner」を選択します。

④-8 結合時に比べる列を指定します。

  • 本例では両方「Id」を設定します。

⑤Outlookでメールを送信し、あわせてメール記録を残します
Salesforce-Integration_vol14_image24

⑤-1 メール本文をHTML形式に変換します。

  • 次の値をコピーして設定すればOKです。

    "<html><p>" + System.Text.RegularExpressions.Regex.Replace(System.Net.WebUtility.HtmlEncode(mailBodyRaw), "¥n", "<br />", System.Text.RegularExpressions.RegexOptions.Multiline) + "</p></html>"

⑤-2 宛先ごとにOutlookでの送信と、メール記録の登録を繰り返します。

  • コレクションには④-6で結合した後の変数を設定します。

⑤-3 Outlookでメールを送信します。

  • プロパティ設定内容は図「Outlookメール送信プロパティ」を参照

⑤-4 Salesforceにメール記録をドラフト状態で登録します。

※プロパティの説明は前節「メール記録の登録 ③」を参照ください。

⑤-5 取引先責任者を宛先として関連付けます。

※プロパティの説明は前節「メール記録の登録 ④」を参照ください。

⑤-6 メールの状態を送信済みに更新します。

※プロパティの説明は前節「メール記録の登録 ⑤」を参照ください。

Salesforce-Integration_vol14_image25
Salesforce-Integration_vol14_image26
Salesforce-Integration_vol14_image27

これで完成です。ワークフローを実行してみてください。メールが配信されとメール記録が登録されていれば成功です。

まとめ

今回はメール(EmailMessage)を操作するワークフローをお届しました。

皆様のワークフロー開発の一助になれば幸いです。

最後に今回の記事の中で取り上げた部品のリンク先などをお知らせします。

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

次回は「行動(Event)とToDo(Task)の操作」をおこなうワークフローをお届けします。お楽しみに。

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

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

Salesforce-Integration_vol22_image32

詳しくはこちら

Topics:

Salesforce
Avatar Placeholder Big
Hidetaka Obata

Senior Sales Engineer, UiPath