条件に合致したメールの送信や添付ファイルの選択をPower Automateで実施してみた

# はじめに
昨日、[Power AutomateとExcelを使って共有可能な一括メール送信機能を作成する](https://qiita.com/DEmodoriGatsuO/items/d0461336470513efd90a)記事について SNS上でありがたい声を複数いただきました。

https://qiita.com/DEmodoriGatsuO/items/d0461336470513efd90a

本当に嬉しいです。「あるある」な運用のようですね。

感想の中で`添付ファイル`の取り扱いを工夫したいというお声も頂戴しました。
具体的には「*SharePoint*や*OneDrive*から、`条件に合致するファイルのみ抽出して送信する`といったシーンに使えると嬉しい！」というお声です。

それでは`部署別に添付ファイルを選定して、メールを送信する`というテーマを今回は選び、*Power Automate*による実現方法を模索していきたいと思います。

[Power AutomateとExcelを使って共有可能な一括メール送信機能を作成する](https://qiita.com/DEmodoriGatsuO/items/d0461336470513efd90a)記事のフローを応用して進めていきましょう。

# 特定の条件に応じたメール送信
今回のテーマは`部署別`のメール送信です。

まず昨日の *Excel* データを少し加工します。`部署(Department)列(G列)`を追加します。
部署は*3*つです。
1. *Dev*
1. *Corporate*
1. *Sales*

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/7170d9b6-c363-e758-eda0-b6be9339011f.png)

部署が3つあるので、送信されるメールも3通に絞ります。
各従業員に`部署`の値があるため、`重複の削除`が必要です。

*Power Automate* でも手法はいくつかありますが、今回は下記のアプローチで進めます。

1. [選択](https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-select-action) - 部署の列を抽出
2. [作成](https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-compose-action) - [Union 関数](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#union) 重複を削除し、一意の値に絞り込む
3. `重複を削除した 3 つの部署`に対して、その部署に所属する人たちへメールを送信

:::note info
今回ご紹介する[選択](https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-select-action)と[Union 関数](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#union)重複削除のフローは若干難しい部分があるかもしれません。

しかし「こういう手法で重複を削除するんだな」と目で見ていただければ幸いです。
:::

:::note info
こういったものも書いています🐟✨
:::

https://qiita.com/DEmodoriGatsuO/items/f3416e181475d6dbc508

## フローの手順
1. *Excel* を昨日と同じ手法で取得
1. [選択](https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-select-action) - 取得した *Excel* の表データから、`部署`の列だけ抽出 
1. (2)の結果を [Union 関数](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#union) で重複を削除
1. (1)で取得した *Excel* の値を、(3)で重複削除した値にてフィルターしてメールを送信する
    1. [アレイのフィルター処理](https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-filter-array-action)
    1. *4-1*の配列を、一次元配列に変換
    1. *4-2*の配列を、データ操作アクションの [結合(Join)](https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-join-action)アクションを使って、セミコロン`;`で結合
    1. [結合(Join)](https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-join-action)した文字列でメールを送信

### 1. *Excel* を昨日と同じ手法で取得
[先日記載したブログ](https://qiita.com/DEmodoriGatsuO/items/d0461336470513efd90a
)と同じ内容です。
*Excel*のアクションで値を取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/af935d26-ba89-c74f-5a57-60ee32b65288.png)

### 2. [選択](https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-select-action) - 取得した *Excel* の表データから、`部署`の列だけ抽出 
表データのうち、`部署`の列の重複を削除するため、[選択](https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-select-action)アクションで列を絞り込みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/b4944ef4-0a52-212d-13a8-a3017ac2737f.png)
- `From` - `outputs('表内に存在する行を一覧表示')?['body/value']`

```json:Map
{
  "Department": @{item()?['Department']}
}
```

### 3. (2)の結果を [Union 関数](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#union) で重複を削除
選択で取得した値を`和集合`の作成というアプローチで重複を削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/e02c8abb-61d7-a691-5bdb-88dd2f1560cb.png)

- `union(body('選択'),body('選択'))`
- [Union 関数](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#union) は、1つの集合ともう1つの集合（別の集合）を合算・結合する関数のため、**両方の集合に属する一意の値のみが返されます**

### 4. (3)の結果で繰り返し処理
#### 4-1. アレイのフィルター処理
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/2ee66a41-b93e-2912-8949-97b14ab91f64.png)
- `From` - `outputs('表内に存在する行を一覧表示')?['body/value']`
- `Filter Query` `item()?['Department']` is equal to `items('For_each')?['Department']`

```plaintext:詳細モード
@equals(@{item()?['Department']},@{items('For_each')?['Department']})
```

重複を削除した配列から、*Excel*のデータのフィルターを改めて実施します。

#### 4-2. `選択`アクションで*4-2*の配列を、一次元配列に変換
`JSON配列入力`から`結合のため、`一次元配列に変換します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/8b4a3976-64b1-810b-e7c2-ea29b2264c3d.png)

- `From` - `body('アレイのフィルター処理')`

```json:Map
item()?['MailAddress']
```

#### 4-3. データ操作アクションの [結合(Join)](https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-join-action)アクションを使って、セミコロン`;`で結合
文字通り配列の値を`;`で結合します。これにより部門別にメールが送信できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/50975eb2-4c1e-99cd-d7a2-4eb60415ad11.png)

- `From` - `body('選択_一次元配列に変換')`

```plaintext:Join With
;
```
#### 4-4. [結合(Join)](https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-join-action)した文字列でメールを送信

`宛先`は`body('結合')` 結合の結果を使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/f982a319-0b75-5014-95a3-c5a30a3873b8.png)

このアプローチで部署毎にまとめてメールを送ることができました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/19f84127-14a9-4fb8-51fa-11fcf3db97d5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/3cb795ce-a376-9887-8ee6-969e33e46712.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/7126ea31-fde9-4ffc-2ef4-eaab02039b14.png)

:::note info
慣れないうちは「こういうやり方でやるんだな」程度で見ていただければ十分です。
*Excel* を使う場合は、例えば *UNIQUE* 関数であらかじめ一意の値を先に絞り込むなど、他の手法もあると思います。

数ある手法の中で自分が好きなやり方を実践してみてください。
:::

:::note info
メーリングリストの活用や*Office 365 User*コネクタを活用するのもいいと思います
:::

これで`部署別にメールを送る`という課題は解決しました。
次に`添付ファイル`を見ていきましょう。

# *SharePoint*で条件に合致する対象のファイルを添付して送信する

次に`部署別に添付ファイルを送る方法`を考えてみます。

例えば下記の内容に則って送信するものと仮定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/e2afa652-464d-3b31-4787-81c338f8ea24.png)

|部門|送信するファイル|
|---|---|
|*Dev*|img.jpg、業務委託契約書ひながた.pdf|
|*Corporate*|img.webp、ワークフロー申請マニュアル.pdf、郵送ガイドライン.pdf|
|*Sales*|会社従業員ハンドブック.docx、経費申請マニュアル.pdf|

上記を送信するものとします。

この実現方法として
1. *SharePoint Lists*
1. ドキュメントライブラリ

上記の二択の活用方法を考えてみましょう。

## *1. SharePoint Lists*

*SharePoint* リストには既定で`添付ファイル列`が存在しますので、コチラを活用します。
実際に[+ 新しいアイテムを追加]ボタンを押すと、`添付ファイル`という項目があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/ef1a2742-660a-ceb3-8c90-1596c51909c1.png)

それぞれの部署ごとのアイテムを設けて、添付ファイルを追加、*Outlook* でメールに添付して送信してみるシナリオにしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/edfe4851-50b0-722c-e990-5b18c2b80c65.png)

1. 添付ファイルを格納する`配列変数`の設定
1. 部署と同じ名前で合致する項目を、[複数の項目の取得](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/guidance/working-with-get-items-and-get-files)から`フィルタークエリ`を使用して取得
    - [アレイのフィルター処理](https://learn.microsoft.com/ja-jp/power-automate/data-operations#use-the-filter-array-action) で実行するのも可能
1. 抽出した結果から`ID`を取得し、[添付ファイルを取得](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/sharepoint-connector-actions-triggers#get-attachments)アクションを実行
1. `ID`を取得してから[添付ファイルのコンテンツの取得](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/sharepoint-connector-actions-triggers#get-attachment-content)
1. (3)(4)の結果を(1)の配列に追加
1. メールで送信

以上の手順で、部署別のメール送信と添付ファイルの運用ができます。
詳細を見ていきます。

まず、*SharePoint* リストから取得した添付ファイルを格納する`配列変数`を用意します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/a22386a0-b72b-96f7-0fda-7f6fa1bf505d.png)

*Value*に`[]`から配列を設定します。

:::note info
配列は最初とっつきにくい内容かもしれませんが、「こういうやり方なんだな」程度に見ていただければと。
:::

`添付ファイル`を取得するため *SharePoint Lists*の中の行の`ID`を特定する必要があります。
今回は[複数の項目の取得](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/sharepoint-connector-actions-triggers#get-items)アクションで、`フィルタークエリ` を使用して、項目の`ID`を特定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/7376be23-bbbc-cf80-57ed-cd8b9e6ed3d7.png)

:::note warn
 - サイトのアドレス、リスト名はブラインドしています
:::

`フィルタークエリ` - `Title eq 'Dev'`
こちらでタイトル列が`Dev`という文字である項目を抽出しています。

フィルタークエリは、ざっくり言えば「抽出条件を使った特定の行の取得」というイメージです。
今回は条件の文字に合致するリストの行（レコード）を取得します。

レコードを取得した後、リストの`ID`から`添付ファイル`を取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/c7ce08d5-0f02-66a0-169b-23fecf2ae087.png)

`複数の項目の取得`アクションは、配列で値が取得されるため、単一のレコードに絞り込む必要があります。

```plaintext:ID
first(outputs('複数の項目の取得')?['body/value'])?['ID']
```

こちらで*SharePoint Lists*の行の添付ファイルを一括で取得できます。

しかし[添付ファイルの取得](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/sharepoint-connector-actions-triggers#get-attachments)アクションでは、主にリストに付帯している添付ファイルの`ID`や`名前`は取得できますが、`ファイル コンテンツ`（ファイルの内容）が取得できません。

`ファイル コンテンツ`を取得するために、[添付ファイルのコンテンツの取得](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/sharepoint-connector-actions-triggers#get-attachment-content)アクションが必要になります。
添付ファイルの数だけ繰り返す処理です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/a767c2ea-2897-062a-a2a0-079caa45fca7.png)

 - IDは前のアクションと同様に`first(outputs('複数の項目の取得')?['body/value'])?['ID']`
 - ファイル識別子は`items('For_each')?['Id']`

https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/sharepoint-connector-actions-triggers#get-attachment-content

このアクションで実際の`ファイルの中身`を取得しているとみていただければと。


そして結果を配列変数に追加します。

配列の中には
- ファイルの名前
- [添付ファイルのコンテンツの取得](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/sharepoint-connector-actions-triggers#get-attachment-content)アクションの結果

上記が必要です。


```json:Value
{
  "name": @{item()?['DisplayName']},
  "contentBytes": @{body('添付ファイルのコンテンツの取得')}
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/e74f56fa-be55-4775-3cb4-ab5a0fb4ce00.png)

繰り返し処理のあと、結果を *Outlook* で`添付ファイル`に設定することで送信が完了します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/f33ba2c0-709a-70b4-a1b7-2180d502e8d0.png)

:::note info
添付ファイルを`アレイ全体の入力`に切り替えて、配列変数を設定します
:::

これで条件に合致した結果の添付だけ送られますね。
(2)のフィルタークエリを次第で取得できる値が変わります

- *Dev*の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/d310438f-4c6a-fe1f-a7c6-82a411351bac.png)

- *Corporate*の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/ee8c0e91-51b7-c965-261b-863a4399ad5c.png)

- *Sales*の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/3e526a37-66d3-3da2-848a-4ef44daf7f81.png)

## *2. SharePoint ドキュメントライブラリ*
1. *SharePoint Lists*と同様に配列を先に用意します
1. [ファイルの取得 (プロパティのみ)](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/sharepoint-connector-actions-triggers#get-files-properties-only)を実施
    - 条件に合致するファイルをまとめて取得します
1. 上記から`ファイルの識別子`を取得し、[ファイル コンテンツの取得](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/sharepoint-connector-actions-triggers#get-file-content)アクションでファイルの内容を取得
1. (2)(3)の結果を(1)で用意した`配列変数`に追加
1. 配列変数を使って送信が完了

ほとんど*SharePoint Lists*と同じです。

[ファイルの取得 (プロパティのみ)](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/sharepoint-connector-actions-triggers#get-files-properties-only)も`フィルタークエリ`を使い、特定のファイルのみ取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/c083f4e5-90eb-4674-25e6-d3f8886c8c3f.png)

上記で`識別子`を取得したうえで、[ファイル コンテンツの取得](https://learn.microsoft.com/ja-jp/sharepoint/dev/business-apps/power-automate/sharepoint-connector-actions-triggers#get-file-content)アクションでファイルの内容を取得。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/c4f0b7e4-6ccf-1910-f9c1-76d734221891.png)

そして結果を`配列変数`に追加していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/06c4fd07-1868-2953-c46f-64f80a1559c3.png)


```json:Value
{
  "name": @{items('For_each2')?['{FilenameWithExtension}']},
  "contentBytes": @{body('ファイル_コンテンツの取得')}
}
```

**手法をひとつマスターすれば応用が利きますね！**


# Excelを使ったフローの実行手順
**ドキュメントライブラリ**バージョンでやってみます！

1. フローを手動で実行
1. 部署ごとに、部署の情報を重複を削除
1. 部署ごとに添付ファイルを取得し、(2)の結果を結合し、メールをまとめて送信
1. 送信した後に配列変数を空配列に設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/c90c4a03-ee1f-6e4f-feb3-8a76216ec508.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/5d87de9f-9346-7b7f-3450-cedd486942a8.png)


繰り返しに繰り返しを重ねる処理ですね！
**大変ですが慣れれば簡単です🐟🔥**

良い感じに部門別送信ができました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/5c5b5116-919f-ca92-d9de-6c38546b0024.png)


# 最後に
条件付きファイルの配信は意外と自分も使いそうだな、とアイディアが浮かびました！

[昨日の記事](https://qiita.com/DEmodoriGatsuO/items/d0461336470513efd90a)からアイディアにつながり嬉しい限りです！現場に即したフローのアイデアがございましたら、ぜひ考えてみたいと思います。
すべての要望にお応えできることは確約できませんが、可能な限り検討させていただきます。

今回もブログを読んでいただき、ありがとうございました。
よい*Power Life*を！