はじめに
ごきげんよう、百合宮桜(Miyu)です。
Planner のラベル、ご存じですか?
このようにタスクにつけて、フィルタリングできるととても便利な機能です。
このラベルを Power Apps のコンボボックスに表示する方法を紹介します。
前提条件
- 取得できるのはアクセス可能なプランのラベルのみ
- ラベル名が初期値(例 ピンク)だと取得できない
概要
ラベルは、Planner コネクタの GetPlanDetails の categoryDescriptions の中に一覧があります。以下のスクリーンショットは Power Automate の「プランの詳細の取得(=GetPlanDetails)」でラベルの一覧を取得した時のものです。
これをPower Apps で取得して、テーブル型に直すとコンボボックスに表示ができます。
データの接続
データの追加をクリック、Planner を選択してアプリに接続します。
プラン Id の取得
Microsoft Learn にあるように GetPlanDetails を動かすためにはプランId が必要です。
今回はとりあえず Power Automate で Planner コネクタのグループのプランを一覧表示アクションを使って、プラン Id を取得しました。
GetPlanDetails の動作確認
以下の式をコンボボックスの Items プロパティに入れてみます。
Planner.GetPlanDetails("プランId").categoryDescriptions
取得したラベルは以下のようにレコード型です。
{category1:"Power Apps",category2:"Power BI"}
| category1 | category2 |
|---|---|
| Power Apps | Power BI |
フィールドの編集をクリックするとたくさんの列が候補に出てきます。
この状態ですと、1つのラベルしかコンボボックスのフィールドに入れられません。
下図のようにラベルの一覧をコンボボックスなどに表示するためには
テーブル型に整形しなおす必要があります。
[
{CategoryName:"Power Apps"},
{CategoryName:"Power BI"}
]
| CategoryName |
|---|
| Power Apps |
| Power BI |
テーブル型への変換
Planner のラベルは1つのプランにつき、最大25個登録できます。ただ、プランによって利用しているラベルの数は様々だと思います。よって Planner.GetPlanDetails で取得した列の名前を取得し、その列の名前の数だけ繰り返し処理で、列の値をコレクションに格納していくという処理をします。
式の全体像は以下の通りです。
With(
{
Data:
ParseJSON(
JSON(Planner.GetPlanDetails("プランId").categoryDescriptions)
)
},
ForAll(
ColumnNames(Data),
Collect(
test,
{
CategoryName:Column(Data,ThisRecord.Value)
}
)
)
)
細かく解説します。
ColumnNames 関数はレコードの列名を取得し、その列名を配列化して返してくれる関数です。
ただ指定するレコードは DynamicRecord である必要があります。
その為、ParseJSON 関数と JSON 関数を利用して、Planner.GetPlanDetails で取得したラベルを DynamicRecord に変換しています。
ParseJSON(
JSON(Planner.GetPlanDetails("プランId").categoryDescriptions)
)
このデータは列の値をコレクションに格納する際にも使うので、With 関数でまとめています。
ColumnNames 関数に話を戻します。
今回の場合はこのような形のレコードだったので、
| category1 | category2 |
|---|---|
| Power Apps | Power BI |
ColumnNames 関数の戻り値は以下のようになります。
| Value |
|---|
| category1 |
| category2 |
この配列を使って、配列のデータの数だけ繰り返し処理をするのが ForAll 関数です。
今回は Collect 関数を利用したコレクションへのデータ作成を繰り返し処理しています。
Collect(
コレクション名,
{
CategoryName:Column(Data,ThisRecord.Value)
}
)
Column 関数は指定された列の値を取得する関数です。
今回は ForAll 関数で第一引数に指定した配列の値=列名なので、ThisRecord.Value で列名が取得できます。
まとめ
業務のシステム化を行う時に以下のようなことを言われた経験のある方は多いと思います。
- データを正規化しましょう
- 横に長いExcelファイルをそのままデータソースにするのはやめなさい
それはなんでかっていうと、今回のように横に長く、列がたくさんあるデータをマスタにする為に1列縦長のデータに変換するのはめっちゃくちゃ大変&技術力が必要だからなんですよね(´・ω・`)
今回のは Planner コネクタの仕様なので仕方ないですが、自分がカスタム可能なデータベースでは横持データはできるだけ避けた方が良いなというのが実感頂けたと思います。
コネクタの仕様が使いにくくて、発狂しそうになった方はぜひこちらの記事を参考に、Microsoft さんにフィードバックしてください。
もしかしたら考え直してくれるかもしれません(笑)
それではごきげんよう。









