CoE スタートキットの App Permission Center アプリで、共同所有者がいないアプリを一覧表示する


# CoE スタートキットとは

端的に言うと、Power Platform (Power BI を除く) の管理、ガバナンス、育成等にフォーカスしたテンプレート ツールキットです。
Power Platform 管理センターなど、標準の機能では実現できない様々なことが出来ます。

以下、CoE スタートキットのコアコンポーネントの実体ですが、CoE スタートキット自体、Power Apps アプリ、Power Automate クラウドフロー、Dataverse テーブル等で作成されており、ソリューションとしてインポートするものとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/2fd150f9-d245-53a6-9c66-2aa924f6d1a1.png)

詳細については、以下を参考になさってください。

https://learn.microsoft.com/ja-jp/power-platform/guidance/coe/starter-kit

今回は、CoE スタートキットのコアコンポーネントに存在するアプリの一つである、「App Permission Center」にて、共同所有者がいないアプリを一覧表示する方法を紹介します。

# CoE スタートキットのカスタマイズについて

上述の通り、CoE スターキット自体、Power Apps 等で作られているため、カスタマイズをすることが可能です。カスタマイズする際のアプローチについては、以下を参考にしてください。

https://learn.microsoft.com/ja-jp/power-platform/guidance/coe/modify-components

# App Permission Center アプリとは

こちらのアプリを利用することで、アプリが誰にどのような権限で共有されているかを確認したり、所有者が退職等をして孤立しているアプリを確認したり、必要に応じて管理者の方から権限を追加することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/e4e432dd-e00c-4818-255e-03abeafc742f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/63b2a669-5043-dd0a-c832-1ea7feb89c42.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/8625187a-6a7a-daaf-d44a-95f6367e10f3.png)


こちらのアプリを利用することで、IT 管理者からすると、例えば、所有者が退職等をしてアプリが編集できなくなってしまったという相談への対応が容易になります。

※もちろん、そのような事態にならないよう、ユーザーズガイド等で以下のような周知をしておく必要があると考えます

* 複数人の人の業務効率化に貢献しており、利用できなくなると困る Power Apps アプリや Power Automate フローについては、作成、リリース段階であらかじめ共同所有者を設定しておくこと

* 退職や異動時に、そのようなアプリやフローがある場合は引き継ぎを行うこと

* 組織的に利用するアプリの場合、個人の退職や異動に左右されない専用のアカウントを利用すること

# 今回行うカスタマイズについて

今回行うカスタマイズは主に 2 点で、共同所有者が設定されていないアプリを見つけやすくすることが狙いです。個人的には、管理者が積極的に共同所有者を追加する必要まではないと思いますが、何かあった時に共同所有者が設定されていないアプリが少し見つけやすくなると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/44795179-34ae-a371-0e81-ad0dd08d1479.png)

① 共同所有者が設定されていないアプリについて、警告アイコンを表示
② 共同所有者が設定されていないアプリについて、チェックボックスを利用してフィルターをする

## ① 共同所有者が設定されていないアプリについて、警告アイコンを表示

まず、以下のように、[galApps] ギャラリーにアイコン コントロールを追加し、配置を整えます。ここでは、[icnCaution] というコントロール名にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/ba25722d-010e-80b1-db13-f07602004e43.png)

:::note info
アイコンの種類は、コントロール追加後、プロパティから変更可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/063df55d-7f6f-3752-31b1-93b4e0e1b913.png)

:::

アイコンコントロールの `[Visible]` プロパティを以下のように記述し、各アプリごとに、"CanEdit" のロールを持ったユーザーがいるかどうかを判定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/eda3c374-2015-9153-6f62-3694309d728d.png)

```
If(
    IsBlank(
        LookUp(
            PowerAppsforAdmins.GetAdminAppRoleAssignment(
                ThisItem.'App Environment ID',
                ThisItem.App
            ).value,
            properties.roleName = "CanEdit"
        )
    ),
    true,
    false
)
```
## ② 共同所有者が設定されていないアプリについて、チェックボックスを利用してフィルターをする

:::note warn
① と比べるとやや複雑な処理になります。また、あまり処理効率が良くないため、実装するかは検討が必要と思います。
:::

### 実装後
実装後は、以下のように、チェックボックスにチェックを入れると、共同所有者が設定されていないアプリのみ表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/7a23abc4-ec19-6984-2055-10c15c21be23.png)


### チェックボックスの設定

まず、以下のようにチェックボックスを配置します。ここでは、[chkNoCo-EditorsApps] というコントロール名にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/eba45292-f21c-d05f-e5b5-8bb5cfac3b65.png)
`[OnSelect]` プロパティを以下のように変更します。

```
Clear(colShowOnlyNoCoEditorApps);
Clear(colTempShowOnlyNoCoEditorApps);
ClearCollect(
    colTempShowOnlyNoCoEditorApps,
    SortByColumns(
        Filter(
            Filter(
                'PowerApps Apps',
                'App Environment'.'Display Name' = Text(galEnvironments.Selected.'Display Name') And 'App Type' = 'PowerApps Type'.Canvas And 'App Deleted' = 'App Deleted (PowerApps Apps)'.No
            ),
            txtSearchText.Text in 'App Display Name' || txtSearchText.Text in 'App Owner Display Name' || txtSearchText.Text in AppIDString
        ),
        "admin_displayname"
    )
);
ForAll(
    colTempShowOnlyNoCoEditorApps,
    If(
        IsBlank(
            LookUp(
                PowerAppsforAdmins.GetAdminAppRoleAssignment(
                    ThisRecord.'App Environment ID',
                    ThisRecord.App
                ).value,
                properties.roleName = "CanEdit"
            )
        ),
        Collect(
            colShowOnlyNoCoEditorApps,
            ThisRecord
        )
    )
);

```

続けて、`[OnUncheck]` に以下記述を追加します。

```
Clear(colShowOnlyNoCoEditorApps);
Clear(colTempShowOnlyNoCoEditorApps);
```

### [galApps] ギャラリー側の変更

更に、チェックボックスのチェック有無でギャラリーに表示されるアイテムを切り替える必要があるため、[galApps] ギャラリーの `[Items]` プロパティを以下の通り変更します。

```
If(
    !'chkNoCo-EditorsApps',
    SortByColumns(
        Filter(
            Filter(
                'PowerApps Apps',
                'App Environment'.'Display Name' = Text(galEnvironments.Selected.'Display Name') And 'App Type' = 'PowerApps Type'.Canvas And 'App Deleted' = 'App Deleted (PowerApps Apps)'.No
            ),
            txtSearchText.Text in 'App Display Name' || txtSearchText.Text in 'App Owner Display Name' || txtSearchText.Text in AppIDString
        ),
        "admin_displayname"
    ),
    colShowOnlyNoCoEditorApps
)
```

チェックボックスのチェック有無でアイコンの表示を切り替える処理を追加する必要があるため、① で設定した、アイコンの `[Visible]` プロパティを以下のように変更します。

```
If(
    !'chkNoCo-EditorsApps',
    If(
        IsBlank(
            LookUp(
                PowerAppsforAdmins.GetAdminAppRoleAssignment(
                    ThisItem.'App Environment ID',
                    ThisItem.App
                ).value,
                properties.roleName = "CanEdit"
            )
        ),
        true,
        false
    ),
    true
)
```

### [AppDetailsScreen] スクリーン側の変更

アクセス権の詳細を表示する [AppDetailsScreen] スクリーンの `[OnVisible]` プロパティを以下のように変更します。

```
If(
    !'chkNoCo-EditorsApps',
    ClearCollect(
        appRoles,
        PowerAppsforAdmins.GetAdminAppRoleAssignment(
            SelectedApp.'App Environment ID',
            SelectedApp.App
        ).value
    );
    ,
    ClearCollect(
        appRoles,
        PowerAppsforAdmins.GetAdminAppRoleAssignment(
            SelectedApp.'App Environment ID',
            SelectedApp.App
        ).value
    );
    
);
UpdateContext(
    {
        showEmailUsers: false,
        showAddUsers: false,
        showCantShowThat: false,
        CantShowThatText: ""
    }
)
```

[rolesRefresh] アイコンの `[OnSelect]` プロパティを以下のよう変更します。

```
If(
    !'chkNoCo-EditorsApps',
    ClearCollect(
        appRoles,
        PowerAppsforAdmins.GetAdminAppRoleAssignment(
            SelectedApp.'App Environment ID',
            SelectedApp.App
        ).value
    );
    ,
    ClearCollect(
        appRoles,
        PowerAppsforAdmins.GetAdminAppRoleAssignment(
            SelectedApp.'App Environment ID',
            SelectedApp.App
        ).value
    );
    
);

```

### [galEnvironments] ギャラリーの変更

[chkNoCo-EditorsApps] コントロールのチェックを押下した状態で環境を切り替えた際に `[galApps]` のアイテムが切り替わるよう、[galEnvironments] ギャラリーの `[OnSelect]` プロパティを以下のように変更します。

```
Reset(chkSelectAll);
If(
    CountRows(EnvCheckedApps) > 0,
    Clear(EnvCheckedApps)
);
If(
    'chkNoCo-EditorsApps',
    Select('chkNoCo-EditorsApps');
    
);
```

### その他処理

全般的に、選択したアプリの環境名を正しく認識できず、アクセス権の変更処理等に失敗するようになったため、以下の通り記述を変更していきます。

まず、[galApps] の [chkSelectApp] の `[OnCheck]` プロパティを以下の通り変更します。

```
Collect(
    EnvCheckedApps,
    {
        AppName: ThisItem.App,
        AppOwner: ThisItem.'App Owner',
        AppIsOrphaned: ThisItem.'App is Orphaned',
        Environment: ThisItem.'App Environment'.Environment,
        EnvName: ThisItem.'App Environment ID'
    }
)
```

続いて、置換の機能を使って、以下の通り記述を変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074511/2c84a452-2fb9-8e7a-fe1e-c6560a5163ba.png)

```
置換前：
SelectedApp.'App Environment'.Name

置換後：
SelectedApp.'App Environment ID'
```
```
置換前：
EnvName: 'App Environment'.Name
置換後：
EnvName: 'App Environment ID'
```

最後に、アクセス権の変更後、[icnCaution] の表示を切り替えるため、[btnAddUser_5] の `[OnSelect]` プロパティ、[HomeScreen] の`[OnVisible]` にも以下の処理を追記します。

```
Select('chkNoCo-EditorsApps');
```