SharePoint Listsを連絡帳のように使い、特定の対象に送信するメールを作成してみる

# Outlookの連絡先リスト

Outlookに[連絡先リスト](https://support.microsoft.com/ja-jp/office/outlook-%E3%81%A7%E9%80%A3%E7%B5%A1%E5%85%88%E3%83%AA%E3%82%B9%E3%83%88%E3%81%BE%E3%81%9F%E3%81%AF%E9%80%A3%E7%B5%A1%E5%85%88%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92create-%E7%B7%A8%E9%9B%86-%E3%81%BE%E3%81%9F%E3%81%AF%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B-88ff6c60-0a1d-4b54-8c9d-9e1a71bc3023)という機能が存在します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/fad61168-fac0-c3cd-1cb6-c86d94b0fdd4.png)

Outlookのバージョンによっては、`リスト`ではなく`フォルダ`と表現されていることもあり、若干困惑します。
*Outlook (new)* においては、`連絡先リスト`と表現されているようです。

https://support.microsoft.com/ja-jp/office/outlook-%E3%81%A7%E9%80%A3%E7%B5%A1%E5%85%88%E3%83%AA%E3%82%B9%E3%83%88%E3%81%BE%E3%81%9F%E3%81%AF%E9%80%A3%E7%B5%A1%E5%85%88%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97%E3%82%92create-%E7%B7%A8%E9%9B%86-%E3%81%BE%E3%81%9F%E3%81%AF%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B-88ff6c60-0a1d-4b54-8c9d-9e1a71bc3023

**予め定義していた複数の連絡先に対し、一括でメールの作成・送信ができる便利な機能です。**
特にルーティンワークでは時短術として活用できるかもしれません。

一方で「特定のアカウントで設定した`連絡先リスト`を同じ部署の社員に共有する」となると手間が発生します。
引継ぎのタイミングで課題になるでしょう。

今回は、この`連絡先リスト`の機能を疑似的に`SharePoint Lists`で再現し、**チームで再利用できる仕組みを再現していきたいと思います。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/9aa01ea2-627f-36c9-0757-ea3df4b431b8.png)


# 用意するLists
`連絡先リスト`の機能を再現するために、二つの`SharePoint Lists`を用意します。

|リスト表示名|リスト名|概要|
|---|---|---|
|グループ|Country|グループ化するための一意のリスト|
|連絡先一覧|ContactInfo|連絡先を列挙した一覧|

それぞれ内容は下記の通りです。

**■ グループ**

| 列名     | 列のタイプ               | 詳細                                 |
|----------|--------------------------|--------------------------------------|
| Country  | 1 行テキスト             | グループ化する切り口                 |
| Flag     | ハイパーリンクまたは画像 | 国旗の画像（いらすとや）             |
| Flow     | 1 行テキスト             | Power Automate起動用の空の列         |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/e947ad19-4937-edec-1a6f-47052ce55f72.png)

**■ 連絡先一覧**

| 列名             | 列のタイプ     | 詳細                                      |
|------------------|---------------|-------------------------------------------|
| Email            | 1 行テキスト   | メールアドレス                            |
| Phone Number     | 1 行テキスト   | 電話番号                                  |
| Name             | 1 行テキスト   | 名前                                      |
| Company          | 1 行テキスト   | 会社名                                    |
| Address          | 1 行テキスト   | 住所                                      |
| Country          | 参照           | グループ化の指標、リスト `グループ` を参照 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/2d27e658-f187-1012-fdca-a47ec7fc1b22.png)

`連絡先一覧`が、Outlookの中の`連絡先`に該当します。
`連絡先リスト`として用いるフラグは参照列である`Country`です。`連絡先リスト`の`名前`に該当します。
画像のビューでは、グループ化のキーとして利用しています。

そして`グループ`と`連絡先一覧`は、`参照列`を用いて下記のようにリレーションを持っています。

```mermaid
erDiagram
    Country {
        title Country PK
        string Flag
        string Flow
    }
    ContactInfo {
        title Email PK
        string PhoneNumber
        string Name
        string Company
        string Address
        string Country FK
    }
    Country ||--o{ ContactInfo : "Country"
 ```

`参照列`を用いる利点は、グループ化の指標を他のリストで設定し、管理が統一されることです。
明示的に紐づいていることで、*Power Automate*から子リストである`連絡先一覧`の項目を取得する際に、リレーションが確立された項目として抽出する際にも役立ちます。

:::note info
連絡先一覧はダミーデータです。
合計50件、*ChatGPT*で作成しています。
:::

# 疑似連絡先リストとして活用する by *Power Automate*
前置きが長くなりましたが、ここまではあくまで準備です。
一括でメールの送信先として利用するため、*Power Automate クラウドフロー*を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/3220efb8-ac6f-518d-b191-b16ea8bc28bf.png)

流れは下記のようになります。
1. トリガー - `SharePoint` `選択したアイテムの場合`
1. `SharePoint` - 複数の項目の取得
1. `選択` - 後述のアクションのために、送信先をJSONとして加工
1. `作成` - メール本文を設定
1. `Outlook 365` - HTTP 要求を送信(下書きの作成)

シナリオとして、SharePoint Lists`グループ`において、**選択されたグループのレコードで、クラウドフローを実施、参照列で選択されたレコードに紐づく連絡先に対し、送信するメールの下書きを作成する**流れです。

## 各ステップの詳細
**1. `SharePoint` `選択したアイテムの場合`**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/42ecb965-8e61-bab3-9015-f02d83d0bdab.png)

*SharePoint Lists*は`グループ`を設定します。
送信する対象である`連絡先リスト`に位置します。

**2. `SharePoint` - [複数の項目の取得](https://learn.microsoft.com/ja-jp/connectors/sharepoint/#%E9%A0%85%E7%9B%AE%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B)**

`フィルター クエリ`を活用して、`選択したレコード`とリレーションを持つ項目のみ取得します。

https://learn.microsoft.com/ja-jp/connectors/sharepoint/#%E9%A0%85%E7%9B%AE%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/1e180b74-9279-bb4d-bd8c-1ee16b12ba1e.png)

```plaintext:フィルター クエリ
Country/Id eq @{triggerBody()?['entity']['ID']}
```

子テーブルに該当する`連絡先一覧`の参照列には、参照先のレコードの`Id`を含め複数の値を持ち、フィルタークエリに用いることができます。
`Id`は確実に一意であり、参照先と参照元で一致するため、有効に作用します。

以後は`データ操作`で、HTTP要求のために値を加工していく処理です。

**3. `選択`**
後続のHTTP要求のため、`emailAddress`に`name`、`address`を含むオブジェクトを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/4239782b-8ab9-6c0a-16b7-dce81e58bd0a.png)
 
 - From: `outputs('複数の項目の取得')?['body/value']`

```json:Map
{
  "emailAddress": {
    "name": "@{item()?['Name']}",
    "address": "@{item()?['Title']}"
  }
}
```

:::note info
こちらで、SharePoint Lists 連絡先一覧のタイトル列に指定しているな、と察する方がいらっしゃると思います。
コチラはSharePoint Listsの`連絡先一覧`とOutlookの`連絡先`を同期するような操作に活用できたりするため、このように設定しております。
:::

**4. `作成`**
~~ずぼらな性格なので~~、メールの文章を設定しています。
この設定方法は好みの問題です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/cacc5b88-e64d-e660-dadc-35e464a1deb6.png)

**5. `Outlook 365` - HTTP 要求を送信(下書きの作成)**
[Outlook 365コネクタでHTTP 要求を送信](https://learn.microsoft.com/ja-jp/connectors/office365/#http-%E8%A6%81%E6%B1%82%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B)し、**メールの下書きを作成します。**
[ささみ](https://x.com/sasami_axis)先生の[ブログ](https://sasami-axis.hatenablog.com/entry/2024/01/28/195401#Office-365-OutlookHTTP-%E8%A6%81%E6%B1%82%E3%82%92%E9%80%81%E4%BF%A1%E3%81%97%E3%81%BE%E3%81%99-%E8%BF%94%E4%BF%A1%E3%81%AE%E4%B8%8B%E6%9B%B8%E3%81%8D%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E6%9B%B4%E6%96%B0)が参考になります。

https://learn.microsoft.com/ja-jp/connectors/office365/#http-%E8%A6%81%E6%B1%82%E3%82%92%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B

https://sasami-axis.hatenablog.com/entry/2024/01/28/195401#Office-365-OutlookHTTP-%E8%A6%81%E6%B1%82%E3%82%92%E9%80%81%E4%BF%A1%E3%81%97%E3%81%BE%E3%81%99-%E8%BF%94%E4%BF%A1%E3%81%AE%E4%B8%8B%E6%9B%B8%E3%81%8D%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E6%9B%B4%E6%96%B0

この技、個人的に重宝しています。
メールを送る前になんとなく確認を挟みたい・・・なぞの心理ですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/0e44869f-0ff6-744f-d2a0-df2c9a1e8432.png)

メソッド : `POST`

```plaintext:URI
https://graph.microsoft.com/v1.0/me/messages
```

bodyの肝の部分は(3)の選択アクションです。
`toRecipients`に設定されているため、`To`に宛先が設定されますが、用途に応じて`Cc`にも`Bcc`にも設定できます。

```json:body
{
    "subject": "@{triggerBody()?['entity']['fileName']}向け 資料の送信",
    "body": {
        "contentType": "Text",
        "content": "@{outputs('作成')}"
    },
    "toRecipients": @{body('選択')}
}
```

詳しくは[ささみ先生のブログ](https://sasami-axis.hatenablog.com/entry/2024/01/28/195401#Office-365-OutlookHTTP-%E8%A6%81%E6%B1%82%E3%82%92%E9%80%81%E4%BF%A1%E3%81%97%E3%81%BE%E3%81%99-%E8%BF%94%E4%BF%A1%E3%81%AE%E4%B8%8B%E6%9B%B8%E3%81%8D%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E6%9B%B4%E6%96%B0)をご覧くださいませ。

## いざ実行

コチラを実行することによって、*SharePoint Lists*から**疑似的な連絡先リストの機能を再現できます。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/b5f98b95-fdf5-8e23-2b92-7a00f60c8b4a.png)

サクっとメールの下書きが作成できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/baf775a5-1141-22c8-eea7-8899b53f860f.png)

国旗は[いらすとや](https://www.irasutoya.com/2014/05/248.html)の作品を参照させていただいています。

https://www.irasutoya.com/2014/05/248.html

**細かいテクニックですが、業務の標準化という観点で使えるシーンがあれば嬉しいです。**

## 添付ファイルにも対応したい
> メールを作成できるのであれば添付ファイルも設定したい

こんなニーズも出てくるかと思います。
複数のグループに対して送る場合は、`Power Apps`によるテクニックがありますが、選択したグループに対してのみ**添付ファイル付きメールを作成する**シナリオの場合、少しの工夫で機能を実現できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/0cd002da-98f7-c611-cb1e-15426f884038.png)

1. [SharePoint コネクタ - 添付ファイルを取得する](https://learn.microsoft.com/ja-jp/connectors/sharepoint/#%E6%B7%BB%E4%BB%98%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B)
     - 選択した項目の`ID`から添付ファイルを取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/48f3679b-7861-d2e8-254c-b8eecf44de59.png)
1. [SharePoint コネクタ - 添付ファイルのコンテンツを取得](https://learn.microsoft.com/ja-jp/connectors/sharepoint/#%E6%B7%BB%E4%BB%98%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%82%92%E5%8F%96%E5%BE%97)
1.  `Outlook 365` - **HTTP 要求を送信(添付ファイルの追加)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/577b488b-1f12-4396-b473-b4b55bbe5c5e.png)

添付ファイルを追加するための`HTTP 要求`の詳細は下記のとおりです。

```plaintext:URI
https://graph.microsoft.com/v1.0/me/messages/@{body('HTTP_要求を送信します_下書きの作成')?['id']}/attachments
```

メソッド : `POST`

```json:本文
{
  "@odata.type": "#microsoft.graph.fileAttachment",
  "name": "@{item()?['DisplayName']}",
  "contentBytes": "@{base64(body('添付ファイルのコンテンツの取得'))}"
}
```

添付ファイル コンテンツはbinary型ですので、[base64 関数](https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#base64)を用いて変換します。

https://learn.microsoft.com/ja-jp/azure/logic-apps/workflow-definition-language-functions-reference#base64

これで準備が整いました。

# 実践

添付ファイルをレコードに設定してみましょう。

![スクリーンショット 2024-10-26 122938.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/5384408a-6e61-ee4a-db2e-6af04bfe3ac3.png)

先ほど同様にPower Automateを起動すると、じゃじゃん。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/cc912336-de1a-9445-ccea-72c0c5bc12f7.png)

**上手い具合にメールが作成できました。**
チョットした工夫で色々できそうですね。