タイトルのとおりのご相談を受けました。
公式ヘルプで「
最初の承認プロセスメールの後にリマインダーメールを送信する」とあるのですが、最初だけじゃなくてすべてのステップで送信したいし、ワークフロールールだし…ということで、フローで実装していきます。
こちらで紹介するサンプルフローは「
承認申請/ProcessInstanceWorkitem」オブジェクトのレコード情報を使用してメールを送信します。このオブジェクトは承認待ちになっているステップの情報が管理されています。
このレコードのオブジェクトです。

「承認申請/ProcessInstanceWorkitem」の「SystemModstamp」を使用して、割り当てられてから24時間以上経過している場合にリマインダーメールを送信させますが、
ユーザが承認者の場合のみになります。
キューを使用している承認プロセスの場合は承認者がキューの場合に送信対象外とさせるか、ユーザの場合とキューの場合で別処理にするなどの対応が必要になります。こちらについては、最後のおまけで少し説明しています。
1.カスタム表示ラベルの作成
こちらは送信するメールの件名、本文、承認申請のリンクを挿入するために作成します。
フローのアクション内で直接入力する設定も可能ですが、保守性が高いカスタム表示ラベルを使用します。フロー内で直接入力される場合は、この作業はスキップしてください。
参考記事:
フローの設定を触らずに「Chatter」投稿メッセージを編集する。1.[設定] から、[クイック検索] で「カスタム表示ラベル」を検索し、[カスタム表示ラベル]をクリックします
2.[新規カスタム表示ラベル]をクリックし、以下の3つラベルを作成します。
「値」に入力された文字列を送信するメールに使用します。
①【件名】

②【本文】

③【組織のURL】
こちらはすでに作成済みの組織もあるかと思いますので、その場合はスキップしてください。
Sandboxで検証後に本番環境へリリースしましたら、こちらのカスタム表示ラベルを本番環境のURLに変更してください。

2.フローの設定
1.[設定] から、[クイック検索] で「フロー」を検索し、[フロー]をクリックし[新規フロー]ボタンをクリックします。
2.「スケジュールトリガフロー」を選択し、以下のように開始を設定します。
[+スケジュールを設定] をクリックし以下のように設定し[完了]をクリック
・開始日:このフローを開始したい日付
・開始時刻:このフローを実行したい時間(組織のタイムゾーンの時間で実行されます)
・頻度:毎日
3.左側のマネージャの[新規リソース]をクリックし、以下のように設定します。
①【土日判定用数式】
土日にメール送信しない場合に、こちらの数式を使用しますので、毎日メール送信しても構わない場合はこちらの数式作成は不要です。
祝日も考慮したい場合は「休日/Holiday」など祝日が登録されているオブジェクトのレコードを取得することで設定が可能ですが、今回の記事では割愛させていただきます。
・リソース種別:数式
・データ型:Boolean
・数式:MOD( WEEKDAY( TODAY() ), 6 ) = 1
この数式はこちらの
記事の数式を簡素化してくださったMark Hammerさんの
ブログを参考にしました。綺麗な数式ですね😍

②【基準日時算出用数式】
・リソース種別:数式
・データ型:日付/時間
・数式:NOW()-
1数式の最後の数字を割り当てられてからの経過時間にします。サンプルフローでは、24時間としていますので、「-1」にしています。24時間(1日)以外の場合は「-(N/24)」にして、Nに希望の経過時間を入力してください。

4.[開始]の下の⊕から[決定]要素を追加し、以下のように設定します。
※こちらは毎日メール送信しても構わない場合はスキップします。
・表示ラベル:平日
・結果を実行する条件の要件:すべての条件に一致(AND)
リソース | 演算子 | 値 |
formula_weekend (3.①で作成した数式を選択) | 次の文字列と一致する | False |
※デフォルトの結果の表示ラベルを「土日」とするかは任意です。

5. 「平日」(4.で設定した表示ラベル)の下の⊕から[レコードを取得]を追加し、以下のように設定します。
・オブジェクト:承認申請
・レコードを絞り込み:[条件の要件] すべての条件に一致(AND)
項目 | 演算子 | 値 |
SystemModstamp | 以下 | formula_Reference_DateTime (3.②で作成した数式を選択) |
・
レコードを並び替え:[並び替え順] 並び替えなし
・
保存するレコード数:すべてのレコード
・
レコードデータの保存方法:すべてのデータを自動的に保存

6.[レコードを取得]の下の⊕から[ループ]要素を追加し、以下のように設定します。
・コレクション変数:{!get_ProcessInstanceWorkitem} (上記5.で取得したレコードコレクション変数)

7.左側のマネージャの[新規リソース]をクリックし、以下のように設定します。
【メールの本文用テキスト】
・リソース種別:テキストテンプレート
・種別:プレーンテキストとして表示
・本文:
{!loop.Actor:User.LastName} {!loop.Actor:User.FirstName}様
{!$Label.UnapprovedReminder_body}
{!$Label.OrgURL}{!loop.Id}

サンプルフローでは、現在の承認者の「姓&名」とカスタム表示ラベルで設定したメール本文と承認申請のレコードURLをメールの本文としています。



8.[ループ]の「項目ごと」下の⊕から[アクション]を追加し、以下のように設定します。
・アクション:メールを送信
・件名:{!$Label.UnapprovedReminder_subject}(1.①で作成した【件名】のラベルを選択)
・本文:{!text_Emailbody}(7.で作成したテキストテンプレートを選択)
・受信者アドレス (カンマ区切り):{!loop.Actor:User.Email}

9.最後にフローを[保存]し[デバッグ]で確認後、 [有効化]にします。
有効化後のジョブの確認は、[設定] の[スケジュール済みジョブ] の「次の実行スケジュール」で確認することができます。

⚠️注意
保存時時に、[プロセスの自動化設定]で「デフォルトのワークフローユーザ」と「自動化プロセスユーザのメールアドレス」に登録がないと警告が表示されます。
表示される警告はこちら。

今回紹介しているサンプルフローの場合は、どちらも設定がなくてもメール送信されましたが、警告にある問題が不明のため、「デフォルトのワークフローユーザ」と「自動化プロセスユーザのメールアドレス」の設定をおすすめいたします。
ちなみに、「デフォルトのワークフローユーザ」に設定したユーザが送信者(フロー実行者)となります。「デフォルトのワークフローユーザ」を設定しなかった場合は、” Process Automated”からの送信となります。
【結果確認】
今回はデバッグを使用して確認します。
承認待ちのレコードを確認します。現在2件承認待ちレコードがあります。
検証日時は
10/13の14時頃です。
レコードAは割り当てられてから24時間以上経過していますが、レコードBは24時間以内です。

それぞれの承認申請のレコード画面はこちら


デバッグでレコードAだけが取得され、メール送信アクションが実行されるか確認します。今回は送信されたメールも確認するため、ロールバックモードにしないで実行します。
想定とおりにレコードAだけが取得され、「西日本 次朗」さんへメールが送信されています。

受信したメールはこちらです。

おまけ
プロセスインスタンスの「対象オブジェクトID」項目が申請したレコードIDになります。通知を行う申請オブジェクトを限定したい場合は、{!$loop.
ProcessInstance.TargetObjectId}の先頭文字3文字が該当のオブジェクトのprefixと一致しているかを判定させます。
また、冒頭で触れました承認者がキューの場合には、承認申請レコードの取得後に[コレクション検索条件]要素を追加して、「ActorIdが"005"で始まる」等でレコードを絞ります。ループは検索結果のコレクションで回します。(ユーザのprefixは"005"、キューはグループでprefixは"00G")
レコード取得時はレコードIDでLIKE検索ができないため、[コレクション検索条件]で対応します。
SIさんへ
コメントにてご質問ありがとうございます。
コメントにて回答しようとしたら、画像の添付ができなくわかりづらそうでしたので、こちらで追記いたします。

