はじめに
皆さん こんにちは、にわと🐔(𝕏:@niwaniwa2wato)です。
「期日が迫っているレコードの担当者にリマインドを送りたいけれど、同じ担当者にはまとめて1通で送りたい」。
こんな要件、ServiceNowでよく耳にしますよね。
🐔「タスクのリマインドメール?そんなのすぐできますよ」
そう思って手を付けると、「同じ担当者にはまとめて1通」という部分で、意外とカスタムアクションやスクリプトの壁にぶつかることがあります。特に市民開発者の皆さんにとっては、これが大きなハードルになりがちです。
そこで今回は、ServiceNowのFlow Designerを使って、期日が近いタスクの担当者へ自動でリマインドメールを送る方法をご紹介します。Flow Designerはノーコード/ローコードでワークフローを構築できる強力なツールですが、今回はカスタムアクションの作成も交えながら、通常は難しいとされる要件を、より柔軟かつ効率的に実現するリマインドフローを構築していきます。
この記事でのServiceNow Version : Yokohama_patch3
市民開発の可能性を広げる!カスタムコンポーネント化の重要性
単にフローを作るだけであれば、さほど難しくない要件でも、同じようなフローを市民開発者が作ろうとすると、途端にハードルが高くなります。それは、スクリプト作成や複雑なデータ加工といった、通常はプロコード開発者しか手がけない領域に踏み込む必要があるからです。
そこで今回の実装では、市民開発で利用されるFlow Designerの標準機能のみで、カスタムアクションを積極的に作成します。これにより、プロコード開発者しか作成できないような処理をコンポーネント化して市民開発ユーザーはドラッグ&ドロップで開発できるようにします。
一度カスタムアクションとして用意してしまえば、市民開発者の皆さんはその複雑な内部処理を知る必要なく、これらの部品を組み合わせて、より高度な自動化を簡単に実現できるようになります。これは、開発効率の向上はもちろん、品質の安定やエラーリスクの軽減にも繋がり、ServiceNowにおける市民開発を後押しします。
今回の実装要件
今回目指すのは、以下の要件を満たすリマインドフローです。
タスクの担当者に、期日が迫っている複数のタスクについて、それぞれの詳細が記載された1通のリマインドメールを一括で送信したい。
実装イメージ
さて、図ではシンプルに見えますが、特に数字を振った四角形の中には、複数のアクションやスクリプトを組み合わせる必要が出てきます。この部分を、市民開発者でも簡単に使えるように、完結なカスタムアクションとして用意していきましょう。
①期日の迫るタスクを検索する[標準アクション]
このステップは、Flow Designerの「Look Up Records (複数のレコードの検索)」アクションで完結します。ここでは例として、期日が7日以内のタスクを検索します。
市民開発者の視点に立つと、リマインドの期日を自由に設定したいはずです。そのため、ここは標準アクションを使用し、期日をパラメーターとして設定できるようにします。
②検索したタスクの担当者ユーザーを検索する[カスタムアクション]
「①期日の迫るタスクを検索する」で抽出したタスクレコードリストから、重複しない担当者(ユーザー)のリストを効率的に取得する必要があります。
通常の「Look Up Records」アクションでは、複数のレコードから直接ユニークな関連ユーザーを抽出し、そのリストを渡すような複雑なフィルタリングはできません。そのため、ここでカスタムアクションを作成します。
このカスタムアクションでは、①で見つけたタスクレコードを入力として受け取り、そのアサイン先ユーザーのsys_idのリスト(カンマ区切り文字列)を作成します。これにより、次のステップでそのユーザーリストに対してループ処理を行えるようになります。
(function execute(inputs, outputs) {
    // 担当者のsys_idをキーとして使用し、重複を排除するためのオブジェクトを作成
    var uniqueUsersMap = {}; 
    // ユニークな担当者のsys_idを格納するための配列
    var uniqueUsersArray = [];
    // inputs.tasks (GlideRecordなど) の各レコードをループ処理
    while (inputs.tasks.next()) {
        // 現在のタスクの担当者(assigned_to)のsys_idを取得
        var currentAssigneeSysId = inputs.tasks.getValue("assigned_to");
        // 担当者が割り当てられており、かつまだ処理していない担当者である場合のみ追加
        // uniqueUsersMap[currentAssigneeSysId] が undefined の場合、その担当者はまだ処理されていない
        if (currentAssigneeSysId && !uniqueUsersMap[currentAssigneeSysId]) {
            uniqueUsersMap[currentAssigneeSysId] = true; // 担当者sys_idをキーとしてマップに登録
            uniqueUsersArray.push(currentAssigneeSysId); // ユニークな担当者配列に追加
        }
    }
    // uniqueUsersArray に格納されたユニークな担当者sys_idをカンマ区切りの文字列に変換
    outputs.user_sysids_list_string = uniqueUsersArray.join(',');
    // 例: outputs.user_list_string に "user1_sysid,user2_sysid,user3_sysid" のような文字列が格納される
})(inputs, outputs);
ループ[フローアクション]
②で取得した複数のユーザーレコード分、ループ処理を行います。これにより、担当者ごとに個別のリマインドメールを送信できるようになります。
③ユーザーが担当するタスクの詳細を入れたデータを作成する[カスタムアクション]
このカスタムアクションは、特定のユーザーが担当する複数のタスクの詳細情報をまとめて、メール本文として整形します。
「ユーザーごとに動的な数のタスク詳細を取得し、その文面を柔軟に変更したい」という要望も考えられますが、これをカスタムアクションの入力だけで実現するのは非常に複雑です。特に、動的なレコードのクエリや、その結果をメール本文として整形する処理をFlow Designerの標準機能だけで完結させるのは困難です。
市民開発者が使いやすいように、アクションと入力を配置するだけで完結できる形を優先し、今回は文面をある程度標準化しておくのが良いでしょう。必要であれば、文面のレベル(例:詳細版、簡易版)に応じて、複数のカスタムアクションを用意することも可能です。

(function execute(inputs, outputs) {
    // メール本文に含めるタスク詳細を格納するための文字列変数
    var taskDetailsBody = "";
    // inputs.tasks (GlideRecordなど) の各レコードをループ処理します
    while (inputs.tasks.next()) {
        // 各タスクの詳細を整形して文字列に追加します
        // 罫線で区切り、視覚的に分かりやすくしています
        taskDetailsBody += "─────────────────────────────────\n";
        taskDetailsBody += "■番号:" + inputs.tasks.getValue("number") + "\n"; // タスクの番号
        taskDetailsBody += "■タスク:" + inputs.tasks.getValue("short_description") + "\n"; // タスクの簡単な説明(タスク名)
        taskDetailsBody += "■期日:" + inputs.tasks.getValue("due_date") + "\n"; // タスクの期日
        taskDetailsBody += "─────────────────────────────────\n\n";
    }     
        
    // 最終的に整形されたタスク詳細の文字列をoutputsオブジェクトに設定します
    // これがFlow Designerの次のステップで使用されることになります
    outputs.taskbody = taskDetailsBody;
})(inputs, outputs);
④メールを送る
最後に、整形されたタスク詳細の本文を使って、担当者へリマインドメールを送信します。メールの文面(件名、本文の定型部分)は、カスタムアクションから外してフロー側で自由に編集できるようにします。
【ポイント】
宛先には、ループ中のユーザー自身のレコードではなく、その ユーザーレコード内の「メール」データ(Emailフィールド) を指す必要がある点に注意してください。

完成したフローの全体像
今回作成したフローは、カスタムアクションを活用することで、非常にシンプルで分かりやすい形になりました。
もしカスタムアクションを使わず、フロー内で直接スクリプトを記述したり、複雑なデータ加工を行おうとすると、このフローはもっと複雑になり、フロー変数やスクリプトを直接扱う必要が出てきます。また、フロー内でスクリプトを書くことは、読みづらさやメンテナンスのしにくさにつながり、特に市民開発者にとっては難易度が大幅に上がってしまいます。
まとめ
本記事では、ServiceNowのFlow Designerを活用し、期日が近いタスクの担当者へ自動でリマインドメールを一括送信するフローの構築方法を解説しました。
特に重要なポイントは以下の2点です。
- 
カスタムアクションの活用
通常はスクリプトが必要な「重複しない担当者の抽出」や「複数のタスク詳細のメール本文整形」といった複雑な処理を、再利用可能なカスタムアクションとしてカプセル化しました。これにより、フロー自体はシンプルに保たれ、保守性も向上します。 - 
市民開発の促進
カスタムアクションとして提供されるコンポーネントは、プロコードで作成した「部品」となり、市民開発者がノーコード/ローコードでより高度な業務自動化を実現するための強力なツールとなります。複雑なロジックを理解する必要なく、これらの部品を組み合わせてフローを構築できるため、市民開発の可能性が大きく広がります。 
最後まで読んでいただき本当にありがとうございました!!
ここまで読んでいただけた方はいいねとストックよろしくお願いします。
𝕏:@niwaniwa2watoをフォローいただけると嬉しく思います。











