Microsoft Graph API で Planner のタスクに含まれるチェックリストの情報が取得できます。
しかし…取得した JSON が非常に扱いづらかった!
そんなことを悲観してたら、フォロワーの皆様からご助言を頂いて扱いやすい形まで加工できたので、その知見を共有したいと思います。
事の始めはこのツイートから
MS Graph の Planner task detail の checklistitems ってむずいな。
— SP.Restaurant.js (@SpRestaurant) February 18, 2020
Array じゃないんだもん…
Power Automate でごにょごにょするときに json schema が定まらないから、どうするべかなぁhttps://t.co/RvH3yazfbJ
Planner task detail の checklist を確認する
下記のタスクを Microsoft Graph エクスプローラーから取得します。
GET https://graph.microsoft.com/v1.0/planner/tasks/{task-id}/details
{
"@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")
{
"root": {
"37396": { //省略 },
"60542": { //省略 },
"66123": { //省略 }
}
}
2. json 形式を xml 形式に変換します(要素名の先頭が数字の場合、Unicode16進数にエンコードされます)
<root>
<_x0033_7396><省略></_x0033_7396>
<_x0036_0542><省略></_x0036_0542>
<_x0036_6123><省略></_x0036_6123>
</root>
3. root 要素の子要素の名前を抽出します(ここで配列に変換されます)
[
"_x0033_7396",
"_x0036_0542",
"_x0036_6123"
]
4. 各項目を文字列操作して、xml タグっぽく加工します
[
"<_x0033_7396></_x0033_7396>",
"<_x0036_0542></_x0036_0542>",
"<_x0036_6123></_x0036_6123>"
]
5. コレクション関数 join を使って文字列操作して、親要素に <root>
を持つ xml に加工します
<root>
<_x0033_7396></_x0033_7396>
<_x0036_0542></_x0036_0542>
<_x0036_6123></_x0036_6123>
</root>
6. 手順2とは逆で、xml 形式を json 形式に変換して、root の値を取得します(Unicode16進数がデコードされます)
{
"37396": "",
"60542": "",
"66123": ""
}
以上の手順を踏んで、動的プロパティの値を空文字にすることができたので、残りは愚直に文字列操作して動的プロパティの配列を取得します
7. 先頭と末尾の括弧を削除して、カンマ区切りで split して、末尾の : ""
を削除します
[
"37396",
"60542",
"66123"
]
8. ckecklist のプロパティ名が取得できたので、ckecklist オブジェクトに対して、プロパティ名を指定して値を取得します
選択アクションを使って加工します
id | value |
---|---|
item() | outputs('作成')?['checklist']?[item()] |
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 フロー詳細
最後に
今回の検証のキッカケと様々なアドバイスを頂きました皆様にお礼を申し上げます
やり取りした Twitter スレッドはこちらです
json帰ってきてるけど気合いのsplit案件か。。 https://t.co/GdcTzXBDwt
— Hiro (@mofumofu_dance) February 18, 2020
参考
Getting JSON keys in flow
Power Automateでの"LookUp"
#PowerAutomate の"LookUp" 番外編 (compose json dictionary)
https://github.com/ahf0124/LogicFlow-ja/tree/master/EnumJsonKeys