Power Apps カスタムコネクタを使用しないGraph API #1

Power Apps カスタムコネクタを使用しないGraph API #1 Power Apps
この記事は約9分で読めます。

2024年7月までPower AppsでGraph APIを使用してデータを取得する最も簡単な方法はカスタムコネクタの作成でした。しかし、Entra ID管理画面のアクセス権がない開発者はカスタムコネクタを作れません。この問題の解決策として、経験豊富な開発者は既存のコネクタを拡張することができます。この方法について、次の2~3回に分けて詳しく説明します。

※2024年8月19日現在Office365グループコネクタのHttpRequest関数を介してV1.0エンドポイントで取得できるエンドポイントに対してすべて対応済みとなっています。

対象者:開発上級者

コネクタを拡張する目的

データの種類が少ない場合、取得したJSON文字列をテーブルに変換する作業はそれほど問題ではありません。しかし、複数のカスタムリストデータを取得する必要がある場合、JSON文字列の解析は非常に煩雑な作業になります。コネクタを拡張して、取得するデータの型を明示的に指定することで、JSON解析の作業を減らすことが、今回の目的です。

この記事で扱わない事

  • Graph APIとは
  • SharePoint REST APIとの違い
  • JSONとは
  • XMLスキーマの書式

拡張するコネクタ

  • Office365グループ(HttpRequest)

取得結果を確認する

最初に簡単なエンドポイントをGETしてResponseを確認します。今回は単純なレコードを返すMyProfを取得するエンドポイントに問い合わせます。
次のコードをボタンに張り付けてプレビュー実行します。

Set(__GraphResults, Office365グループ.HttpRequest("https://microsoft.com/v1.0/me", "GET", ""))

__GraphResultsの内容を確認した結果、実態はJSONテキストですがUntypedObjectという未定義の型でデータが保存されていることがわかります。

{"@odata.context":"https://graph.microsoft.com/v1.0/$metadata#users/$entity","businessPhones":[],"displayName":"Toshihiko Iwamoto","givenName":"Toshihiko","jobTitle":null,"mail":"tiwamoto@example.com","mobilePhone":null,    "officeLocation":null,"preferredLanguage":null,"surname":"Iwamoto","userPrincipalName":"tiwamoto@example.com","id":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}

表示してみる

この結果が単一行のデータ(レコード)であると推測できますが、Power Appsから見たときに格納されているデータの型は不明です。TextCanvas.Textで値を表示する際、暗黙的にテキスト型にキャストされるため、型を明示する必要はありません。しかし、式の中でデータを参照する場合は、その型を明示する必要があります。

/* 型指定のない参照(暗黙参照) */
__GraphResults.displayName

/* 明示的に型指定した参照 */
Text(__GraphResults.displayName)

または、レコードを一括で型指定後にプロパティとして個別参照できます。

/* 単一行レコードの場合(テーブル変換すると参照が面倒になるためレコード変換) */
Set(
    __CastRecord,
    With(
        {__businessPhones: Table(__GraphResults.businessPhones)},
        {
            businessPhones: __businessPhones,
            displayName: Text(__GraphResults.displayName),
            givenName: Text(__GraphResults.givenName),
            jobTitle: Text(__GraphResults.jobTitle),
            mail: Text(__GraphResults.mail),
            mobilePhone: Text(__GraphResults.mobilePhone),
            officeLocation: Text(__GraphResults.officeLocation),
            preferredLanguage: Text(__GraphResults.preferredLanguage),
            surname: Text(__GraphResults.surname),
            userPrincipalName: Text(__GraphResults.userPrincipalName),
            id: Text(__GraphResults.id)
        }
    )
)

/* displayNameを参照 */
__CastRecord.displayName

XMLスキーマに変換してみる

コネクタを拡張する準備として先ほど確認したJSON文字列をXMLスキーマに変換してみます。

容易に型判定できるものだけ列挙する

<object name="GetMyProf_def">
    <prpperty name="displayName" type="string" />
    <prpperty name="givenName" type="string" />
    <prpperty name="jobTitle" type="string" />
    <prpperty name="mail" type="string" />
    <prpperty name="mobilePhone" type="string" />
    <prpperty name="officeLocation" type="string" />
    <prpperty name="preferredLanguage" type="string" />
    <prpperty name="surname" type="string" />
    <prpperty name="userPrincipalName" type="string" />
    <prpperty name="id" type="string" />
</object>

現在、メンバタイプが「string」の値のみを設定しています。businessPhonesメンバは少し異なるため、後ほど追加する予定です。

配列部分を別途定義する

スコープをbusinessPhonesに当て、XMLスキーマを定義します。

<string name="businessPhones_value_def" />
<array name="businessPhones_def" typeRef="businessPhones_value_def" />

統合する

上の2つを統合し、スキーマを完成させます。

<string name="businessPhones_value_def" />
<array name="businessPhones_def" typeRef="businessPhones_value_def" />

<object name="GetMyProf_def">
    <property name = "businessPhones" typeRef="businessPhones_def" />
    <property name="displayName" type="string" />
    <property name="givenName" type="string" />
    <property name="jobTitle" type="string" />
    <property name="mail" type="string" />
    <property name="mobilePhone" type="string" />
    <property name="officeLocation" type="string" />
    <property name="preferredLanguage" type="string" />
    <property name="surname" type="string" />
    <property name="userPrincipalName" type="string" />
    <property name="id" type="string" />
</object>

これでコネクタの拡張に必要なレスポンススキーマが完成しました。
完成したスキーマはメモ帳などに保持しておきます。

これまでに取得したプロフィール情報は、Office365ユーザーコネクタで得られる情報とほぼ一致しています。Graph APIのクエリパラメータに追加を行うことで、隠されたプロパティを取得することも可能ですし、必要なプロパティのみに絞ることも可能ですので、ぜひ試してみてください。もちろん、Office365ユーザーコネクタにクエリパラメータを追加することでも、必要なプロパティを取得することができます。

Office365グループコネクタの名前を変更する

拡張コネクタの機能が分かるように、事前に名前を変更します。

変更前
変更後

保存・公開・エクスポート

コネクタを拡張する準備がすべて整いましたので、アプリを保存して公開します。バージョンメモを残すと編集履歴が解りやすくなります。

エクスポートされたファイルは、ブラウザーの設定に従ってダウンロードフォルダに保存されます。次に、このファイルを使用してVisual Studio Codeでコネクタを実際に拡張します。

この記事では、Graph APIのレスポンススキーマの確認方法、XMLスキーマへの変換、そしてアプリケーションのエクスポートについて説明しました。Graph APIのレスポンススキーマはGraph Explorerを使用しても確認可能ですので、ぜひ活用してみてください。

この記事を書いた人

岩本敏彦
タイトルとURLをコピーしました