見出し画像

#Salesforce の活動報告を #Slack にDMでプッシュしてフォームから情報を投稿させるフローの実装

今回のミッション

Salesforceの活動オブジェクトに入れた活動が終わったタイミングで、Slack上にメッセージを送り、活動結果の入力を行うための入力フォームを送ってデータ入力してもらいたい

手順

  1. 入力フォーム用の画面フローを作る

  2. フローからSlackにメッセージを送信する

入力フォーム用の画面フローを作る

なにはともあれSlackからの入力画面を作らねばなりません。これはSalesforceの画面フローを使って構成することができます

フロー>新規作成>画面フローを選んで作成ボタンを押す

なにはともあれお約束のrecordIdを変数に加えましょう。入力で使用可能にしないと変数を受け取れません

スペル間違えないように→recordId

このrecordIdを元に、Eventオブジェクトを取得しましょう

iD == recordIdのEventオブジェクトのレコードを取得する

一旦簡単に画面を作ります

Descriptionに入力してもらいたいのでそこだけロングテキストエリアにしてます

画面フローに入力したDescriptionを使ってEventレコードを更新します

Descriptionに入力内容を入れましょう

保存ができたら、Slackの画面も更新します

完了画面フロー
フローの流れと各種リソース
保存する時はSlackで使用できるようにするにチェックを!!

これで画面フローは完成です。素晴らしい!

フローからSlackにメッセージを送信する

フロートリガーエクスプローラーってのができたので、この非同期に実行というところから新規フローを作成してみました。通常通りの作成方法でも問題ないです(レコードトリガーフローを使ってください)

フロートリガーエクスプローラー
スケジュール済みパスを追加する

スケジュール済みパスと言うところに編集リンクがあるのでそれをクリック
すると、追加ボタン(+)があるので、そこからこんな感じの条件で設定します。
終了時刻に実行されるようにしました。

アクションで先程の画面フローを選択しましょう

こんな感じです
Slackアプリケーションが表示されない場合は、こちらの記事を参照してアプリのインストールとSalesforceの接続を終わらせてください。そうすることで選択できるようになります

SalesforceのユーザーにSlackのユーザーIDを登録してください
弊社の場合は、SalesforceのユーザーオブジェクトにSlackIDを格納しているので User.SlackID__c でユーザーのSlackIDが取得できます。
本当は皆さんにこれをやってほしい。これが無いと、Slack側で通知が起こらないんですよね。

Slackの会話IDにSlackのユーザーIDを割り当てると、Sales Cloud for SlackからDMでメッセージが届きます

送信時のメッセージはこんな形にしましたが、なにか付帯情報を付けたい場合は適宜入れ込んでください。

そういうわけで、実行してみましょう。
予定を作ってみました。

デバッグをすれば即時実行でテストができます。

パスを、終了したら実行のパスを選んで実行しましょう。
DMで連絡がくればOKです。

結果を登録ボタンを押してみましょう

レコードを開いてみると

ちゃんと保存されていました

画面フローの完了画面を少しアレンジしました

これで入力ウィンドウが更新されます

もうひと工夫:チャンネルにpostしましょう

Slackから保存できるだけだともったいないので、これをチャンネルにもpostしましょう。
画面フローの最後にSlack投稿用のアクションを追加してください
まずはSlackメッセージ送信用のメッセージテンプレートを作成します

これをアクションに追加しましょう

Slackの会話IDは、先程とは違って特定のチャンネルIDにしましょう。
先程は、その人への通知なのでDMで良かったのですが、投稿内容をシェアするという用途を考えるとチャンネルに投稿すべきです。
チャンネルIDはこちらから取得します

こうすると、こんな流れになります。

時間がくるとDMでメッセージが流れてくるのでボタン押す

モーダルが開くのでコメントを登録する

保存されると、Slackに投稿する画面になるので、ボタンを押す

Slackに投稿するボタンを押すとチャンネルにメッセージが流れる

うまくいかなかったこと

↑の最後の部分なのですが、ボタン押さずにチャンネルに投げようと思ったらエラーがでてできませんでした。なぜなのか…。
サポートに投げてみようと思います。

サポートから返事がありました

挙動が分かりづらく恐縮でございますが、SalesforceとSlackはシステムが異なりますためフローで「Slackメッセージを送信」を実行した際に内部的に外部システムであるSlackのAPIが実行されます。
現在のフローの制限として、外部システムへのアクセスを伴う場合、Salesforceオブジェクトの操作とはトランザクションを分ける必要がございます。

そういうことか!1トランザクションでの実行は出来ないのでボタンを押すしかなさそうですね。

noteにはこれまでの経験を綴っていこうかと思います。サポートによって思い出すモチベーションが上がるかもしれない。いや、上がるはずです。