Power Automateの新機能「連続した承認 Sequential」を試す

# 連続した承認(Sequential) を試す

本日、Power Apps界隈では神的存在の[Reza Dorrani](https://x.com/rezadorrani)から、かなりテンションが高まる[Power Automateの新機能](https://www.youtube.com/watch?v=zSAyf3WUNdA)が紹介されていました。
今回は、この機能を以前記事で紹介した[動的承認ワークフロー](https://qiita.com/DEmodoriGatsuO/items/56c3324dae17a961e891)の機能と組み合わせてテストしてみたいと思います！

https://www.youtube.com/watch?v=zSAyf3WUNdA

https://qiita.com/DEmodoriGatsuO/items/56c3324dae17a961e891

# [承認](https://learn.microsoft.com/ja-jp/connectors/approvals/)
`Power Automate`経由で[開始して承認を待機](https://learn.microsoft.com/ja-jp/connectors/approvals/#%E9%96%8B%E5%A7%8B%E3%81%97%E3%81%A6%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E6%89%BF%E8%AA%8D%E3%82%92%E5%BE%85%E6%A9%9F)の`承認の種類`に、`連続した承認(Sequential)`が追加されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/96be055d-5c9f-588e-3830-9c205543f454.png)

これにより、複数名の`担当者`を設定して、一度の`開始して承認を待機`するアクションで複数名の回答を待つことができます。

## 界隈の凄い人はキャッチは凄く速い
[Reza Dorrani](https://x.com/rezadorrani)氏しかり、尊敬する[Matthew Devaney](https://www.linkedin.com/posts/matthew-devaney_powerautomate-activity-7208491402861703170-s1VL?utm_source=share&utm_medium=member_desktop)氏しかり、[コルネ](https://koruneko.hatenablog.com/entry/2024/06/18/085328)氏しかり、検証が速すぎ・・・。
すでに豊富に記事が豊富にあるので、私が書くのもおこがましいですが、自分なりの観点で感想を書いていきますね。

https://www.linkedin.com/posts/matthew-devaney_powerautomate-activity-7208491402861703170-s1VL?utm_source=share&utm_medium=member_desktop

https://koruneko.hatenablog.com/entry/2024/06/18/085328

## `開始して承認を待機する`の中身を見てみる
`承認`の結果は、`Teams`、`Outlook`どちらでも確認ができ、回答は同期されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/b1f56cc3-e0c5-b7e7-92c9-b2543235bada.png)

多段階承認の様子はこのようなイメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/4971a160-8a5e-fb1a-4538-ae070a7c9fb6.png)

各担当者のコメントを見ることができますね。

回答は`response`へ良い感じに格納されます。

```json:body
{
  "responses": [
    {
      "responder": {
        "id": "---",
        "displayName": "出戻り ガツオ",
        "email": "email",
        "tenantId": "---",
        "userPrincipalName": "email"
      },
      "requestDate": "2024-06-18T11:37:59Z",
      "responseDate": "2024-06-18T11:41:35Z",
      "approverResponse": "Approve",
      "comments": "Outlookでも中身を確認できます。"
    },
    {
      "responder": {
        "id": "---",
        "displayName": "大久保　絵梨",
        "email": "SecondEmail.com",
        "tenantId": "---",
        "userPrincipalName": "SecondEmail.com"
      },
      "requestDate": "2024-06-18T11:37:59Z",
      "responseDate": "2024-06-18T11:40:33Z",
      "approverResponse": "Approve",
      "comments": "一旦承認します"
    },
    {
      "responder": {
        "id": "---",
        "displayName": "奥村　静佳",
        "email": "firstEmail.com",
        "tenantId": "---",
        "userPrincipalName": "firstEmail.com"
      },
      "requestDate": "2024-06-18T11:37:55Z",
      "responseDate": "2024-06-18T11:39:27Z",
      "approverResponse": "Approve",
      "comments": "とりあえず承認します。"
    }
  ],
  "responseSummary": "承認者: 出戻り ガツオ (email)\r\n応答: Approve\r\n依頼日: 2024年6月18日 11:37:59\r\n応答日: 2024年6月18日 11:41:35\r\n\r\n承認者: 大久保　絵梨 (SecondEmail.com)\r\n応答: Approve\r\n依頼日: 2024年6月18日 11:37:59\r\n応答日: 2024年6月18日 11:40:33\r\n\r\n承認者: 奥村　静佳 (firstEmail.com)\r\n応答: Approve\r\n依頼日: 2024年6月18日 11:37:55\r\n応答日: 2024年6月18日 11:39:27",
  "completionDate": "2024-06-18T11:41:36Z",
  "outcome": "Approve, Approve, Approve",
  "name": "---",
  "title": "連続した承認(Sequential)の初回テスト - 新規ウェブサイト開発プロジェクト",
  "details": "## プロジェクト名\n新規ウェブサイト開発プロジェクト\n\n## 内容\n新しいウェブサイトの開発プロジェクトの発注の承認をお願いします。\n\n|項目|詳細|\n|---|---|\n|目的|現在のウェブサイトの刷新|\n|スコープ|デザインリニューアル、UI改善|\n|スケジュール|2024年7月1日～12月31日|\n|予算|¥10,000,000|\n|チーム|佐藤花子(PM), 鈴木一郎(デザイナー), 高橋次郎(開発者)|\n",
  "itemLink": "https://learn.microsoft.com/ja-jp/connectors/approvals/#%E9%96%8B%E5%A7%8B%E3%81%97%E3%81%A6%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E6%89%BF%E8%AA%8D%E3%82%92%E5%BE%85%E6%A9%9F",
  "itemLinkDescription": "Microsoft learn",
  "requestDate": "2024-06-18T11:37:55Z",
  "expirationDate": "9999-12-31T23:59:59Z",
  "priority": "Medium"
}

```

:::note info
マークダウンを反映すると、下記のようにテーブル形式で表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/8c32f5dc-f6e1-fbc4-b9de-b4310c0815df.png)

Teamsのサポート状況は一体どう解釈すればよいのだろう🧐

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

:::

## 動的に承認ステップを設定するために
承認ステップを覗いてみると下記のようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/b9ef6ffb-814d-86bf-bfd1-af2729857964.png)

```json:Schema
[
  {
    "assignedTo": "ひとりめのメールアドレス"
  },
  {
    "assignedTo": "ふたりめのメールアドレス"
  },
  {
    "assignedTo": "さんにんめのメールアドレス"
  }
]
```

`assignedTo`: `担当者のメールアドレス`のキーバリューの配列を設定すれば使えるということですね。

# 以前作ったアプリとコラボする
[以前の記事](https://qiita.com/DEmodoriGatsuO/items/56c3324dae17a961e891)で作成した`動的承認ワークフロー`の`Power Apps`とコラボしてみます。
今回は`SharePoint`への登録を省略する内容です。

https://qiita.com/DEmodoriGatsuO/items/56c3324dae17a961e891

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/e2012e6e-274a-a97d-41df-0477c466ae7a.png)

```javascript:OnSelect
// 1. JSON配列入力を設定
ClearCollect(
    colWorkflow,
    ForAll(
        galRoot.AllItems,
        {
            Step: Value(badgeIndex.Content),
            Claims: cmbPerson.Selected.Email,
            Name: cmbPerson.Selected.DisplayName
        }
    );
);

// 2. Power Automateの実行 
SequentialWF.Run(
    {
        contentBytes: First(valueAttachment.Attachments).Value,
        name: First(valueAttachment.Attachments).Name
    },
    JSON(
        {
            Title: valueTitle.Value,
            Details: valueDetails.Value
        }
    ),
    JSON(colWorkflow)
);

// 3. 通知
Notify(
    "承認ワークフローを実行しました。",
    NotificationType.Information
);
```

## Power Automate
1. Power Appsから受け取ったJSONを加工し
1. 承認コネクタに渡す

ざっくりと二段階のステップで進めます。

(1) Power Appsから受け取る値

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/2d6acfc1-896c-8481-e416-2cfe0cae51cd.png)

- `ファイル コンテンツ`
- `タイトル`と`詳細`の文字列
- `動的なワークフローの経路`のJSON文字列

上記の三点。

コチラはシンプルに

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/cfc96cb3-fc14-8638-65e9-64481bd4381b.png)

```json:タイトルと詳細の文字列のスキーマ
{
  "type": "object",
  "properties": {
    "Details": {
      "type": "string"
    },
    "Title": {
      "type": "string"
    }
  }
}
```

コチラは`テーブル`にしたり、申請経路の大本になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/f83523f7-edac-eb7a-0e8b-dfadb4f21624.png)

```json:動的なワークフローの経路のJSON文字列
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "Claims": {
        "type": "string"
      },
      "Name": {
        "type": "string"
      },
      "Step": {
        "type": "integer"
      }
    },
    "required": [
      "Claims",
      "Name",
      "Step"
    ]
  }
}
```

`選択`と`結合`でマークダウンの表に加工

ご参考までに！

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

**■ 選択**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/5cad0590-90d7-6b15-5458-17ca2ea7db4a.png)

```plaintext:From
@{body('ワークフローの申請経路')}
```

```plaintext:Map
@{concat('|',item()['Step'],'|',item()['Name'],'|')}
```

**■ 結合**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/08fff479-1748-71bd-49a8-960287d8b29c.png)

```plaintext:From
@{body('選択')}
```

```plaintext:Map


```

■ デモ用にファイルをアップロード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/e0452132-b964-009d-95ea-6ab9b8056d5f.png)

ファイルをアップロードして、承認用に`アイテムのリンク`を`ファイルのプロパティの取得`で取得

**■ 承認コネクタの詳細用のMarkdown文字列の作成**

コチラで加工した文字列をマージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/0c3934b2-7f51-0eba-28f1-23c694851f27.png)

```plaintext:入力
## タイトル
@{body('ワークフローの記載事項')?['Title']}

## 詳細
@{body('ワークフローの記載事項')?['Details']}

|項目|詳細|
|---|---|
@{body('結合')}
```

### 動的承認のJSON配列入力の作成
`動的承認のJSON配列`は`選択`で加工しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/e1b7fbb2-a215-04e7-bf87-4724bbbd6891.png)

```plaintext:From
@{body('ワークフローの申請経路')}
```

```plaintext:Map
{
  "assignedTo": @{item()['Claims']}
}
```

あとは、もろもろ設定して実行してみましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/852ff2a5-8e53-a9d1-0c96-394873e2b0d5.png)

```json:コード ビュー
{
  "type": "OpenApiConnectionWebhook",
  "inputs": {
    "parameters": {
      "approvalType": "Sequential",
      "WebhookApprovalCreationInput/title": "@body('ワークフローの記載事項')?['Title']",
      "WebhookApprovalCreationInput/steps": "@body('選択_assignedTo')",
      "WebhookApprovalCreationInput/details": "@{outputs('承認コネクタ用詳細')}",
      "WebhookApprovalCreationInput/itemLink": "@{body('ファイルのプロパティの取得')?['{Link}']}",
      "WebhookApprovalCreationInput/itemLinkDescription": "@triggerBody()?['file']?['name']",
      "WebhookApprovalCreationInput/enableNotifications": true
    },
    "host": {
      "apiId": "/providers/Microsoft.PowerApps/apis/shared_approvals",
      "connection": "shared_approvals",
      "operationId": "StartAndWaitForAnApproval"
    }
  },
  "runAfter": {
    "選択_assignedTo": [
      "Succeeded"
    ]
  }
}
```

# 結果は！！！

担当者が重複していると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/69fa4aec-3abf-fa70-1fd0-0bc407a86efe.png)

怒られました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/32b30d68-d559-fb68-39aa-a2c67960bf27.png)

気を取り直して実行すると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/cd26dc26-8125-a2ea-4fef-0e23a9afc53e.png)

上手くいきましたね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/a3e60c4a-388c-2edc-2717-96c96f9eca5a.png)

■ `Outlook`で見た場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/6f031615-29a4-9ceb-0f3d-14ee68793374.png)

■ `Power Automateのモバイルアプリ`で見た場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/08f6f6df-4bda-73f0-746c-231a6e446585.png)

結果は`Dataverse`の`承認`テーブルに格納されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/5644cc8d-2826-a611-f5af-0545ddf72797.png)

こちらにストックされていくんですね。ほー。