[Power Automate]Salesforceのケース作成時、Outlookメールの下書きを作成する

やりたいこと

Salesforceでレコードが作成されたとき、担当者に共有メールの下書きを作成する手順を自動化する。
メールはケースに応じて必ず作られるわけではなく、特定の文字を含む場合に作成する。

 

 

Salesforceのオブジェクト関係図

  • BtoBでの取引をしており、会社はユニークな会社コードをもつ。
  • 会社に対してはいくつかの商談が行われる。
  • 1つの商談において、顧客といくらかやり取りをすることになるため、打ち合わせの履歴などを会話履歴として残す。

 

メールを作成する条件

以下の条件をAND条件で満たすこと

  1. 「会話履歴が作成 or 更新されたとき」
  2. 「会話履歴の備考欄にメールを作成依頼のフォーマットが記述されている」
  3. 「その会話履歴に対して既に下書きを作成していないこと」

1.に会話履歴の更新も対象に入れているのは、会話履歴作成後に、2.のメール作成フォーマットの記述を入れ忘れてメールが作成されないということもあるので、あとからフォーマットを追加できるようにしている。

3.の条件は、下書きが二重に作成されてしまうことの防止策。

 

Power Automate 全体フロー図

手順① 「ケースが作成されたとき」トリガー

ODATAとは

トリガーとするケースをODATAという記法でSQLライクな記述をすることができる。
ODATAは、Webサービス間でデータのやり取りをするための標準プロトコルで、REST APIにてデータの取得・更新をすることができる。

Power AutomateでもSalesforceでもなく様々なサービスで利用されていて、ODATAの記述方法はMicrosoftに説明ページ(OData を使用して行をフィルターする)がある。
頻繁に利用するであろう条件式は以下の通り

  1. 比較演算子(eq, ne, gt, ge, lt, le) 例. value eq 50000value eq 50000 : valueの値が50000と等しい場合
  2. 論理演算子(and, or, not)
  3. ODataクエリ関数(containts, startswith, endswith)

SQQL と SOSLの違い

Salesforce内で利用されるSQLっぽい構文が2種類存在する。
それぞれ、Salesforce Object Query LanguageSalesforce Object Search Languageである。

SOQLは1つのオブジェクトを正確に検索する、SOSLは関連するすべてのオブジェクトを検索することができるそうだ。

Power Automate上ではODATAの記法で条件を記述するが、実行時に自動的にSOQLの記法に置換される。

SQSLの制約

SQSLでは1行テキストに対してフィルター条件を加えることはできるが、複数行テキスト(ロングテキストエリア、リッチテキストエリア)に対してはできない。

そのため、上記のように、条件を指定せず、Power Automate側でメール作成対象のケースかをチェックする必要がある。

 

手順② 共有メール作成対象であるかのチェック

 

会話履歴の備考欄に「■共有メール作成■」「【共有タイトル】」「【共有内容】」が記述されていることを条件としている。また下書きメールが作成されたら備考に「■メール作成完了■」を追記するようにレコードを更新して、次回以降レコードを編集しても2つ目の下書きが作られないようにしている。

手順③ 会社コードの取得、担当者のメールアドレスの取得

会社コードの取得

メールを送るためには担当者のメールアドレスが必要になるが、担当者は会社ごとに決まっている。
そのためまずは会社コードを取得している。

会話履歴が持つ商談のレコードIDをもとに、商談レコードを取得し、商談が持つ会社レコードIDをもとに会社レコードを取得するという2段階ステップを踏む。

ID(Salesforceの18桁ID)のフィールド名は「Id」であり、文字列比較をしなければいけないので、「''」で囲んであげる必要がある。

 

会社コードから担当者のメールアドレスを取得する

担当者情報がSalesforce上で管理されていればいいのだが、そうでない場合も想定して今回はExcelからOffice Scriptを用いて取得することにする。
かなり適当な作りではあるが、Power Automate側からcompanyCodeを渡して、指定セルからメールアドレスを取得しているだけである。

Power Automate側で配列を処理するのは手間であるため、あらかじめjoin()でメールアドレスを結合してから返却している。

function main(workbook: ExcelScript.Workbook, companyCode: string) : string{ 
    // ワークシートを取得する
    let selectedSheet = workbook.getWorksheet("会社検索");

    // Power Automateから連携された検索条件の会社コードを設定する
    selectedSheet.getRange("B2").setValue(companyCode);

    // 検索結果のメールアドレス一覧を取得する
    let mailAddressList: string[] = [];
    mailAddressList.push(selectedSheet.getRange("C6").getValue().toString());    
    mailAddressList.push(selectedSheet.getRange("C7").getValue().toString());    

    return mailAddressList.join("; ");
}

手順④ Outlookにメールの下書きの作成

Power Automateには「メールの下書きを作成する」アクションが用意されていない…と思ったら、ありましたね…(記事作成中に気が付く)

それはそれとして、一応はMicrosoft Graphを通してもメールを作成することができる。(今回はそちらで作った)

Graph APIのエンドポイント

Graph APIの根本の記述ルールはMicrosoft Graph API を使用するに説明がある。
また、Outlookにメールの下書きを作成する場合の記法はメッセージを作成するから参照できる。

 

手順⑤ 完了処理

無事処理が完了したら、会話履歴のレコードを更新する。
手順②の条件式と一致していれば、かつ処理が終わりましたよと分かるような文章を追記しておけば何でもよい。

 

 

改善点

ユーザーが会話履歴に、「■共有メール作成■」と記述したものの、【共有タイトル】を記述、またはヘッダーだけ入っていてその中身が空っぽという場合の判定ロジックを入れなければならない。
そうでないとユーザーが「メールが作成されるであろう」というつもりが、実は作成されていないという事態に陥る可能性があるからだ。

また、ユーザーが会話履歴レコードを保存してから、下書きメールが作成されるまで5 ~ 10秒ほどかかるため、メールが作成されたかどうか会話履歴の備考欄に(■メール自動先生済み■)と記述されたかを確かめるために、ページをF5でリロードする必要があるだろうが、それが若干ストレスになってしまうかもしれない。

一番いいのは、成功・失敗いずれの場合でも、そのユーザーに対してTeamsやOutlookなどで通知を行うことだろうか。