Power Appsユーザー一覧便利アプリ実用アプリ

アプリやフローの権限を色々なユーザーグループを用いて便利に変更するアプリの作り方

Power Apps

Power AppsやPower Automateの共有って地味に面倒ですよね。

この記事ではアプリ/フローの共有を

  • M365グループ(Teamsのチーム・SharePointサイト)
  • Teamsのタグ
  • Power Appsアプリのユーザー
  • Power Automateフローの共同所有者

から設定できるようにしたアプリの作り方を紹介し、msappファイルを共有します。

またこの記事は以下の記事の続きですので、ぜひこちらも合わせてご覧ください。

この記事は、Power Apps Advent Calendar 2023 12月1日担当分の記事です。

完成系

アプリ/フロー選択画面

環境・アプリ/フローを選択して権限を変更する画面です。個別にユーザーを追加・削除することが可能です。

画面右上の複数追加ボタンをクリックするとユーザー変更画面に遷移します。

ユーザー変更画面

アプリ/フロー選択画面で選択したアプリ/フローのユーザーを変更できます。

ユーザーはM365グループ、Teamsのタグ、他のアプリ/フローのユーザーから取得して、まとめて追加することが可能です。

また選択したユーザーの;区切りメールアドレスも出力されているので、Outlookの宛先にも使用することができます。

msappのダウンロード

こちらから.msappファイルをダウンロードして、実際にアプリを動かしてみてください。

データソースは使用していないので、すぐに使用することができます。

アプリやフローの権限を他のユーザーグループから設定するアプリ

主要箇所のコード説明

アプリ/フローの一覧(GalleryItems)

If(
    TabList1.Selected.Value = "Power Apps",
    Filter(作成者向けPowerApps.GetApps().value, properties.environment.name = Lower(ComboboxCanvasEnviroments.Selected.name)),
    AddColumns(PowerAutomate管理.ListMyFlows(ComboboxCanvasEnviroments.Selected.name).value, "id", "")
)

画面上部のコンボボックスで選択した環境でアプリ/フローをフィルターしています。

GetApps内でフィルタークエリが使用できないエラーが発生してしまうので、エラーなく記述する方法をご存知の方は教えてください。

またアプリの権限変更にPermissionIDが必要なため、PowerAutomate管理.ListMyFlowsにid列を追加しています。

アプリ/フローのユーザー一覧(GalleryUsers)

AddColumns(
    If(
        TabList1.Selected.Value = "Power Apps",
        作成者向けPowerApps.GetAppRoleAssignment(GalleryItems.Selected.name).value,
        PowerAutomate管理.ListFlowOwners(ComboboxCanvasEnviroments.Selected.name, GalleryItems.Selected.name).value
    ),
    "ユーザー名",
    Office365ユーザー.UserProfileV2(name).displayName
)

GalleryItemsで選択したアプリ/フローのユーザーを一覧表示しています。

name列にユーザーIDが格納されているので、AddColumns関数でユーザーの表示名列を作成しています。

Appsのみユーザー権限の変更(DropdownCanvasUserRole)

ユーザーのロールを表示・変更するドロップダウンです。

Appsのみ表示したり、Owner権限は変更不可だったりという制御が入っています。

作成者向けPowerApps.EditAppRoleAssignment(
    GalleryItems.Selected.name,
    {
        '$filter':"enviroment eq '" & ComboboxCanvasEnviroments.Selected.name & "'",
        put:
            [
                { 
                    properties:
                        { 
                            principal:
                                {
                                    tenantId:Host.TenantID,
                                    id:ComboboxCanvasUser.Selected.Id,
                                    email:"", 
                                    type:""
                                },
                            roleName: Self.Selected.Value,
                            NotifyShareTargetOption: "2"
                        }
                }
            ]
    }
)

ユーザーの権限を削除するボタン(ButtonCanvasDeleteUser)

ユーザーの権限を削除するためのボタンです。

Owner権限は削除不可になっています。

If(
    TabList1.Selected.Value = "Power Apps",
    作成者向けPowerApps.EditAppRoleAssignment(
        GalleryItems.Selected.name,
        {
            '$filter':"enviroment eq '" & ComboboxCanvasEnviroments.Selected.name & "'",
            delete:[{id:GalleryItems.Selected.id & "/permissions/" & GalleryUsers.Selected.name}]
        }
    ),
    PowerAutomate管理.ModifyFlowOwners(
        ComboboxCanvasEnviroments.Selected.name, 
        GalleryItems.Selected.name,
        {
            delete:
                [
                    { 
                        properties:
                            { 
                                principal:
                                    {
                                        id:ThisItem.properties.principal.id,
                                        type:"User"
                                    }
                            }
                    }
                ]
        }
    )
)

ユーザー検索コンボボックス(ComboboxCanvasUser)

ユーザーを検索するコンボボックスです。

Office365ユーザー.SearchUserV2({searchTerm:Self.SearchText,isSearchTermRequired:false}).value

ユーザー追加ボタン(ButtonCanvasAddUser)

ComboboxCanvasUserで選択したユーザーを追加するボタンです。

If(
    TabList1.Selected.Value = "Power Apps",
    作成者向けPowerApps.EditAppRoleAssignment(
        GalleryItems.Selected.name,
        {
            '$filter':"enviroment eq '" & ComboboxCanvasEnviroments.Selected.name & "'",
            put:
                [
                    { 
                        properties:
                            { 
                                principal:
                                    {
                                        tenantId:Host.TenantID,
                                        id:ComboboxCanvasUser.Selected.Id,
                                        email:"", 
                                        type:""
                                    },
                                roleName: "CanEdit",
                                NotifyShareTargetOption: "2"
                            }
                    }
                ]
        }
    ),
    PowerAutomate管理.ModifyFlowOwners(
        ComboboxCanvasEnviroments.Selected.name, 
        GalleryItems.Selected.name,
        {
            put:
                [
                    { 
                        properties:
                            { 
                                principal:
                                    {
                                        id:ComboboxCanvasUser.Selected.Id,
                                        type:"User"
                                    }
                            }
                    }
                ]
        }
    )
)

ユーザー変更画面に遷移するボタン

ユーザーのコレクションへの格納と、ユーザーを複数選択する画面に遷移するボタンです。

ClearCollect(
    ColOrgUsers,
    ShowColumns(
        AddColumns(
            GalleryUsers.AllItems,
            "id",
            properties.principal.id,
            "role",
            properties.roleName
        ),
        "id",
        "role"
    )
);
Navigate(Screen2)

選択した結果に応じてユーザーの権限を変更するボタン(IconModifyUserRole)

ここまでの操作を一括で反映させるボタンです。

テーブルの型を合わせれば処理も数式も短くなりますが、今回は汎用性を考慮してForAllで繰り返し処理にしました。

削除処理は減分を取得して削除しています。

ForAll(
    Filter(ColOrgUsers, role <> "Owner"),
    If(
        TabList1.Selected.Value = "Power Apps",
        作成者向けPowerApps.EditAppRoleAssignment(
            GalleryItems.Selected.name,
            {
                '$filter':"enviroment eq '" & ComboboxCanvasEnviroments.Selected.name & "'",
                put:
                    [
                        { 
                            properties:
                                { 
                                    principal:
                                        {
                                            tenantId:Host.TenantID,
                                            id:ThisRecord.id,
                                            email:"", 
                                            type:""
                                        },
                                    roleName: ThisRecord.role,
                                    NotifyShareTargetOption: "2"
                                }
                        }
                    ]
            }
        ),
        PowerAutomate管理.ModifyFlowOwners(
            ComboboxCanvasEnviroments.Selected.name, 
            GalleryItems.Selected.name,
            {
                put:
                    [
                        { 
                            properties:
                                { 
                                    principal:
                                        {
                                            id:ThisRecord.id,
                                            type:"User"
                                        }
                                }
                        }
                    ]
            }
        )
    )
);
ForAll(
    //減分
    Filter(
        GalleryUsers.AllItems,
        Not(name in ColOrgUsers.id)
    ),
    If(
        TabList1.Selected.Value = "Power Apps",
        作成者向けPowerApps.EditAppRoleAssignment(
            GalleryItems.Selected.name,
            {
                '$filter':"enviroment eq '" & ComboboxCanvasEnviroments.Selected.name & "'",
                delete:[{id:GalleryItems.Selected.id & "/permissions/" & ThisRecord.name}]
            }
        ),
        PowerAutomate管理.ModifyFlowOwners(
            ComboboxCanvasEnviroments.Selected.name, 
            GalleryItems.Selected.name,
            {
                delete:
                    [
                        { 
                            properties:
                                { 
                                    principal:
                                        {
                                            id:ThisRecord.name,
                                            type:"User"
                                        }
                                }
                        }
                    ]
            }
        )
    )
);
Back()

コメント

タイトルとURLをコピーしました