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

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

これまでの2回の記事で、#1ではスキーマを作成し、#2ではパッケージの展開、編集、デプロイ、そして結果を確認しました。今回は、既存のコネクタを複製して別名で新しいコネクタを作り、メソッドの変更や追加を行います。

対象者:開発上級者

今回作成するコネクタ

  • GraphEndPoint_SharePointList

指定したidを持つレコードを返す「GetItem」メソッドと、アイテム一覧テーブルと次のアイテムリストへのトークンを含む単一レコード返す[GetItems]メソッドを持つコネクタを作成します。

今回も、前回に続き、既存のコネクタからデータを取得する新しいコネクタを作成します。目的は、スキーマ構築のテクニックを学び、VSCodeでソースコードを複製する際のポイントに着目することです。さらに、タイマーやボタンを使ったループ処理で、標準コネクタの大きな課題である「委任問題」を解決する方法も学べます。

コネクタの複製(VSCode)

Power Appsでも同じ機能(API)を持つコネクタを複数設置することは可能ですが、編集が必要なスキーマやリソースが増えるため、今回はVSCodeを使用して行います。

対象のファイルを検索してコピー&ペースト

今回は、「GraphEndPoint_MyProf」というコネクタを複製し、修正を加えていきます。「GraphEndPoint_MyProf.xml」をコピー&ペースト[Ctrl + C]→[Ctrl + V]します。

  1. 「GraphEndPoint_MyProf.xml」をコピー&ペースト[Ctrl + C]→[Ctrl + V]します。
  2. 「「GraphEndPoint_MyProf_copy.xml」が作成されたことを確認します。
  1. 「GraphEndPoint_MyProf_copy.xml」を「GraphEndPoint_SharePointList.xml」に名前変更します。

これで新しいコネクタ「GraphEndPoint_SharePointList」の定義ファイルが準備出来ました。

作成するコネクタに対応するスキーマの確認

今回はSharePoint Listに対するGraph API EndPointのレスポンススキーマが必要です。
レスポンススキーマの確認はGraph Explorerで行うことが出来ます。
SharePoint List Items を取得するエンドポイントの例は以下です。

https://graph.microsoft.com/v1.0/sites/{Site-Id}/lists/{List-Id}/items

↑のエンドポイントはリストアイテム一覧の最小限のプロパティを取得するものです。
カスタムフィールドの値を取得したい場合はさらにクエリパラメータを追加します。

https://graph.microsoft.com/v1.0/sites/{Site-Id}/lists/{List-Id}/items?$expand=fields

さらに、既定の取得数(=100)を超えた場合に「@odata.nextLink」プロパティを強制的に取得するために、クエリパラメータを追加します。(事前にリストに2件以上のアイテムを追加しておきます。)

https://graph.microsoft.com/v1.0/sites/{Site-Id}/lists/{List-Id}/items?$expand=fields&top=1

以下のようなレスポンスが返ります。

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('{Site-Id}')/lists('{List-Id}')/items(fields())",
    "@odata.nextLink": "https://graph.microsoft.com/v1.0/sites/{Site-Id}/lists/{List-Id}/items?$expand=fields&top=1&$skiptoken=<skiptoken>",
    "@microsoft.graph.tips": "Use $select to choose only the properties your app needs, as this can lead to performance improvements. For example: GET sites('<guid>')/lists('<guid>')/items?$select=contentType,sharepointIds",
    "value": [
        {
            "@odata.etag": "\"<GUID>,2\"",
            "createdDateTime": "2024-04-15T06:10:31Z",
            "eTag": "\"<GUID>,2\"",
            "id": "1",
            "lastModifiedDateTime": "2024-04-15T06:10:32Z",
            "webUrl": "https://{SiteDomain}/sites/{SiteName}/Shared%20Documents/General",
            "createdBy": {
                "user": {
                    "email": "user@example.com",
                    "id": "<GUID>",
                    "displayName": "userName"
                }
            },
            "lastModifiedBy": {
                "application": {
                    "id": "<GUID>",
                    "displayName": "Microsoft Teams Services"
                },
                "user": {
                    "email": "user@example.com",
                    "id": "<GUID>",
                    "displayName": "userName"
                }
            },
            "parentReference": {
                "id": "<GUID>",
                "siteId": "{SiteDomain},<GUID>,<GUID>"
            },
            "contentType": {
                "id": "0x0120003BF3AF65D28FC843921B238BCDAE74AB",
                "name": "フォルダー"
            },
            "fields@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('{Site-Id}')/lists('{List-Id}')/items('1')/fields/$entity",
            "fields": {
                "@odata.etag": "\"<GUID>,2\"",
                "Modified": "2024-04-15T06:10:32Z",
                "FileLeafRef": "General",
                "MediaServiceImageTags": [],
                "id": "1",
                "ContentType": "フォルダー",
                "Created": "2024-04-15T06:10:31Z",
                "AuthorLookupId": "9",
                "EditorLookupId": "9",
                "_CheckinComment": "",
                "LinkFilenameNoMenu": "General",
                "LinkFilename": "General",
                "ItemChildCount": "8",
                "FolderChildCount": "2",
                "_ComplianceFlags": "",
                "_ComplianceTag": "",
                "_ComplianceTagWrittenTime": "",
                "_ComplianceTagUserId": "",
                "_CommentCount": "",
                "_LikeCount": "",
                "_DisplayName": "",
                "AppAuthorLookupId": "1",
                "AppEditorLookupId": "1",
                "Edit": "0",
                "_UIVersionString": "1.0",
                "ParentVersionStringLookupId": "1",
                "ParentLeafNameLookupId": "1"
            }
        }
    ]
}

例として挙げたレスポンスでは[fields]プロパティのみを追加で取得していますが、もちろん、それ以外にも多くの情報を追加で取得することが可能です。そのため、Graph Explorerを使用して様々な情報を取得することをお勧めします。

スキーマファイルの修正

Graph Explorerで取得したレスポンススキーマに基づいてXMLスキーマを作成し、「GraphEndPoint_SharePointList.xml」ファイルに適用します。

既存リソースの複製とメソッド及びレスポンスサービスの定義を行います。

コネクター定義の追加

コネクタの定義は現段階で完了しており、再パッキングを行ってもエラーは発生しません。しかし、Power Appsにインポートした後でも、複製や修正を加えたコネクタは参照可能なコネクタとして認識されていないようです。

追加したコネクタが認識されないため表示されない状態

定義ファイルを見つけ出す

まずは、アンパックしたフォルダ内で該当するファイルを探してみます。各フォルダを開くと、関連がありそうなファイルが2つ見つかりました。それは[Connectors]フォルダの[Connections.json]ファイルと[DataSources]フォルダの[GraphEndPoint_MyProf.json]ファイルです。

コネクター定義ファイル[Connections.json]
データソース定義ファイル[リソース名.json]

これらの二つの定義ファイルについては、ファイル名と内容から推測して編集や追加を行います。

定義ファイルを修正・追加する

コネクター定義の追加

コネクター定義内では”DataSouces”を参照してることが推測できますので新規追加したレスポンススキーマ定義ファイル「GraphEndPoint_SharePointList.xml」の拡張子を除いた名前を追加します。

データソース定義ファイルを追加

“DataSources”の参照先として「GraphEndPoint_SharePointList.json」を追加します。

以上で追加したコネクタ定義は完了しました。

追加したコネクタの接続が定義されていない状態

しかし、アプリから見ると、まだ何かが足りないように感じます。コネクタの定義は存在しますが、アプリからそれをどこで参照するのかが不明なようです。そのために、適切な設定項目を探してみましょう。

マニュフェストの定義を追加

数値.jsonファイル内にそれらしき設定が見つかりました。

接続定義ファイルの一部

このファイルに定義を追加していきます。

接続定義としてデータソースとアクションメソッドを追加

パッキングしてZipファイルに圧縮後インポートを行いコネクタが追加されたことを確認します。

追加コネクタに接続が確立された状態
top=1で強制的に次のアイテムリストへのリンクを要求したクエリを発行
@odata.nextLinkとvalueを持つレコード
valueの内容(top=1のため1行となる)

リストアイテム一覧を取得するメソッドは正常に動作しています。

idを指定してリストアイテムを取得するクエリ
リストアイテム取得結果=valueを持たないレコード

期待した結果が得られたことが確認できました。

今回のまとめ

今回、以前作成したコネクタを複製し、内容を修正することで新しいコネクタを追加できたことが実証されました。レスポンススキーマが分かっていれば、必要に応じてコネクタを追加することが可能です。しかし、多数のカスタムフィールドを含むリストやライブラリが環境内にある場合、都度コネクタを追加するのは非効率的です。解決策は、環境内の全リストとライブラリの全カスタムフィールドを[fields]に格納することです。Graph APIは存在しないプロパティを無視するように設計されているため、実装者はエラーを心配する必要がなく、一つのメソッドで全てを処理できます。

この記事を書いた人

岩本敏彦

コメント

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