【Power Platform】Office 365 Groups コネクタで取得したグループの種類を判別する

# Office 365 Groups コネクタで取得したグループの種類を判別する

Office 365 Groups コネクタ の ListGroups アクションで取得したグループの情報からグループの種類を判別します。

## グループ一覧の取得

https://learn.microsoft.com/connectors/office365groups/#list-groups

### ListGroups

この操作を実行すると、組織のすべてのグループの一覧が返されます。

### パラメーター

| キー       | 型      | 説明                                                         |
| :--------- | :------ | :----------------------------------------------------------- |
| $filter    | string  | リストが作成される行を制限する OData スタイル フィルター式を入力します。 |
| $top       | integer | 結果のページ サイズを設定します。                            |
| $skiptoken | string  | 結果の次のページを参照し、応答の @odata.nextLink プロパティで返されるトークンです。 |

### 戻り値

[ListGroups_Response](https://learn.microsoft.com/connectors/office365groups/#listgroups_response)

## 確認用アプリ作成

グループの種類を判別するためにさくっとアプリを作ってみます。
結果表示用のテーブルとドロップダウンリストを配置して、ドロップダウンリストの選択でグループをフィルターするアプリを作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/52c18000-93d7-3aac-c479-95d591940f7f.png)

### ドロップダウンリスト コンポーネント (モダン)

ドロップダウンリストの選択肢を設定します。

```powershell:Items プロパティ
[
    "Microsoft 365 パブリック",
    "Microsoft 365 プライベート",
    "配布リスト",
    "セキュリティグループ",
    "メールが有効なセキュリティグループ"
]
```

### テーブル コンポーネント (モダン)

テーブルに表示されるアイテムを設定します。

```powershell:Items プロパティ
With(
    {type: DropdownTypes.Selected.Value},
    Filter(
        Office365Groups.ListGroups({'$top': 999}).value As g,
        Switch(type,
            "Microsoft 365 パブリック",
                g.visibility = "Public",
            "Microsoft 365 プライベート",
                g.visibility = "Private",
            "配布リスト",
                IsBlank(g.visibility) && !g.securityEnabled,
            "セキュリティグループ",
                IsBlank(g.visibility) && g.securityEnabled && !g.mailEnabled,
            "メールが有効なセキュリティグループ",
                IsBlank(g.visibility) && g.securityEnabled && g.mailEnabled,
            true
        )
    )
)
```

表示されるフィールドを設定。
※メールアドレスや表示名は見せられないので選択していません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/386a9e24-7ced-6f49-4ba6-d37e1dbb853c.png)

### 動作確認

ドロップダウンリストの選択を変更すると、フィルターされた結果が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/50b8dcf5-825f-02ab-a2ad-fe30891118ab.png)

## 判定処理

### Microsoft 365 パブリック

```powershell:
g.visibility = "Public"
```

- visibility (可視性) が『Public』なグループ

### Microsoft 365 プライベート

```powershell:
g.visibility = "Private"
```

- visibility (可視性) が『Private』なグループ

### 配布リスト

```powershell:
IsBlank(g.visibility) && !g.securityEnabled
```

- visibility (可視性) が空白
- securityEnabled (セキュリティの有効化) が False

### セキュリティグループ

```powershell:
IsBlank(g.visibility) && g.securityEnabled && !g.mailEnabled
```

- visibility (可視性) が空白
- securityEnabled (セキュリティの有効化) が True
- mailEnabled (メールの有効化) が False

### メールが有効なセキュリティグループ

```powershell:
IsBlank(g.visibility) && g.securityEnabled && g.mailEnabled
```

- visibility (可視性) が空白
- securityEnabled (セキュリティの有効化) が True
- mailEnabled (メールの有効化) が True

## OData クエリでのフィルター

visibility 列のフィルターが未実装らしい...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111975/c7224cc9-2d83-3df5-a2cb-23c4dc72f306.png)

```powershell:Items プロパティ
With(
    {type: DropdownTypes_1.Selected.Value},
    Switch(
        type,
        "Microsoft 365 パブリック",
            Filter(Office365Groups.ListGroups({'$top':999, '$filter': "securityEnabled eq false"}).value As g, g.visibility = "Public"),
        "Microsoft 365 プライベート",
            Filter(Office365Groups.ListGroups({'$top':999, '$filter': "securityEnabled eq false"}).value As g, g.visibility = "Private"),
        "配布リスト",
            Filter(Office365Groups.ListGroups({'$top':999, '$filter': "securityEnabled eq false"}).value As g, IsBlank(g.visibility)),
        "セキュリティグループ",
            Office365Groups.ListGroups({'$top':999, '$filter': "securityEnabled eq true and mailEnabled eq false"}).value,
        "メールが有効なセキュリティグループ",
            Office365Groups.ListGroups({'$top':999, '$filter': "securityEnabled eq true and mailEnabled eq true"}).value
    )
)
```
# 特にフィルターしない一覧

```powershell:Items プロパティ
ShowColumns(
    AddColumns(
        RenameColumns(
            Office365Groups.ListGroups({'$top': 999}).value,
            id, Id,
            displayName, DisplayName,
            mail, Email
        ) As g,
        GroupType, If(
            !IsBlank(g.visibility),
            Switch(
                g.visibility,
                "Public", "Microsoft365 パブリック",
                "Private", "Microsoft365 プライベート",
                "不明"
            ),
            If(
                !g.securityEnabled,
                "配布リスト",
                If(
                    !g.mailEnabled,
                    "セキュリティグループ",
                    "メールが有効なセキュリティグループ"
                )
            )
        ),
        Claims, If(
            !IsBlank(g.visibility),
            $"c:0o.c|federateddirectoryclaimprovider|{g.Id}",
            $"c:0t.c|tenant|{g.Id}"
        )
    ),
    Claims,
    DisplayName,
    Email,
    GroupType
)
```