Power Automate & Microsoft Listsでメール下書き作成ツールを作る

# はじめに
Power Automateの`Office 365 Outlook`、大変便利で重宝するシーンが多いです。
しかしながら、**メールの下書きを作成する** というアクションが存在しません。

https://learn.microsoft.com/ja-jp/connectors/office365/

:::note warn
2024.03.10時点の情報です
:::

Google Workspaceで`Google Apps Script`を活用したことがある場合、なおのことそう思うシーンはないでしょうか？

```javascript:sample.gs
function CreateDraft() {
  let recipient = "aaa@gmail.com";
  let subject = "テストです";
  let body = "ここは本文です";
  let options = {
    cc: "cc@gmail.com",
    bcc: "bcc@gmail.com"
  };
  // ここでメール下書き作成
  GmailApp.createDraft(recipient, subject, body, options);
}
```

`メールの自動送信`は**非常に便利ですが、設定を誤ると事故につながる場合も。**

そんなときに、SNSで尊敬している[ささみさん](https://twitter.com/sasami_axis)が[下記のブログ](https://sasami-axis.hatenablog.com/entry/2024/01/28/195401)を掲載されていました。

https://twitter.com/sasami_axis

https://sasami-axis.hatenablog.com/entry/2024/01/28/195401

上記を活用し、**Microsoft Lists (SharePoint Listsで代替可能）とPower Automateで、Outlookの下書きを複数設定し、気軽に送信できるツール**を作りたいと思います！

# Microsoft Lists
Microsoft ListsとSharePoint Listsについて、よくごっちゃになって語られることがありますが、実態としては別物です。

- Microsoft Listsは、Microsoft 365の製品群の中でも独立したアプリケーション
- SharePoint Listsは、SharePoint内に統合されたカスタマイズオプションを持つ機能

https://techcommunity.microsoft.com/t5/microsoft-sharepoint-blog/microsoft-lists-evolving-the-value-of-sharepoint-lists-and/ba-p/1400714

`Lists`を開くと、上記すべてのリストが表示されるので、同一のものでは🧐？という印象を受けますが、`厳密には違うのよ`くらいに捉えてください。

にわかなので深堀はやめておきます。

メールの下書きツールは、自分のアカウントに紐づく関係ことから、マイリストを使った運用を想定しています。

# 実現する機能
Listsの`列の書式設定`を一工夫し、**選択した行の`Subject`、`Body`、`To`、`Cc`、`Bcc`からメールの下書きを自動作成する**ツールを作成します。

イメージはこちら

![マイビデオ.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/07ccb1c3-4ab7-dc81-e429-a886b1e9b78a.gif)

**ボタンをクリックすると、Outlookでメールの下書きが作られるツール**です。
テンプレートの増減にも対応できるところがNice👍

## 列の書式設定
Listsの`列の書式設定`に一工夫加えることで、列にボタンを設定し、Power Automateを実行することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/74f58eb3-fd60-75bd-084f-05e663c72755.png)

右側にパネルが表示されるので、JSONを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/bc2b8df8-7329-f765-4e09-1379a6161945.png)

設定するJSONはコチラ！

```json:列の書式設定.json
{
  "$schema": "https://developer.microsoft.com/json-schemas/sp/v2/column-formatting.schema.json",
  "elmType": "button",
  "customRowAction": {
    "action": "executeFlow",
    "actionParams": "{\"id\": \"ここにGUIDを設定してください\"}"
  },
  "attributes": {
    "class": "ms-fontColor-themePrimary ms-fontColor-themeDarker--hover"
  },
  "style": {
    "border": "none",
    "background-color": "transparent",
    "cursor": "pointer"
  },
  "children": [
    {
      "elmType": "span",
      "attributes": {
        "iconName": "Fluent UIのアイコンを設定する場所はこちら"
      },
      "style": {
        "padding-right": "6px"
      }
    },
    {
      "elmType": "span",
      "txtContent": "文字列の設定場所"
    }
  ]
}
```

非常にCool。
列の書式設定のサンプルは、`Microsoft 365 & Power Platform Community`の[GitHub](https://pnp.github.io/List-Formatting/)を参考にしました。
最高にCoolなサンプルが盛りだくさんで、リポジトリを見ているだけで、時間が溶けます。

https://pnp.github.io/List-Formatting/

https://github.com/pnp/list-formatting/tree/master/column-samples/generic-start-flow

内蔵するIconは、[Fluent UI](https://developer.microsoft.com/en-us/fluentui#/styles/web/icons
)から見つけることができます。

https://developer.microsoft.com/en-us/fluentui#/styles/web/icons

:::note info
映えます。
:::

`JSON`のうち、
```json
  "customRowAction": {
    "action": "executeFlow",
    "actionParams": "{\"id\": \"ここにGUIDを設定してください\"}"
  }
```
上記の箇所に`GUID`を設定します。
GUIDは、Power Automate フローのURL `/flows/`以降の箇所の文字列が該当します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/5dc40548-8e71-e704-9c4c-10a73a6c359a.png)

:::note info
こちらで設定したJSONから、Power Automateから`選択したアイテムの場合`トリガーが発火されます。
:::

# Power Automateフロー
詳しい情報は[ささみさん](https://twitter.com/sasami_axis)の[ブログ](https://sasami-axis.hatenablog.com/entry/2024/01/28/195401)をみてください。

https://twitter.com/sasami_axis

https://sasami-axis.hatenablog.com/entry/2024/01/28/195401

上記を参考に、`選択した行の情報からメールの下書きを作成する`フローを作成します。

:::note warn
固定メール📨で添付ファイルを使いまわすシーンが思いつかない（そういう業務は見直しません？）ということで添付ファイルは、この記事では触れません。
:::

## フロー 詳細

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/2e4ae4aa-2f82-8a92-c69b-46440141c709.png)

:::note warn
フロー完了後の画面にしているのは、なんとなく`manual`って表示されるモダンの画面だと伝わりにくいな・・・という偏見からです
:::

1. [トリガー] 選択したアイテムの場合
1. [アクション] 項目の取得 - Listsの行の値を取得
1. [アクション] 選択 - 行の値から、`To`のオブジェクトを作成
1. [アクション] 選択 - 行の値から、`Cc`のオブジェクトを作成
1. [アクション] 選択 - 行の値から、`Bcc`のオブジェクトを作成
1. [アクション] 作成 - JSONの作成
1. [アクション] HTTP 要求を送信

作るものは`Outlook 365コネクタ`で送信する`HTTP 要求を送信`アクションのBodyです。
ここを`データ操作`で加工することがポイントになります。

Listsの設定は下記の通り

|名前|種類|コメント
|---|---|---
|Flow|1行テキスト|Power Automate起動用でBlank想定
|Subject|1行テキスト|メールのタイトル、必須列に設定
|Body|複数行テキスト|メール本文、**リッチテキストではない仕様**
|To|ユーザーまたはグループ|複数選択を許可
|Cc|ユーザーまたはグループ|複数選択を許可
|Bcc|ユーザーまたはグループ|複数選択を許可

`To`、`Cc`、`Bcc`列が`複数選択を許可`されていることから、`項目の取得`アクションの戻り値が`配列(Array)`になります。ここを`選択`アクションでマッピングします。

## 選択 アクション - ほぼ共通
手っ取り早く、中身を紹介します。
`To`、`Cc`、`Bcc`列ほとんど共通です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/93a16b9a-5cd4-7dc6-d9cc-83d54fdc3d73.png)

```json:コードビュー
{
  "type": "Select",
  "description": "toRecipientsの設定",
  "inputs": {
    "from": "@body('項目の取得')?['Person']",
    "select": {
      "emailAddress": {
        "name": "@item()?['DisplayName']",
        "address": "@item()?['Email']"
      }
    }
  },
  "runAfter": {
    "項目の取得": [
      "Succeeded"
    ]
  }
}
```

配列の戻り値が設定される`To`、`Cc`、`Bcc`を`From`に設定し、上記の形でマッピングします。

## 作成
`選択`を繰り返したあと、HTTP要求のボディを作成します。
`To`や`Cc`、`Bcc`の配列は、**空配列でもHTTP要求の成否に影響しません。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/2fc5541a-c42c-04ca-521a-71bb4a1ce68d.png)

```json:コードビュー
{
  "type": "Compose",
  "inputs": {
    "subject": "@{body('項目の取得')?['Title']}",
    "body": {
      "contentType": "Text",
      "content": "@{body('項目の取得')?['Body']}"
    },
    "toRecipients": "@body('選択_toRecipients')",
    "ccRecipients": "@body('選択_ccRecipients')",
    "bccRecipients": "@body('選択_bccRecipients')"
  },
  "runAfter": {
    "選択_bccRecipients": [
      "Succeeded"
    ]
  }
}
```

## HTTP 要求の送信でおわり
あとは、ブログを参考にHTTP要求を設定しておしまいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/a5c7a05e-3d1d-5931-07ea-61da5c74ecfc.png)

```json:コードビュー
{
  "type": "OpenApiConnection",
  "inputs": {
    "parameters": {
      "Uri": "https://graph.microsoft.com/v1.0/me/messages",
      "Method": "POST",
      "Body": "@outputs('作成_メールJSON')",
      "ContentType": "application/json"
    },
    "host": {
      "apiId": "/providers/Microsoft.PowerApps/apis/shared_office365",
      "connection": "shared_office365",
      "operationId": "HttpRequest"
    }
  },
  "runAfter": {
    "作成_メールJSON": [
      "Succeeded"
    ]
  }
}
```

# おわりに
非常にお手軽ですね。
何かと似たようなメールを送信するシーンはあるので、活用してぼたんぽちー！で終わらせたいものです。