次の方法で共有


カスタム コネクタ開発に関するよくある質問

Power Query のカスタム コネクタの開発中に発生する一般的な問題に対する回答を次に示します。

全般

...の場合、警告の表示は可能ですか?

警告を返す方法について、パターン化して文書化されていますが、それ以外では、テーブルやメタデータが大きすぎるなどの警告を返す方法については提示されていません。

テーブルのパーティション情報を表示するために、ナビゲーション階層にレベルを 1 つ追加して、1 つ以上のパーティションをユーザーに選択してもらうことは可能ですか?

エンド ユーザーがデータの 1 つのパーティションを頻繁に取得する場合は可能です。 ただし、この機能は既存のコネクタには追加できません。 これを追加すると、既存のコネクタが破損します。

トラブルシューティング

開発中のカスタム コネクタがあり、Power BI Desktop では正常に動作するのですが、 Power BI サービスで実行すると、資格情報を設定したり、データ ソースを構成したりできません。 理由

このような動作が起こる理由はいくつかあります。 Power BI サービスでコネクタを実行中に発生する一般的なエラーを次に示します:

  • データ ソースの資格情報を更新できませんでした
  • OAuthProviderDataSourceReference から取得中に例外が発生しました
  • 指定された種類のデータ ソースはサポートされていません

この動作のトラブルシューティングを始める前に、カスタム コネクタ (.pq ファイルまたは .mez ファイル) のコピーを収集してください。 .mez ファイルがある場合は、ファイルの名前を .zip に変更して .pq ファイルを抽出します。

カスタム コネクタのトラブルシューティングを行うには:

  1. お手持ちのテキスト エディターでカスタム コネクタ ファイル (.pq) を開きます。

  2. TestConnection 関数を検索します。 スケジュールされた更新を Power BI サービスで使用するには TestConnection 関数が必要ですが、Power BI Desktop で使用されていません。 TestConnection 実装の .pq ファイルをチェックし、パラメーターがコネクタのデータ ソース関数と一致することを確認してください。 詳細情報: ゲートウェイ サポートの処理

  3. コネクタで OAuth が使用されている場合は、state パラメーターを確認します。 サービスのみでエラーが発生する場合、その理由の多くは、 state パラメーターがコネクタの StartLogin 実装で見つからないことです。 これが Power BI Desktop で使用されていませんが、Power BI サービスでは必須のパラメーターです。 state パラメーターを Uri.BuildQueryString の呼び出しに渡す必要があります。 state の正しい実装例を次に示します。

StartLogin = (resourceUrl, state, display) =>
  let
      authorizeUrl = authorize_uri & "?" & Uri.BuildQueryString([
          response_type = "code",
          client_id = client_id,
          state = state,                 //correct implementation
          redirect_uri = redirect_uri,
          resource = resource
      ])
  in
      [
          LoginUri = authorizeUrl,
          CallbackUri = redirect_uri,
          WindowHeight = 720,
          WindowWidth = 1024,
          Context = null
      ];

スキーマやデータベースを Power Query ナビゲーターで開くと、テーブルが選択されるまで待機するのではなく、データベースにあるすべてのテーブルの取り込みが即座に開始されます。 この原因は何ですか?

この問題は、ナビゲーション テーブルの作成方法が原因である可能性があります。 新しいレコードの作成に Table.TransformRows を使用すると、通常はデータ テーブルの先行評価が行われます。 しかし、Table.AddColumn により、値が遅れて生成されます。 そのため、次のコード例のように、ユーザーのクエリがこのデータを参照していない場合、"each GetSchemas(url, [name])" は評価されません。

GetShares = (server_host as text) as table =>
    let
        url =  server_host & "/shares",
        shares = GetItems(url),
        withData = Table.AddColumn(shares, "Data", each GetSchemas(url, [name])),
        withItemKind = Table.AddColumn(withData, "ItemKind", each "Folder"),
        withItemName = Table.AddColumn(withItemKind, "ItemName", each "Folder"),
        withIsLeaf = Table.AddColumn(withItemName, "IsLeaf", each false),
        renamed = Table.RenameColumns(withIsLeaf, {{"name", "Name"}, {"key", "Key"}}),
        navTable = Table.ToNavigationTable(renamed, {"Key"}, "Name", "Data", "ItemKind", "ItemName", "IsLeaf")
    in
        navTable;

1 つのテーブルが複数のパーティション分割されたファイルで構成されています。 現在の実装では、プレビューを表示する前にすべてのファイルがダウンロードされます。 すべてのファイルをダウンロードするのではなく、プレビューに十分な行数に達した時点でファイルのダウンロードを止める方法はありますか?

この問題は、Table.Combine を使用したために起きています。 代わりに、"テーブルのテーブル" を作成し、Table.ExpandTableColumn 関数を使用することができます。 このメソッドは、必要に応じてパーティションを遅れて展開します。 次に例を示します。

GetFiles = (tables_url as text, table_name as text) as table =>
    let
        // parse raw ndjson and get the list of parquet files
        // resp format: line 1: protocol, line 2: schema, line 3..:file info
        resp = Lines.FromBinary(SendRequest(tables_url & "/" & table_name & "/query", [
            Headers= [#"Content-Type"="application/json"],
            Content= Text.ToBinary("{}")
        ]), null, null, 1252),
        protocol = resp{0}, // TODO: Add protocol version check
        schema = Json.Document(Json.Document(resp{1})[metaData][schemaString])[fields],
        columnNames = List.Transform(schema, each [name]),

        fileInfos = List.Range(resp, 2),
        fileUrls = List.Transform(fileInfos, each Json.Document(_)[file][url]),
        numFiles = List.Count(fileUrls),

        toTable = Table.FromList(fileUrls, Splitter.SplitByNothing(), {"FileUrl"}),
        processPartition = Table.AddColumn(toTable, "Data", each Parquet.Document(Binary.Buffer(ProtectSensitiveQueryParameters([FileUrl], [ManualCredentials = true])))),
        removeFileUrl = Table.RemoveColumns(processPartition, {"FileUrl"}),
        expanded = Table.ExpandTableColumn(removeFileUrl, "Data", columnNames)
    in
        if numFiles = 0 then #table(columnNames, {}) else expanded;

ProtectSensitiveQueryParameters = (url as text, options as record) =>
    let
        uriParts = Uri.Parts(uri),
        uriWithoutQuery = Uri.FromParts(uriParts & [Query = []]),
        modifiedOptions = options & [
            CredentialQuery = uriParts[Query],
        ]
    in
        Web.Contents(uriWithoutQuery, modifiedOptions);

追加情報

Note

カスタム コネクタの開発に関する問題は、Microsoft サポートと専門知識の範囲外です。 カスタム コネクタの開発に関するサポートが必要な場合、または報告したいフィードバック、提案、バグがある場合は、GitHub の公式パブリック リポジトリにアクセスするか、推奨されるサード パーティのカスタム コネクタ開発者コンサルタントとやり取りしたい場合は、Microsoft の担当者にお問い合わせください。