SalesforceのフローからSlackアクションを呼び出すことでSlackへメッセージを送信したり、ユーザをチャンネル招待したりすることで自動化の幅が広がるためSalesforceのフローでは人気機能の1つになっています。
ただしフロー保存時にエラーが出てしまい活用しづらいこともあり、どのような際にエラーが出るのかやその対応方法に頭を悩ませることがあるのではないでしょうか。
この記事で各パターンを検証しつつ、最適な設定ができるように学びましょう。
①保存エラー:「即時実行」パスにSlackアクションを追加
・前提:即時実行パス
・結果:保存エラー
Slackアクションを追加すると「このアクションは非同期パスに配置する必要があります」というエラー文が表示されます。

②一部保存エラー:非同期パスにてフロー開始条件に”条件なし”を指定
●②-1
・前提:非同期パス、「レコードが作成された」時に条件なしで起動
・結果:エラーなく保存可能

●②-2
・前提:非同期パス、「レコードが更新された」「レコードが作成または更新された」時に条件なしで起動
・結果:保存エラー
「非同期で実行されるパスの場合、レコードが条件の要件を満たすために更新されたか、条件で「変更済み」演算子を選択した場合のみ実行されるようにフローを設定してください。」というエラーが表示されます。

③一部保存エラー:非同期パスにてフロー開始条件に”変更済み”を指定
●③-1
・前提:非同期パス、開始条件で数式を使わず「変更済み」演算子を使用
・結果:エラーなく保存可能

●③-2
・③-2前提:非同期パス、開始条件で数式を使いisChanged()を使用
・③-2結果:保存エラー
Salesforceフローを保存すると「非同期で実行されるパスの場合、レコードが条件の要件を満たすために更新されたか、条件で「変更済み」演算子を選択した場合のみ実行されるようにフローを設定してください。」というエラーが表示されます。

④保存エラー:非同期パスにてフロー開始条件に”変更済み”以外を指定
④-1
・前提:非同期パス、開始条件で「変更済み」演算子以外を使用
・結果:保存エラー
Salesforceフローを保存すると「非同期で実行されるパスの場合、レコードが条件の要件を満たすために更新されたか、条件で「変更済み」演算子を選択した場合のみ実行されるようにフローを設定してください。」というエラーが表示されます。

④-2
・前提:非同期パス、開始条件で数式を使いisChanged()以外を使用
・結果:保存エラー
Salesforceフローを保存すると「非同期で実行されるパスの場合、レコードが条件の要件を満たすために更新されたか、条件で「変更済み」演算子を選択した場合のみ実行されるようにフローを設定してください。」というエラーが表示されます。

非同期パスでエラーとなる場合の対応策
ここまで見てきたように、Salesforceフローの即時実行パスでエラーとなるので非同期パスに変更してみても、結局エラーになることがあります。
そういった際は下記いずれかのアプローチになります。
・A:「条件の要件に一致するようにレコードを更新したときのみ」の開始とする(限定的に使用可能)
・B:非同期パスではなくスケジュールパスを使う(限定的に使用可能)
・C:即時パスのままプラットフォームイベントを使う(推奨)
●A:「条件の要件に一致するようにレコードを更新したときのみ」の開始とする(限定的に使用可能)
・エラー回避策
「レコードを作成または更新された」時に”電話”項目に値がある時、非同期でもエラーとなります。
しかし、下記のように「条件の要件に一致するようにレコードを更新したときのみ」にすることでエラーが回避できます。
・注意点
”レコードを更新したとき”、”特定の値に更新したとき”、という限定的なシーンでしか使用できません。

●B:非同期パスではなくスケジュールパスを使う(限定的に使用可能)
・エラー回避策
開始条件でスケジュール済みパスで「レコード最終更新日の1分後」とすることでエラーが解消されます。
実質即時実行となるよう「0分後」にすれば良いのではと思うでしょうが、0分後ではフローの保存エラーとなるため最小でも1分後にせざるを得ないようです。
・注意点
「レコード最終更新日の1分後」ということは、1分以内に複数回レコード更新されるとどうなるでしょうか。
たとえば1分間にフロー開始条件を3度満たしてレコード更新された場合に、3度目の処理だけでSlackアクションが実行され1、2度目の処理は実行されず取り消されてしまうようです。
実際には細かい前提条件の違いなどでこの通りの動きにならないかもしれませんが、少なくとも「3度とも処理される」保証はないため、使用できるシーンは限定的になります。

●C:即時パスのままプラットフォームイベントを使う(推奨)
・エラー回避策
フロー内でプラットフォームイベントを呼び出し、そのイベント内でSlackアクションを実行することでエラー回避できます。
即時実行でき、1分内に複数回フローが起動してもすべて処理が実行されるため一番安定感がある方法です。
・注意点
レコードトリガーフロー、プラットフォームイベントトリガーフローという2つのフローを作成することになるため少し複雑なつくりになります。そのためメンテナンス性も考慮して運用に沿うか検討が必要です。
・C-1手順:プラットフォームイベントの作成
[設定] – [プラットフォームイベント] – [新規プラットフォームイベント] から1つイベントを作成します。

・C-2手順:公開動作
ここではイベント呼び出し元のフローが正常終了した時だけSlack送信することを想定するため「コミット後に公開」にしてみます。
※公開動作の使い分け
-「すぐに公開」→トランザクションが成功したかどうかに関係なく、イベントが呼びされた時点でイベントが実行されます。
–「コミット後に公開」→トランザクションが正常にコミットされた場合にのみイベントが実行されます。トランザクションが失敗した場合は公開されません。

・C-3手順:カスタム項目の作成
Slackアクションで受け取るためのレコードID項目を用意しておきます。


・C-4手順:プラットフォームイベントへの権限付与
プラットフォームイベントも1つのオブジェクトのように各プロファイルでの権限設定をしておきます。デフォルトでは権限は付与されていません。

・C-5手順:レコードトリガーフローの作成
フローの「レコードを作成」要素で先ほど作成したプラットフォームイベントを1レコード作成します。
プラットフォームイベントは通常のオブジェクトのように扱えるので、下記のようにプラットフォームイベントで作成しておいたカスタム項目にフローのトリガーIDを渡します。

Slackアクションでなくあくまでプラットフォームイベントを呼び出しているだけなので、どのようなフローの開始条件でも保存エラーになることはありません。
Slackアクションを扱う上で、プラットフォームイベントは大きなアドバンテージになります。

・C-6手順:プラットフォームイベントトリガーフローの作成
レコードトリガーフローではなく、プラットフォームイベントトリガーフローを作成します。
C-5でプラットフォームイベントを1レコード作成することで、このプラットフォームイベントトリガーフローが呼び出されることになります。

作成しておいたプラットフォームイベントをトリガーにしてフロー起動し、Slackアクションを実行します。C-5のレコードトリガーから渡されたレコードIDをアクションに使用します。


まとめ
SalesforceフローでSlackアクションは便利ですが、フロー内で使うには開始要素で大きな制限があります。
プラットフォームイベントを挟むことでそのような制限無しに使用することができるため、デメリットを理解したうえでプラットフォームイベントを有効活用していきましよう。

