Power Automate: カレンダーのように列名が変化するExcelテーブルからの取得

# 目的
[単なる転記](https://qiita.com/baku2san/items/a669f02286bf9116a232) は出来るようになった後に躓く事になる？動的な列名の対処方法の例です。

# 実施イメージ
今日を含めた三日間のデータを取得して、Teamsに投げる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/6cb138fd-ee2b-7af7-c3bd-5fb311f47e4f.png)

# 概要
1. テーブルを取得し、動的な列名を配列に格納する<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/a7fa2124-e645-b6c1-c2b1-3ac7f28118e6.png)
1. 取得する動的な列名配列を生成<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/c580107b-ea67-b8f2-deeb-1bcd74e3f2cd.png)
1. 列名でデータを取得したら、整形して、Teamsに送付<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f4c08fca-4939-75f1-5f9e-f085bccf084e.png)


## テーブルを取得し、動的な列名を配列に格納する
ポイントは以下
- 一旦 CSV table を構築して、その結果を分解する

解析対象の比較 JSON vs CSV table
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/ed454721-9903-4a92-89a1-9310a5e02669.png)
実際のCSVの解析は以下

```powershell:ColumnNames
skip(split(first(split(outputs('Create_CSV_table')?['body'], '
')),','),2)
```

|expression|説明|
|-|-|
|split(outputs('Create_CSV_table')?['body'], '<br>')|改行で分割。行単位へ|
|first(↑)|最初の行へ|
|split(↑, ',')|カンマで分割。列単位へ|
|skip(↑, 2)|最初の二つを飛ばす。列名のみへ|

## 取得する動的な列名配列を生成
単に、今日の日付から、表示数分Loopさせて、LoopIndexを使って、列名を増やしてるだけ

```powershell:列名の書式をここで定義してる。Excelでの定義次第
formatDateTime(body('Add_to_time'), 'M/d')
```

## 列名でデータを取得したら、整形して、Teamsに送付
ポイントは
- Select を使ってデータ整形（今回は二つにしているけど、合わせて処理してもOK）
### データ取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/f853de80-cd57-e4ee-1860-fb9122b77d84.png)

```powershell:配列を使って、値を取得。
item()?[variables('ColumnNamesToGet')[0]]
```
:::note warn
警告
item()の後の"?" があることで、データがない場合に Null 扱いとなるのに注意
:::

### まずは事前にAdaptive Card のItems用にデータ整形
[Adaptive Card Designer](https://www.adaptivecards.io/designer/) を使って、Container内の表示内容を先に作っておいて、text の部分だけを置き換えていく感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/b8555f1a-6c40-3252-2698-456c83d96aaa.png)

```json:jo
[
  {
    "type": "Column",
    "items": [
      {
        "type": "TextBlock",
        "text": "@{item()[variables('ColumnNamesToGet')[0]]}",
        "spacing": "None"
      }
    ]
  },
  {
    "type": "Column",
    "items": [
      {
        "type": "TextBlock",
        "text": "@{item()[variables('ColumnNamesToGet')[1]]}",
        "spacing": "None"
      }
    ]
  },
  {
    "type": "Column",
    "items": [
      {
        "type": "TextBlock",
        "text": "@{item()[variables('ColumnNamesToGet')[2]]}",
        "spacing": "None"
      }
    ]
  },
  {
    "type": "Column",
    "items": [
      {
        "type": "TextBlock",
        "text": "@{item()[variables('ColumnNamesToGet')[3]]}",
        "spacing": "None"
      }
    ]
  }
]
```

### あとは、TeamsへのPostを作っておしまい
- Compose は、Body() 参照使うとがりがり書くのが面倒なので。Selectを放り込むと参照できるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/1153c8aa-3cd0-1686-ca46-8ac831a69c5a.png)

```json:AdaptiveCard
  {
    "type": "AdaptiveCard",
    "body": [
        {
            "type": "Container",
            "space": "none",
            "items": [
                {
                    "type": "TextBlock",
                    "text": "カレンダーテーブル",
                    "wrap": true,
                    "color": "Attention",
                    "fontType": "Default",
                    "weight": "Bolder",
                    "horizontalAlignment": "Center"
                }
            ],
            "style": "good",
            "bleed": true
        },
{
  "type": "ColumnSet",
  "columns": [
    {
      "type": "Column",
      "items": [
        {
          "type": "TextBlock",
          "text": "@{variables('ColumnNamesToGet')[0]}",
          "spacing": "None"
        }
      ]
    },
    {
      "type": "Column",
      "items": [
        {
          "type": "TextBlock",
          "text": "@{variables('ColumnNamesToGet')[1]}",
          "spacing": "None"
        }
      ]
    },
    {
      "type": "Column",
      "items": [
        {
          "type": "TextBlock",
          "text": "@{variables('ColumnNamesToGet')[2]}",
          "spacing": "None"
        }
      ]
    },
    {
      "type": "Column",
      "items": [
        {
          "type": "TextBlock",
          "text": "@{variables('ColumnNamesToGet')[3]}",
          "spacing": "None"
        }
      ]
    }
  ],
  "spacing": "None"
},
        {
            "type": "Container",
            "items":      @{outputs('Compose')}      
        }
    ],
    "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
    "msteams": {
        "width": "Full"
    },
    "version": "1.2"
}
```

# 補足
## Adaptive Cardのエラーが出たときの対処
- 生成内容を Designer の Card Payload Editor にコピペしておかしいとこを修正するのが早道<br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/c2597e68-8345-5f83-ea14-b077047c9a77.png)

# あとがき
Teams に出力するのではなく、他のExcelへ転記したりとかもできる・・
が、動的取得の場合、出力先も動的変化させると差分検知して出力先の差分反映なども必要になり面倒なので使い道はTeams通知ぐらいかも？

# keyword
How to retreive data from dynamic column names