SharePointリスト “承認の構成” をPower Automate から開始する

# はじめに
Xで投稿したこちらの内容に反響があったので、簡単にまとめておきます。
SharePoint リストで`承認の構成`をしたときに行える承認依頼を、Power Automate で開始する方法です。

https://x.com/ksgiksg/status/1928450984851722360


# 承認の構成とは
前提となるので説明しておきます。ご存じの方は飛ばしてください。

## 構成を開始する
SharePoint リストで、`自動化`>`承認の構成`を行って使うことができる機能です。
使用するには、初めに構成を行う必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/5741c2d4-315b-4017-8bf0-e59ce0c7e616.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/967c0e93-bffb-47af-91e1-932d0e182c3c.png)

有効化すると、承認を開始するためのボタンの表示された列が追加されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/6fc36bbf-9847-4318-9ed3-542f2f7ada5e.png)

:::note
**構成される列**
|列|内容|
|:---|:---|
|承認作成者|承認を開始(要求)したユーザー|
|承認者|承認者として設定されたユーザー(複数ユーザー列)|
|返信|承認に応答したユーザー(複数ユーザー列)|
|承認の状態|承認を開始するボタン。内部的には数値となっている。(後述します)|
:::

## 承認を要求する

ボタンを押して承認のタイトルや承認者・承認の種類、詳細メッセージを入力して送信します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/64eeb5bc-35a2-4abe-afdc-151104b4030c.png)


:::note warn
リストアイテムの編集権限がないユーザーは、承認を要求することができません。
※ 閲覧・投稿のみの権限では不可
:::

## 承認通知
承認通知は通常の承認と同じように承認アプリから届き、TeamsやOutlookなどで確認できます。
通常の承認との違いに、`SharePoint`のロゴがついていることや、承認元となったリストアイテムへのリンクが添付ファイルとしてついていることがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/7147b27b-6900-499f-8aeb-f27d67a3200a.png)

:::note warn
承認通知自体は確認できますが、リンクはそのリスト（アイテム）への閲覧権限がないと表示できません。
:::

## 承認の完了
完了すると、リスト側に結果が自動的に反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/3d0bf0f1-3564-4cb1-8889-f945a0f99dc5.png)

承認の状態や結果はリストから確認できます。
開始時と同じように、ボタンをクリックすると表示され、ここから承認を進めることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/a5901588-087e-4283-ad6d-ef3f318f3a8e.png)

:::note
**内部的な値**
表示上ではボタンになっていますが、内部の値を取得すると数値で取得できます。

|承認の状態|実際の値|
|:---|:---|
|未送信|0|
|要求済み|1|
|拒否済み|2|
|承認済み|3|

:::

## 承認後のアイテムの編集
承認の要求後にアイテムを編集すると、承認の状態がリセットされます。
承認した後でこっそり書き換えようとしてもできないというわけですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/49713dc2-654e-4a9c-9405-47cf8ea31625.png)

## 承認の自動化
という感じで、承認の状態とリストアイテムが密接に連携しており、使い勝手の良い機能です。
ただし、要求は手動で開始する必要があり、**「アイテムの作成と同時に承認を開始したい」「決まった承認ルート以外での承認を設定されては困る」** など、自動化への要求もあるかと想像します。

この記事ではPower Automate を使用して承認の要求を行う方法を説明します。（ようやく本題）

:::note warn
**類似の機能**
同じく自動化のメニュー、`クイック操作`から承認を開始することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/99167f6a-5d72-4b13-8b01-a0b55f80f7b0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/d3811ce9-d67d-4475-a435-eccd0227ea57.png)

しかしながら、こちらの機能も手動でクイック操作を開始する必要があること。また、特定の役職者など承認ルートを柔軟に設定できない点で同様の問題があります。
:::


## Power Automateで承認を開始する
アイテムが作成されたときをトリガーに、自動的に承認を開始するフローを作成してみました。
SharePoint のHTTPリクエストを使用しており、プレミアムコネクタなしで実行可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/0500bcf4-339f-418b-96e4-469bb3532047.png)

```plaintext:方法
POST
```


```plaintext:URI
_api/SP.Approvals.CreateItemRequest
```

```json:ボディ (連続しない承認&すべての回答が必要な場合)
{
    "creationInfo": {
        "listId": "リストを特定するためのID",
        "itemId": "リストアイテムのID",
        "url": "",
        "version": "",
        "approvers": "セミコロン区切りのuserPrincipalName",
        "title": "承認のタイトル",
        "details": "承認の詳細メッセージ",
        "awaitAll": true,
        "itemUrlType": 0,
        "markDocAsFinal": false
    }
}
```
ドキュメントが見つけられず、一部不明確なプロパティもあるのですが、わかっている範囲でボディの中身を解説します。

### listId
`listId`はリストを特定するための内部的なIDです。
リストの設定画面のURLなどから確認可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/83439a52-3d9a-4d25-9aff-f4a7b1277ac2.png)

私は、トリガーで同じ値を指定しているので、参照して使用しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/459be98e-266f-492e-a734-c825956d56d6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/849974a1-4f24-4d13-b7e6-d68c2bb10dc0.png)
```powerfx:listId
trigger()?['inputs/parameters/table']
```


### itemId
`itemId`は承認を行うリストアイテムのIDです。
トリガーから動的なコンテンツを使用しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/f740232a-0f92-4e23-b63a-64374ec2bbfb.png)


### approvers
`approvers`は、承認者を設定するための項目です。
複数人設定する場合は、セミコロン`;`区切りの`userprincipalName`で設定します。
申請者の上司など、ワークフローに従って設定してください。



### title / details
`title`は承認のタイトルです。リストアイテムのタイトルと一致させる必要はありません。
`details`は承認のメッセージですね。書式設定が必要な場合は、Markdownを使用します。こちらもリストアイテムと合わせる必要はありませんが、もしリストアイテムへの閲覧権限がない場合は、しっかり詳細を記載してあげる必要があるかと思います。

https://learn.microsoft.com/ja-jp/power-automate/approvals-markdown-support

### awaitAll
`awaitAll`は承認の種類を表すプロパティです。
そもそもこのキーがない場合は「連続した承認」、`true`にすると「連続した承認ではなく、かつすべての承認者からの回答が必要」、`false`にすると「連続した承認ではなく、かつすべての承認者からの回答は必要ない」ということになります。

## Power Automateで承認結果を確認する
このリクエストの実行は、あくまでも承認を開始するのみとなり、このアクションでは承認結果を取得することができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/99b9ff98-e6ff-48df-8aca-da0db69e992d.png)

ただし、承認の状態はDataverseの`Approval`テーブル等に保存されるため、SharePoint以外の通常の承認と同様に扱うことができます。

`承認を待機`アクションを使用することで、結果を待機して取得することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/5cc4d899-9043-4ed9-bd64-522c436a1a32.png)

```powerfx:承認 ID
body('SharePoint_に_HTTP_要求を送信します')?['d/CreateItemRequest']
```

## 注意点
承認を要求するユーザーは、フローでのアクションの実行した接続に依存するようです。
リストアイテムの作成者にはできないようなので、フローの実行者を工夫する・承認ルートにアイテムの作成者を含めるなどで対応する必要があるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/aa432e5b-e96b-4b62-adac-ace7071477e2.png)

どうしても要求元を申請者本人にしたい場合は、インスタントトリガーを使用して、「実行専用のユーザー」の接続を使用することでも可能かと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2572227/5609622d-b3d9-4e7c-a131-81dcfc04a2b3.png)

ただし、アイテムの作成と同時に…とはいかなくなるので、
- `クイックステップ`からフローを実行させる
- [リストの書式設定](https://learn.microsoft.com/ja-jp/sharepoint/dev/declarative-customization/formatting-advanced#create-a-button-to-launch-a-flow)でフローの起動ボタンを用意する
- Power Apps からアイテムの作成と同時に起動させる
などのトリガーの工夫が必要です。

# おわりに
個人的には先に説明のトリガーの問題で、自分のやりたいことにはマッチしなかったのですが、要望があったので記事にまとめておきました。

承認の構成自体はとてもいい機能だと思うので、バランスを意識してうまく使ってもらえると幸いです。