Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

#PowerAutomate #LogicApp で動的なプロパティ名を持つ JSON を扱う方法

More than 1 year has passed since last update.

Microsoft Graph API で Planner のタスクに含まれるチェックリストの情報が取得できます。

しかし…取得した JSON が非常に扱いづらかった!
そんなことを悲観してたら、フォロワーの皆様からご助言を頂いて扱いやすい形まで加工できたので、その知見を共有したいと思います。

事の始めはこのツイートから

Planner task detail の checklist を確認する

下記のタスクを Microsoft Graph エクスプローラーから取得します。

GET https://graph.microsoft.com/v1.0/planner/tasks/{task-id}/details

image.png


{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#planner/tasks('iiZ7Fq6FFkqIXS6i8bR6IvoAG6Ic')/details/$entity",
    "@odata.etag": "W/\"JzEtVGFza0RldGFpbHMgQEBAQEBAQEBAQEBAQEBAYCc=\"",
    "description": "ここにメモを書きます",
    "previewType": "automatic",
    "id": "iiZ7Fq6FFkqIXS6i8bR6IvoAG6Ic",
    "references": {},
    "checklist": {
        "37396": {
            "@odata.type": "#microsoft.graph.plannerChecklistItem",
            "isChecked": true,
            "title": "チェックリスト2",
            "orderHint": "85861956244X",
            "lastModifiedDateTime": "2020-02-18T16:47:50.1702791Z",
            "lastModifiedBy": {
                "user": {
                    "displayName": null,
                    "id": "6742f833-5b42-43b4-b673-f7530e236689"
                }
            }
        },
        "60542": {
            "@odata.type": "#microsoft.graph.plannerChecklistItem",
            "isChecked": false,
            "title": "チェックリスト3",
            "orderHint": "858619562420",
            "lastModifiedDateTime": "2020-02-18T16:47:49.3421666Z",
            "lastModifiedBy": {
                "user": {
                    "displayName": null,
                    "id": "6742f833-5b42-43b4-b673-f7530e236689"
                }
            }
        },
        "66123": {
            "@odata.type": "#microsoft.graph.plannerChecklistItem",
            "isChecked": false,
            "title": "チェックリスト1",
            "orderHint": "8586195624826666382Pw",
            "lastModifiedDateTime": "2020-02-18T16:47:42.9828025Z",
            "lastModifiedBy": {
                "user": {
                    "displayName": null,
                    "id": "6742f833-5b42-43b4-b673-f7530e236689"
                }
            }
        }
    }
}

Planner task detail の checklist が扱いづらい点

  • checklist が動的なプロパティ名(*)を持つオブジェクトであること
  • checklist が配列ではなくオブジェクトであること

(*) 上記の例でいうと "37396", "60542", "66123" の部分を指します

{
  "37396": { //省略 },
  "60542": { //省略 },
  "66123": { //省略 }
}

Planner task detail の checklist を扱いやすくするためには

  • checklist を配列にする
  • プロパティ名を固定にする(例として下記のような形式)

checklist の JSON を下記のように加工できれば扱いやすいデータと言えます
このデータに加工するための手順は次の通りです

[
  { "id": "37396", "value": { //省略 } },
  { "id": "60542", "value": { //省略 } },
  { "id": "66123", "value": { //省略 } }
]

checklist の加工手順

  1. ckecklist をプロパティ値に持つオブジェクトに加工します(プロパティ名は "root")

json
{
  "root": {
    "37396": { //省略 },
    "60542": { //省略 },
    "66123": { //省略 }
  }
}

 2. json 形式を xml 形式に変換します(要素名の先頭が数字の場合、Unicode16進数にエンコードされます)

xml
<root>
  <_x0033_7396><省略></_x0033_7396>
  <_x0036_0542><省略></_x0036_0542>
  <_x0036_6123><省略></_x0036_6123>
</root>

 3. root 要素の子要素の名前を抽出します(ここで配列に変換されます)

json
[
  "_x0033_7396",
  "_x0036_0542",
  "_x0036_6123"
]

 4. 各項目を文字列操作して、xml タグっぽく加工します

json
[
  "<_x0033_7396></_x0033_7396>",
  "<_x0036_0542></_x0036_0542>",
  "<_x0036_6123></_x0036_6123>"
]

 5. コレクション関数 join を使って文字列操作して、親要素に <root> を持つ xml に加工します

xml
<root>
  <_x0033_7396></_x0033_7396>
  <_x0036_0542></_x0036_0542>
  <_x0036_6123></_x0036_6123>
</root>

 6. 手順2とは逆で、xml 形式を json 形式に変換して、root の値を取得します(Unicode16進数がデコードされます)

json
{
  "37396": "",
  "60542": "",
  "66123": ""
}

以上の手順を踏んで、動的プロパティの値を空文字にすることができたので、残りは愚直に文字列操作して動的プロパティの配列を取得します

 7. 先頭と末尾の括弧を削除して、カンマ区切りで split して、末尾の : "" を削除します

json
[
  "37396",
  "60542",
  "66123"
]

 8. ckecklist のプロパティ名が取得できたので、ckecklist オブジェクトに対して、プロパティ名を指定して値を取得します
  選択アクションを使って加工します

id value
item() outputs('作成')?['checklist']?[item()]

image.png

 9. 最終結果がこちら

[
  {
    "id": "37396",
    "value": {
      "isChecked": true,
      "title": "チェックリスト2",
      "orderHint": "85861956244X",
      "lastModifiedDateTime": "2020-02-18T16:47:50.1702791Z",
      "lastModifiedBy": {
        "user": {
          "displayName": null,
          "id": "6742f833-5b42-43b4-b673-f7530e236689"
        }
      },
      "@odata.type": "#microsoft.graph.plannerChecklistItem"
    }
  },
  {
    "id": "60542",
    "value": {
      "isChecked": false,
      "title": "チェックリスト3",
      "orderHint": "858619562420",
      "lastModifiedDateTime": "2020-02-18T16:47:49.3421666Z",
      "lastModifiedBy": {
        "user": {
          "displayName": null,
          "id": "6742f833-5b42-43b4-b673-f7530e236689"
        }
      },
      "@odata.type": "#microsoft.graph.plannerChecklistItem"
    }
  },
  {
    "id": "66123",
    "value": {
      "isChecked": false,
      "title": "チェックリスト1",
      "orderHint": "8586195624826666382Pw",
      "lastModifiedDateTime": "2020-02-18T16:47:42.9828025Z",
      "lastModifiedBy": {
        "user": {
          "displayName": null,
          "id": "6742f833-5b42-43b4-b673-f7530e236689"
        }
      },
      "@odata.type": "#microsoft.graph.plannerChecklistItem"
    }
  }
]

PowerAutomate フロー詳細

image.png

最後に

今回の検証のキッカケと様々なアドバイスを頂きました皆様にお礼を申し上げます

やり取りした Twitter スレッドはこちらです

参考

Getting JSON keys in flow
Power Automateでの"LookUp"
#PowerAutomate の"LookUp" 番外編 (compose json dictionary)
https://github.com/ahf0124/LogicFlow-ja/tree/master/EnumJsonKeys

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away