Help us understand the problem. What is going on with this article?

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. データが表示されることを確認。
image.png

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

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

プロジェクトの作成

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

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

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

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

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

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

M スニペットの移行

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

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

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

image.png

作業はこれだけです。

テスト

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

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

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

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

簡単ですね。

展開

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

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

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

Power BI Desktop で読み込み

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

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

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

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

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

まとめ

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

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

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

次の記事へ

microsoft
マイクロソフトのメンバーが最新の技術情報をお届けします。Twitterアカウント(@msdevjp)やYouTubeチャンネル「クラウドデベロッパーちゃんねる」も運用中です。
https://aka.ms/MSFT-Docs-JPN
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした