作成者向け Power Apps 管理コネクタに注目してみる👀✨

# [作成者向け Power Apps 管理コネクタ](https://learn.microsoft.com/ja-jp/connectors/powerappsforappmakers/)

[「やーい、おまえんPower Automate、ごみやーしきー！」とマウントをとられないために](https://qiita.com/DEmodoriGatsuO/items/5494b2f91eb130008841)という記事で、[Power Automate 管理コネクタ](https://learn.microsoft.com/ja-jp/connectors/flowmanagement/)を紹介しました。

今回は、[作成者向け Power Apps 管理コネクタ](https://learn.microsoft.com/ja-jp/connectors/powerappsforappmakers/)を紹介します！

`Power Apps`における
- つながり
- つながりロールの割り当て
- アプリのバージョン
- アプリの表示名の設定
- アプリの詳細の取得
- アプリの一覧の取得
- アプリの公開・削除
- コネクタロールの割り当て
- コネクタの取得・削除
- 環境の取得

上記のようなアクションが用意されています。

https://qiita.com/DEmodoriGatsuO/items/5494b2f91eb130008841

https://learn.microsoft.com/ja-jp/connectors/flowmanagement/

https://learn.microsoft.com/ja-jp/connectors/powerappsforappmakers/

# Power Appsでアプリを一覧化してみる
まずは`Power Apps`で自分の環境のアプリを一覧化してみます。

1. [データ]から[データの追加]
1. [作成者向け Power Apps]を検索しクリック

上記を実行するとコネクタに接続できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/ce903223-74b1-7be8-93e9-2c2323a0152a.png)


## Power Appsにおけるアクションの使い方
::: note info
日本語で表示される場合の説明をさせていただきます。
:::

`作成者向けPowerApps.`とタイプしていくと、コネクタで実行できるアクションが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/c622ca53-def3-b0f0-f1c4-54c2d65eb96e.png)

アクション名は全て英語です。

どのアクションが、何の役割を担うのか、少々面喰いそうな画面です。
調査方法は[公式 リファレンス](https://learn.microsoft.com/ja-jp/connectors/powerappsforappmakers)のアクションの`操作 ID`に注目してみてください。

`-`など除去された`アクションの表示名`が、`Power Apps`のサジェストに出ていることがわかります。
このうち[アプリを入手する (Get-Apps)](https://learn.microsoft.com/ja-jp/connectors/powerappsforappmakers/#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E5%85%A5%E6%89%8B%E3%81%99%E3%82%8B)を実行してみましょう。

https://learn.microsoft.com/ja-jp/connectors/powerappsforappmakers/#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E5%85%A5%E6%89%8B%E3%81%99%E3%82%8B

::: note info
[公式 リファレンス](https://learn.microsoft.com/ja-jp/connectors/powerappsforappmakers)では`アプリを入手する`が二つ表示されてしまっています。
機械翻訳の課題と思いますが、`単一のPower Appsの詳細の取得(操作 ID:Get-App)`と`複数ののPower Appsの取得(操作 ID:Get-Apps)`とそれぞれ内容は異なります。
:::

## 取得される値
[テーブル モダン コントロール](https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-table)で中身を見てみましょう。

::: note info
[テーブル モダン コントロール](https://learn.microsoft.com/ja-jp/power-apps/maker/canvas-apps/controls/modern-controls/modern-control-table)は`プレビュー`機能です。
正式なリリース前であり、変更される可能性も存在します。
:::

テーブルを設定し、`Items`プロパティに`作成者向けPowerApps.GetApps().value`と設定してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/bfa4fb16-0a11-63fe-6232-570df8fd8f43.png)

- id
- name
- properties
- tags
- type

上記が取得できます。
こちらの中で`properties`が特に多くのアプリケーションの情報が格納されています。

テーブルで表示するために少し加工が必要ですね。

戻り値は下記を参考にしましょう!

https://learn.microsoft.com/ja-jp/connectors/powerappsforappmakers/#powerapp

このうち私は下記の値に絞って取得してみることにしました🐟

| プロパティ | 内容 |
|---|---|
| name| アプリの名前（表示名ではない） |
| appVersion | アプリのバージョン(日付型)|
| description | アプリの説明 |
| displayName | アプリの表示名 |
| documentUri | アプリのドキュメント URL |
| environmentName | アプリの環境 |
| lastModifiedByDisplayName | 最終更新をした人の名前 |
| lastModifiedTime | 最終更新日時 |
| ownerDisplayName | 所有者の名前 |
| primaryDeviceHeight | 主要なデバイスの高さ |
| primaryDeviceWidth | 主要なデバイスの幅 |
| primaryFormFactor | タブレット型/モバイル型など |
| publisherVersion | アプリを公開したときのPower Appsのバージョン |
| sharedUsersCount | 共有したユーザー数 |
| sharedGroupsCount | 共有したグループ数 |

上記を取得するべく、テーブル コントロールの`Items`プロパティに下記の値を設定します。

```Items
ForAll(
    作成者向けPowerApps.GetApps().value,
    With(
        {
            appTags: tags,
            appProperties: properties,
            ownerProps: properties.owner,
            modifierProps: properties.lastModifiedBy,
            envProps: properties.environment,
            appUris: properties.appUris
        },
        {
            name: name,
            appVersion: appProperties.appVersion,
            description: appProperties.description,
            displayName: appProperties.displayName,
            documentUri: appUris.documentUri.value,
            environmentName: envProps.name,
            lastModifiedByDisplayName: modifierProps.displayName,
            lastModifiedTime: appProperties.lastModifiedTime,
            ownerDisplayName: ownerProps.displayName,
            primaryDeviceHeight: appTags.primaryDeviceHeight,
            primaryDeviceWidth: appTags.primaryDeviceWidth,
            primaryFormFactor: appTags.primaryFormFactor,
            publisherVersion: appTags.publisherVersion,
            sharedUsersCount: appProperties.sharedUsersCount,
            sharedGroupsCount: appProperties.sharedGroupsCount,
            appOpenUri: appProperties.appOpenUri
        }
    )
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/647f1701-908a-ee38-8acf-33b113ff65d4.png)

名前や環境名、バージョンが列挙されますね。
個人的には`appOpenUri`が便利です。こちらはアプリケーションを起動するリンクです。

[Param 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-param)と組み合わせたリンク共有に使えそうです。

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-param

どういったシーンを想定しているか、後述します。

### 非常に可能性を感じる`documentUri`

個人的な発見だったプロパティは`documentUri`です。
[download 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-download)でこの`Uri`を引数にすると、対象のPower Appsの情報が格納されたZipファイルを取得することができます。

https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-download

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/64cf7ea9-02ee-9b0b-218f-96542b87dc2c.png)

Zipファイルの中身は

```document.zip
 - Controls (folder)
 - References (folder)
    - DataSources.json
    - ModernThemes.json
    - Resources.json
    - Templates.json
    - Themes.json
 - Resources (folder)
    - PublishInfo.json
 - AppCheckerResult.sarif
 - checksum.json
 - Header.json
 - Properties.json
```

コードベースでPower Appsの情報が取得できます。
こちらを活用することで、`GPT`や`Claude 3.5`、`Gemini`によるドキュメント化もできそうですね

# [Param 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-param)とコラボする
[作成者向け Power Apps 管理コネクタ](https://learn.microsoft.com/ja-jp/connectors/powerappsforappmakers/)に目を付けた理由として、[Param 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-param)とのコラボレーションができるのではないかという発想があります。

例えばパラメーター付きのリンクを、Power Appsから送信するシーンがあると仮定します。
選択したレコードの値に応じて、パラメーターを変動してリンクを送ることができたら便利です。

今回は名画のリストとフォームを用意して検証してみたいと思います。

 - TableScreen - （Listsをテーブル形式で見る。選択したレコードを変数に格納し、`ViewScreen`に遷移）
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/9bfd3f1f-a151-3caf-c488-116a52de9982.png)
 - ViewScreen - `TableScreen`の詳細を見るビュー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/629f8412-a0b0-a457-faef-6fe783f9629e.png)

Power Appsの`OnStart`に
```javascript:OnStart
If(
    !IsBlank(Param("RecordID")),
    Set(
        selectedRecord,
        LookUp(
            SPOList,
            ID = Value(Param("RecordID"))
        )
    )
)
```

こちらで`RecordID`というパラメーター付きで渡されたリンクの場合、グローバル変数`selectedRecord`にレコードを格納します。

```javascript:StartScreen
If(
    IsBlank(Param("RecordID")),
    TableScreen,
    ViewScreen
)
```
`RecordID`というパラメーターがある場合、アプリの起動時から`ViewScreen`を表示。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/96e08e9a-f39b-2231-6fbb-1ac93e1912bf.png)

テーブルの`OnSelect`も整合性が取れるように調整します。
選択したレコードを、グローバル変数`selectedRecord`にレコードを格納します。

```javascript:OnSelect
Set(
    selectedRecord,
    Self.Selected
);
Navigate(
    ViewScreen,
    ScreenTransition.Fade
);
```

そして`ViewScreen`の設定です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/068828d3-38bf-a9f1-6a4b-ef6541053963.png)


- `Share`と記載されたボタンを押して、現在のレコードのリンクを共有し、共有相手も簡単にアクセスできるようにします
- ViewScreenのFormの`DataSource`は、TableScreenの`Items`と同様にすることで、
グローバル変数である`selectedRecord`にて選択した値を表示

ここから今見ている画面を他者にリンク付きで共有するとします。
その場合は、`Power Apps`の`Web URI`と[Param 関数](https://learn.microsoft.com/ja-jp/power-platform/power-fx/reference/function-param)を利用することで共有が実現できますね。

今回は、`Outlook365コネクタ`から、`HTML形式`でメールを送ることで実現したいと思います。

```javascript:OnSelect
// 1. Power AppsのWeb URI - アプリケーションの表示名でルックアップ
Set(
    OpenUri,
    LookUp(
        作成者向けPowerApps.GetApps().value,
        properties.displayName = "TestApplication",
        properties.appOpenUri
    )
);
// 2. アプリの名前
Set(
    AppName,
    LookUp(
        作成者向けPowerApps.GetApps().value,
        properties.displayName = "TestApplication",
        properties.displayName
    )
);
// 3. 送り先 - テスト用に自分に送信
Set(
    Me,
    LookUp(
        作成者向けPowerApps.GetApps().value,
        properties.displayName = "TestApplication",
        properties.createdBy.email
    )
);
// 4. メールでリンク送信
Office365Outlook.SendEmailV2(
    Me,
    selectedRecord.Title,
    $"<p>データの共有</p><br><br>ファイルリンク: <a href='{OpenUri}?RecordID={selectedRecord.ID}'>{AppName}</a>",
    {IsHtml: true}
);
```

こちらでボタンを押すことで、共有した相手にメールで今見ている画面を共有できます。
共有された相手はファイルリンクをクリックすることで、直接Form画面を移ることができますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/f6b5b858-0564-a4ed-e938-4fe10658044a.png)

 ↓↓↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/af267ae5-5d5a-8ec5-6f8e-726b66d5d143.png)

`Power Apps`の中から公開された`Web Uri`を取得することで共有の幅が広がりそうです

# おわりに
アプリケーションを展開していくと、もっとこうできないかといった達成したいことが増えていきます。
今回のPower AppsのWeb Uri取得は、まさにそれでした。

**[作成者向け Power Apps 管理コネクタ](https://learn.microsoft.com/ja-jp/connectors/powerappsforappmakers/)を使ってアプリの可能性を高めていきたいですね！**