ルドルフもわたるふもいろいろあってな

Microsoft 365、Power Platform、PowerShellについて調べたことや検証したことなどを投稿します。技術の話は面白い。

【質問回答】【Power Automate】メール本文に載せるExcelテーブルを宛先ごとに動的にフィルタする

Twitterで質問をいただきましたので回答します。

この質問に応えて作成したフロー「メール本文に載せるExcelテーブルを宛先ごとに動的にフィルタする」をGitHubで公開しました。

下記リンク先からダウンロードしてください。
github.com

Twitterでこんな質問をいただきました


やってみましょう。

(´・ω・`) ノシ

今回 実現したいこと

前提

  • 「オーダー一覧」というテーブルがある
  • このテーブルの1行は1件のオーダーを表している
  • このテーブルには「オーダーの内容」と「登録者の情報」が列情報として記載されている


実現したいこと

  • オーダーに対する納入遅延を登録者にメールで通知したい
  • メールは登録者ごとに送信したい
  • メールの内容は以下の通り
    • 件名は「遅延連絡」とする
    • 本文を構成する内容は以下の通り
      • 宛先:宛先の投稿者名
      • 連絡事項:「下記オーダーの納入に遅延が発生しております」という固定文
      • 「オーダー一覧」の行のうち宛先の登録者でフィルタしたもの
      • 「オーダー一覧」の表は本文内にHTMLのテーブルで記載する

フロー図

閉じた状態のフロー図


開いた状態のフロー図

フローの使用イメージ

事前準備

まずは「オーダー一覧」を作成します。

Excelに下記のテーブルを作成します。オーダー一覧には3名の登録者による合計8件のデータが登録されています。

テーブルの名前を「オーダー一覧」にします。

作成したExcelファイルをサイトにアップロードします。SharePointとOneDriveのどちらでも可です。

フローの編集画面を開いてファイルとテーブル名を指定します。

フローを実行

手動実行トリガーでフローを実行します。

フローの実行ユーザーのメールボックスを確認します。メールが3件送られたことが分かります。

3名の登録者宛にそれぞれ「遅延連絡」という件名のメールが送られたことが分かります。

登録者 A 宛のメール

登録者 B 宛のメール

登録者 C 宛のメール

ステップごとの解説

今回作成したフローをステップごとに解説します。

「手動でフローをトリガーします」トリガー

名前の通り、フローを手動で実行するトリガーです。今回はこのトリガーでの入力情報はありません。

「表内に存在する行を一覧表示」アクション

これは「Excel Online」>「表内に存在する行を一覧表示」アクションです。

「オーダー一覧」テーブルに記載している行をすべて取得するために使います。

「選択-各行の「登録者従業員番号」列の値を取得」

これは「データ操作」>「選択」アクションです。

記載している式

"from": "@outputs('表内に存在する行を一覧表示')?['body/value']",
"select": "@item()?['登録者従業員番号']"

「オーダー一覧」テーブルに登録されているデータのうち「登録車従業員番号」列の情報のみを取得します。

このアクションの出力は以下の通りです。

「作成-表内の登録者従業員番号(重複なし)」

これは「データ操作」>「作成」アクションです。

記載している式

union(body('選択-各行の「登録者従業員番号」列の値を取得'),body('選択-各行の「登録者従業員番号」列の値を取得'))

このアクションでは、ひとつ前のステップで取得した「登録者従業員番号」列の情報から重複を排除しています。

これで、メールの宛先となる登録者の洗い出しができました。

「選択-「@odata.etag」と「ItemInternalId」を削除済み」

これは「データ操作」>「選択」アクションです。このアクションではテーブルの全件データから不要なプロパティ情報を削除します。

記載した式

"from": "@outputs('表内に存在する行を一覧表示')?['body/value']",
"select": "@removeProperty(removeProperty(json(replace(string(item()),'@odata.etag','@odataetag')),'@odataetag'),'ItemInternalId')"

このアクションの目的はテーブルから読み込んだデータから下記のプロパティを削除することです。

  • @odata.etag
  • ItemInternalId

これらのプロパティはExcelOnlineのテーブルからデータを取得する際に自動で付加されれるプロパティです。今回のフローで実現したいことでは使わない情報であるため削除しました。

参考:
これらのプロパティ削除については以前登録したこちらの記事でも触れています。
wataruf.hatenablog.com

「Apply to each」

このアクションは「コントロール」>「Apply to each」アクションです。繰り返し処理を行います。

この繰り返し処理のインデクサは「オーダー一覧」から取得した"登録者従業員番号"です。

「アレイのフィルター処理-「登録者従業員番号」で表をフィルタ」

このアクションは「データ操作」>「アレイのフィルター処理」アクションです。

記載している式

"from": "@body('選択-「@odata.etag」と「ItemInternalId」を削除済み')",
"where": "@equals(item()?['登録者従業員番号'], items('Apply_to_each'))"

オーダー一覧の行を現在のitem の"登録者従業員番号"でフィルタします。

「ユーザー プロフィールの取得 (V2)」

このアクションは「Office 365 Users」>「ユーザー プロフィールの取得 (V2)」アクションです。

記載している式

body('アレイのフィルター処理-「登録者従業員番号」で表をフィルタ')?[0]?['登録者アドレス']

このアクションを使用している目的はメールの本文の載せる「登録者の表示名(= 姓名)」を取得することです。

「HTML テーブルの作成」

このアクションは「データ操作」>「HTML テーブルの作成」アクションです。

メールの本文にテーブルを載せるために行データをHTMLテーブル化します。

このアクションによって、HTMLタグを使ったデータに変換されます。

「作成-表のスタイル」

このアクションは「データ操作」>「作成」アクションです。

「HTML テーブルの作成」アクションで作成したHTMLテーブルを見やすく整えるためにスタイルを設定します。

こちらの記事で公開されているスタイルをお借りしました。
 ※ 列名を折り返さないように 「white-space: nowrap」だけ追加しました
qiita.com

また、このアクションは各メールで共通で使用するスタイルであるため、繰り返し処理の外で定義してもかまいません。今回はあくまでサンプルのフローなので解説をしやすくするためにこの位置にアクションを配置しています。

「メールの送信 (V2)」

このアクションは「Office 365 Outlook」>「メールの送信 (V2)」アクションです。

これまでのアクションで定義したHTMLテーブルとスタイルを使用して本文を定義します。

固定の文字列はテキストを直接記載します。

これでフローは完成です。

このフローをGitHubで公開しました。(再掲)

フローをGitHubで公開しました。下記リンク先からダウンロードしてください。この投稿の冒頭で記載しているリンクと同じです。

下記リンク先からダウンロードしてください。
github.com

[不具合?]「選択」アクションで「テキスト入力モード」を使用すると次回編集時に値が消失する

このフローを使用するうえで1点注意してほしいことがあります。それは、「選択」アクションで「テキスト入力モード」を使用すると次回編集時に値が消失する現象が起きてしますことです。

「テキスト入力モード」にして式を入力し、フローを保存することは問題なくできます。フローを実行すると期待通り動作します。
しかしながら、フローの編集画面を開くと選択アクションの入力画面で"動的な値"が消失しまう現象が発生します。

一時的に発生している現象であるか、これが仕様なのかは不明です。

ですが、運用環境でこの現象が発生してしまうと誤動作の原因になる場合があります。そのため、運用環境で使用するフローを設計する際にこの現象がまだ継続しているようであれば、「選択」アクションを繰り返し処理(Apply to each)に置き換えるなどで対応をすることが望ましいです。

さいごに

フローの質問や調査・検証ネタの提供がありましたらTwiterもしくはましゅまろでご連絡ください。

Twitter@wataruf01
ましゅまろ:https://marshmallow-qa.com/wataruf01



今回は以上です。