はじめに
昨日、Power AutomateとExcelを使って共有可能な一括メール送信機能を作成する記事について SNS上でありがたい声を複数いただきました。
本当に嬉しいです。「あるある」な運用のようですね。
感想の中で添付ファイル
の取り扱いを工夫したいというお声も頂戴しました。
具体的には「SharePointやOneDriveから、条件に合致するファイルのみ抽出して送信する
といったシーンに使えると嬉しい!」というお声です。
それでは部署別に添付ファイルを選定して、メールを送信する
というテーマを今回は選び、Power Automateによる実現方法を模索していきたいと思います。
Power AutomateとExcelを使って共有可能な一括メール送信機能を作成する記事のフローを応用して進めていきましょう。
特定の条件に応じたメール送信
今回のテーマは部署別
のメール送信です。
まず昨日の Excel データを少し加工します。部署(Department)列(G列)
を追加します。
部署は3つです。
- Dev
- Corporate
- Sales
部署が3つあるので、送信されるメールも3通に絞ります。
各従業員に部署
の値があるため、重複の削除
が必要です。
Power Automate でも手法はいくつかありますが、今回は下記のアプローチで進めます。
こういったものも書いています🐟✨
フローの手順
- Excel を昨日と同じ手法で取得
-
選択 - 取得した Excel の表データから、
部署
の列だけ抽出 - (2)の結果を Union 関数 で重複を削除
- (1)で取得した Excel の値を、(3)で重複削除した値にてフィルターしてメールを送信する
- アレイのフィルター処理
- 4-1の配列を、一次元配列に変換
-
4-2の配列を、データ操作アクションの 結合(Join)アクションを使って、セミコロン
;
で結合 - 結合(Join)した文字列でメールを送信
1. Excel を昨日と同じ手法で取得
先日記載したブログと同じ内容です。
Excelのアクションで値を取得します。
2. 選択 - 取得した Excel の表データから、部署
の列だけ抽出
表データのうち、部署
の列の重複を削除するため、選択アクションで列を絞り込みます。
-
From
-outputs('表内に存在する行を一覧表示')?['body/value']
{
"Department": @{item()?['Department']}
}
3. (2)の結果を Union 関数 で重複を削除
選択で取得した値を和集合
の作成というアプローチで重複を削除します。
union(body('選択'),body('選択'))
- Union 関数 は、1つの集合ともう1つの集合(別の集合)を合算・結合する関数のため、両方の集合に属する一意の値のみが返されます
4. (3)の結果で繰り返し処理
4-1. アレイのフィルター処理
-
From
-outputs('表内に存在する行を一覧表示')?['body/value']
-
Filter Query
item()?['Department']
is equal toitems('For_each')?['Department']
@equals(@{item()?['Department']},@{items('For_each')?['Department']})
重複を削除した配列から、Excelのデータのフィルターを改めて実施します。
4-2. 選択
アクションで4-2の配列を、一次元配列に変換
JSON配列入力
から結合のため、
一次元配列に変換します。
-
From
-body('アレイのフィルター処理')
item()?['MailAddress']
4-3. データ操作アクションの 結合(Join)アクションを使って、セミコロン;
で結合
文字通り配列の値を;
で結合します。これにより部門別にメールが送信できます。
-
From
-body('選択_一次元配列に変換')
;
4-4. 結合(Join)した文字列でメールを送信
宛先
はbody('結合')
結合の結果を使用します。
このアプローチで部署毎にまとめてメールを送ることができました!
慣れないうちは「こういうやり方でやるんだな」程度で見ていただければ十分です。
Excel を使う場合は、例えば UNIQUE 関数であらかじめ一意の値を先に絞り込むなど、他の手法もあると思います。
数ある手法の中で自分が好きなやり方を実践してみてください。
メーリングリストの活用やOffice 365 Userコネクタを活用するのもいいと思います
これで部署別にメールを送る
という課題は解決しました。
次に添付ファイル
を見ていきましょう。
SharePointで条件に合致する対象のファイルを添付して送信する
次に部署別に添付ファイルを送る方法
を考えてみます。
例えば下記の内容に則って送信するものと仮定します。
部門 | 送信するファイル |
---|---|
Dev | img.jpg、業務委託契約書ひながた.pdf |
Corporate | img.webp、ワークフロー申請マニュアル.pdf、郵送ガイドライン.pdf |
Sales | 会社従業員ハンドブック.docx、経費申請マニュアル.pdf |
上記を送信するものとします。
この実現方法として
- SharePoint Lists
- ドキュメントライブラリ
上記の二択の活用方法を考えてみましょう。
1. SharePoint Lists
SharePoint リストには既定で添付ファイル列
が存在しますので、コチラを活用します。
実際に[+ 新しいアイテムを追加]ボタンを押すと、添付ファイル
という項目があります。
それぞれの部署ごとのアイテムを設けて、添付ファイルを追加、Outlook でメールに添付して送信してみるシナリオにしてみます。
- 添付ファイルを格納する
配列変数
の設定 - 部署と同じ名前で合致する項目を、複数の項目の取得から
フィルタークエリ
を使用して取得- アレイのフィルター処理 で実行するのも可能
- 抽出した結果から
ID
を取得し、添付ファイルを取得アクションを実行 -
ID
を取得してから添付ファイルのコンテンツの取得 - (3)(4)の結果を(1)の配列に追加
- メールで送信
以上の手順で、部署別のメール送信と添付ファイルの運用ができます。
詳細を見ていきます。
まず、SharePoint リストから取得した添付ファイルを格納する配列変数
を用意します。
Valueに[]
から配列を設定します。
配列は最初とっつきにくい内容かもしれませんが、「こういうやり方なんだな」程度に見ていただければと。
添付ファイル
を取得するため SharePoint Listsの中の行のID
を特定する必要があります。
今回は複数の項目の取得アクションで、フィルタークエリ
を使用して、項目のID
を特定しています。
- サイトのアドレス、リスト名はブラインドしています
フィルタークエリ
- Title eq 'Dev'
こちらでタイトル列がDev
という文字である項目を抽出しています。
フィルタークエリは、ざっくり言えば「抽出条件を使った特定の行の取得」というイメージです。
今回は条件の文字に合致するリストの行(レコード)を取得します。
レコードを取得した後、リストのID
から添付ファイル
を取得します。
複数の項目の取得
アクションは、配列で値が取得されるため、単一のレコードに絞り込む必要があります。
first(outputs('複数の項目の取得')?['body/value'])?['ID']
こちらでSharePoint Listsの行の添付ファイルを一括で取得できます。
しかし添付ファイルの取得アクションでは、主にリストに付帯している添付ファイルのID
や名前
は取得できますが、ファイル コンテンツ
(ファイルの内容)が取得できません。
ファイル コンテンツ
を取得するために、添付ファイルのコンテンツの取得アクションが必要になります。
添付ファイルの数だけ繰り返す処理です。
- IDは前のアクションと同様に
first(outputs('複数の項目の取得')?['body/value'])?['ID']
- ファイル識別子は
items('For_each')?['Id']
このアクションで実際のファイルの中身
を取得しているとみていただければと。
そして結果を配列変数に追加します。
配列の中には
- ファイルの名前
- 添付ファイルのコンテンツの取得アクションの結果
上記が必要です。
{
"name": @{item()?['DisplayName']},
"contentBytes": @{body('添付ファイルのコンテンツの取得')}
}
繰り返し処理のあと、結果を Outlook で添付ファイル
に設定することで送信が完了します。
添付ファイルをアレイ全体の入力
に切り替えて、配列変数を設定します
これで条件に合致した結果の添付だけ送られますね。
(2)のフィルタークエリを次第で取得できる値が変わります
2. SharePoint ドキュメントライブラリ
- SharePoint Listsと同様に配列を先に用意します
-
ファイルの取得 (プロパティのみ)を実施
- 条件に合致するファイルをまとめて取得します
- 上記から
ファイルの識別子
を取得し、ファイル コンテンツの取得アクションでファイルの内容を取得 - (2)(3)の結果を(1)で用意した
配列変数
に追加 - 配列変数を使って送信が完了
ほとんどSharePoint Listsと同じです。
ファイルの取得 (プロパティのみ)もフィルタークエリ
を使い、特定のファイルのみ取得します。
上記で識別子
を取得したうえで、ファイル コンテンツの取得アクションでファイルの内容を取得。
そして結果を配列変数
に追加していきます。
{
"name": @{items('For_each2')?['{FilenameWithExtension}']},
"contentBytes": @{body('ファイル_コンテンツの取得')}
}
手法をひとつマスターすれば応用が利きますね!
Excelを使ったフローの実行手順
ドキュメントライブラリバージョンでやってみます!
- フローを手動で実行
- 部署ごとに、部署の情報を重複を削除
- 部署ごとに添付ファイルを取得し、(2)の結果を結合し、メールをまとめて送信
- 送信した後に配列変数を空配列に設定
繰り返しに繰り返しを重ねる処理ですね!
大変ですが慣れれば簡単です🐟🔥
良い感じに部門別送信ができました!
最後に
条件付きファイルの配信は意外と自分も使いそうだな、とアイディアが浮かびました!
昨日の記事からアイディアにつながり嬉しい限りです!現場に即したフローのアイデアがございましたら、ぜひ考えてみたいと思います。
すべての要望にお応えできることは確約できませんが、可能な限り検討させていただきます。
今回もブログを読んでいただき、ありがとうございました。
よいPower Lifeを!