Power BI カスタムコネクター開発 : いつも使っている Power Query をパッケージする


この記事では、すでに持っている M コードを Power BI カスタムコネクタとしてパッケージする方法について紹介します。普段 PowerPlatform しか使っていないから Visual Studio とか開発はちょっとという方にも、はじめの一歩としてお勧めです。

前提条件

それぞれウィザードに従ってインストールしてください。Visual Studio のどの機能が必要かまでは情報がないので、気になるワークロード適当に入れてみてください。

既存の M スニペットから始める

みなさんがどんなコードを使っているか知らないので、ここでは TripPin Service という認証不要の JSON データを返すだけの Web サービスをデータソースにします。

データを読み込む

1. Power BI Desktop を開いて「空のクエリ」を選択。

2. 詳細エディタで以下の関数一つを含むスクリプトを張り付け。

let    
    GetAirports = () as table =>
        let
            DefaultRequestHeaders = [
                #"Accept" = "application/json;odata.metadata=minimal",
                #"OData-MaxVersion" = "4.0"
            ],
            source = Web.Contents("https://services.odata.org/v4/TripPinService/Airports", [ Headers=DefaultRequestHeaders ]),
            json = Json.Document(source),
            value = json[value],
            toTable = Table.FromList(value, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
        in 
            toTable,
    airports = GetAirports(),
    #"Expanded Airport" = Table.ExpandRecordColumn(airports, "Column1", {"IcaoCode", "Name", "IataCode", "Location"}, {"IcaoCode", "Name", "IataCode", "Location"}),
    #"Expanded Location" = Table.ExpandRecordColumn(#"Expanded Airport", "Location", {"Address", "City", "Loc"}, {"Address", "City", "Loc"}),
    #"Expanded City" = Table.ExpandRecordColumn(#"Expanded Location", "City", {"CountryRegion", "Name", "Region"}, {"CountryRegion", "Name.1", "Region"}),
    #"Expanded Loc" = Table.ExpandRecordColumn(#"Expanded City", "Loc", {"type", "coordinates", "crs"}, {"type", "coordinates", "crs"}),
    #"Extracted Values" = Table.TransformColumns(#"Expanded Loc", {"coordinates", each Text.Combine(List.Transform(_, Text.From), ","), type text}),
    #"Expanded crs" = Table.ExpandRecordColumn(#"Extracted Values", "crs", {"properties"}, {"properties"}),
    airportsDetail = Table.ExpandRecordColumn(#"Expanded crs", "properties", {"name"}, {"crs"})
in
    airportsDetail

3. データが表示されることを確認。

4. カスタムコネクタを読み込むには設定を変える必要があるので、設定を変更する。

ではこの M スニペットをカスタムコネクタにしていきます。

プロジェクトの作成

1. Visual Studio 2019 を開いて「新しいプロジェクトの作成」をクリック。

2. Data Connector Project で検索してテンプレートを選択。

3. プロジェクト名を指定。ここでは TripPinConnector として作成。プロジェクトが作成されると複数のファイルが作成されるが、重要なのは以下のファイル。

  • *.pq ファイル: コードを書くメインのファイル
  • *.query.pg ファイル: テスト用のファイル

4. pq ファイルを開いて中身を確認。

安心してください。M 言語です。

M スニペットの移行

次にスニペットを以降していきます。ほぼ同じ構文ですが、Power BI の詳細エディタと異なりすべての関数を一気に書かないため、それぞれの関数の終わりはセミコロン[;]にします。

1. GetAirports 関数を張り付ける。場所は任意だがここでは shared セクションの直下とした。関数の最後がセミコロンである点に注意。

2. 次の残りのコードを shared に移行。

作業はこれだけです。

テスト

書いたスクリプトが動作するかテストします。

1. query.pq ファイルを開き、既存の shared 関数を実行していることを確認。

2. F5 キーを押下するか「開始」ボタンをクリック。認証の設定を聞かれるので、Anonymous を選択し「Set Credential」で保存。

3. 再度 F5 を押下。結果が表示されることを確認。

簡単ですね。

展開

最後にコネクタをパッケージして展開してみましょう。

1. プロジェクトを保存したフォルダ | bin | Debug にある *.mez ファイルをコピー。

2. ファイルを C:\users\user_name\Documents\Power BI Desktop\Custom Connectors フォルダにコピー。なければ手動で作成。

Power BI Desktop で読み込み

1. Power BI Desktop を再起動して「データを取得」を選択。

2. "TripPin" で検索して接続。

3. メッセージが出るので読んで「続行」をクリック。

4. 匿名認証のみ表示されるので、「接続」をクリック。

5. 必要に応じて「読み込み」または「データの変換」を実行。操作は通常のコネクタと同様。

まとめ

この記事では、細かいことはさておき、まずカスタムコネクタを開発する手順について説明しました。まだまだ疑問は多くあると思います。

  • 関数名は変更できるか?
  • 他の機能などはどう実装するのか?
  • ブランディングはどうやるのか?
  • Debug ビルドのままでいいの?
  • 認証あるエンドポイントはどうするか?

これらの疑問は以降の記事で紹介していきます。次はよくある認証のパターンとして OAuth を扱います。エンドポイントは Microsoft Graph です。待ちきれない方は My Graph sample にあるサンプルを参照してください。説明のリンク切れてる問題がありますが。。

次の記事へ