Power BI から HTTP リクエストをリンクで送って Flow で受け取る方法

##はじめに
みなさん、こんにちは。Power BI MVP 清水です。最近は周りからのあだ名で Power BI 王子を自分で認知しつつある今日この頃です。
さて、今回は Power BI の画面から HTTP リクエストを送る方法を紹介します。

Excel から Microsoft Flow を起動するという機能がありますが、それの Power BI 版を実現するイメージです。
Excel の例は以下の Microsoft 吉田さんの記事を参考にしてください。
**[Microsoft FlowがExcelから直接起動可能に]**
https://memo.tyoshida.me/powerapps/run-microsoft-flow-from-excel/

##今回のゴール
ご紹介する方法を実施すると以下の動画のようなことができます。
記事が長くなっているので、動画を先に確認していただいて、もしイメージが合っていれば、以下を読み進めてください。
https://powerbistudy01.blob.core.windows.net/movie/InvokeFlowFromPowerBI/FlowInvokeByURLFromPowerBI_2.mp4

##Power BI の画面から HTTP リクエストを送りたい
Power BI に限らず、BI の画面を見ていると、データに関して何らかのアクションが取りたくなることがしばしばあります。考えてみればこれは当然のことで、BI (Business Intelligence) とはネクストアクションを取るための経営手法だからです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/cbd19f52-d50f-4a4e-bffe-5c0eeafd2bf1.png)
この画像は私が「BI とは」を説明する際に使用する図です

このネクストアクションが実際の行動というよりは、何らかのデータ連携であることは珍しくありません。ただ、BI の画面はもともとデータの可視化に特化しているものが多いので、まだまだそういったアクションを簡単に作れるものはあまりありません。Power BI の場合はその部分を同じ Power Platform に属する PowerApps に委ねています。

PowerApps で実現したい方は以下の記事を参考にしてください
[Power Platform] PowerApps + Microsoft Flow + Power BI の連携方法 Vol.1 ～準備編～
https://qiita.com/yugoes1021/items/b62111ca7bf22d35296b

今回は PowerApps を使わずに実現します。

##前提知識
マイクロソフト公式の docs.microsoft.com の以下の記事をまず一読してください。
**テーブルにハイパーリンクを追加する**
https://docs.microsoft.com/ja-jp/power-bi/power-bi-hyperlinks-in-tables

データに URL を作っておいて、データカテゴリで Web URL を指定することで、テーブル または マトリックス でそのデータを表示すると、ハイパーリンクになります。これを利用して、今回は実現します。

ご存知の通りハイパーリンクは **HTTP** では **Get** 命令になります。ということは **HTTP Get** 命令を受け取れる **API** を作れば、理論上はどのサービスにでもデータを渡せます。ただし単なるリンクなので、データを **Body** で送ることはできません。ではどうするか？ **URL パラメータ**を使用しましょう。

https://www.google.co.jp/search?q=yugoes1021

URL パラメータとは、URLクエリパラメータとかクエリ文字列とも呼ばれるもので、上記 Google の例で言うと ? マーク以降 **(?q=yugoes1021)** がそれに当たります。**Key=Value** という形でパラメータを **Web サイト**に渡すことができます。複数のパラメータを渡す場合は **&** でつなげて、**?Key1=Value1&Key2=Value2** といった形で複数のパラメータを渡すことが可能です。

これを利用して Power BI で行ごとに URL を作成しておく必要があります。

##Power BI Desktop で URL のデータを作成しておく方法
Power BI で以下のようなデータを作ります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/568055d6-78a2-0e90-6260-ddc62ab38f18.png)

もっとも簡単なのは Excel でデータを作ってテーブルとして書式設定してしまうことです
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/85018616-a3c5-9145-df6d-ac3c18af9d86.png)

でこのファイルを Power BI Desktop で指定して読み込んでください
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/0ab8509a-2c57-3988-f998-aa40346f85a0.png)

正常に読み込めると以下のような状態になります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/10f01552-2310-c029-ee69-996b16c553dc.png)

Power BI はいったんこの状態で置いておきます。

##Microsoft Flow でリクエストを受け取るフローを作る
https://flow.microsoft.com に行ってください。Power BI のアカウントがあれば、同じアカウントで使える可能性が高いです。

今回作るフローの完成形はこんな感じです
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/0b614098-38a4-84e9-fa85-0077724cf865.png)

- トリガー：HTTP トリガー
- アクション：メール送信、応答

メインで必要になるものは上記です。
変数は URL パラメータでもらう値の数分定義しています。今回はメールアドレスとリダイレクトURLの２つです。

#HTTP トリガー
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/c6911bf0-0dbc-e2db-eb73-dc75e10e19df.png)

HTTP トリガーは本来 JSON を POST されることを前提にしています。が、今回は GET 命令を受け取るので、method を GET にしておきます。これで URL リンクがクリックされても動作します。また URL リンクでは JSON データを送ることはできないので [要求本文の JSON スキーマ] は必要ないのですが、HTTP トリガーではこれが必須となっているので、テキトーに受け取るように設定してください。私の場合は `{ "key":"value" }` 受け取るように JSON スキーマを定義しています。この JSON をコピーして **[サンプルのペイロードを使用してスキーマを生成する]** をクリックして開く画面に張り付けると、画面のように JSON スキーマが生成されます。

#HTTP トリガーで URL パラメータを取得するには
HTTP トリガーでは **headers** と **queries** が取得できます。実は今回 **URL パラメータ**を取得するのにどうやったら取れるか試していた時、こんなエラーが出ました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/da3f095c-8a8c-5f8a-f241-40737f8b5722.png)

この時は **params** という名称を指定していたのですが、メッセージにあるように「知らんけど」って言われました。ただ助かったのは
**available properties are 'headers, queries'**
というところです。エラーメッセージは最後まで読まなきゃですね。
指定できるプロパティは **headers** と **queries** だよとのこと。ならば、ということで queries を指定したらビンゴで無事に URL パラメータで送信した値を取得できました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/facde233-7a41-552c-0063-a598c1c6b795.png)
実際にはこの **JSON の解析** アクションの **コンテンツ** に `triggerOutputs()['queries']` を指定します。指定する際は **[コンテンツ]** にカーソルを置いて、**[動的なコンテンツの追加]** をクリック ⇒ 右側に出てきた画面の上部で **[式]** をクリックして **fx** の欄に `triggerOutputs()['queries']` を入力してください。

スキーマは今回の場合だと `{ "mail":"aaa@sample.jp", "RedirectURL":"https://sample.jp" }` という形になります。これは **URL パラメータ** 数の分だけ JSON の Key-Value の組を定義すれば OK です。

**例）**
URLパラメータ：`?key1=value1&key2=value2&key3=value3`
queries で取れる JSON：`{ "key1":"value1", "key2":"value2", "key3":"value3" }`

といった感じです。JSON を作ったら HTTP トリガーの時と同様、**[サンプルのペイロードを使用してスキーマを生成する]** で貼り付ければ OK です。

#変数初期化
URL パラメータの数だけ変数を作っておくと楽です。作らなくてもできますが、処理が失敗した場合に追いやすくなるとか、後でそのルールで作っておくと、ぱっと見でパラメータがいくつ必要かなど、わかることが多くなります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/7782986d-f6a0-6771-1129-2051b852ff5f.png)

変数の **[名前]** はわかりやすいものを、種類は **[文字列]** にしてください。**[値]** にはさきほどの **[JSON の解析]** アクションで JSON にて定義した値を選択してください。

#現在の時刻～タイムゾーンの変換～メールの送信
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/8db198a2-d95e-74e1-cea8-fe6488360cd9.png)
**現在の時刻** と **タイムゾーンの変換** は必須ではありません。が、ついでなので、大事なことをひとつ。**Microsoft Flow** に限りませんが、クラウドサービスは基本的に **日時** を **UTC (GMT)** で保持しています。なので **日本時間 (JST)** で保存や表示したい場合は、サーバーの日時を取得して、**JST** に変換する必要があります。**Microsoft Flow** ではこのように **[現在の時刻] - [タイムゾーンの変換]** でそれが可能です。

今回は送信するメールの本文に **送信時刻(Sent time)** を表示したかったため、入れてあります。
**メールの送信** は Office 365 の Outlook を使用していますが、ここは何でも OK です。Gmail も使えますし、お好きなものを使用してください。またメールでなくても **Microsoft Teams** や **Slack** などでメッセージを送ることも可能です。

あるいは誰かがリンクをクリックしたログとして保存したい場合は、**Azure Storage** や **SharePoint Online** のリスト、**OneDrive** 上の **Excel**、**Azure SQL Database** など、様々なものに保存することが可能です。用途・要件に合わせて試してみてください。

#応答
はい、Flow の最後です。**応答** アクションは **HTTP Response** を返すためのアクションです。今回は Power BI からリンククリックで起動されますが、どうしても PC で既定のブラウザが開いてしまいますので、リダイレクト URL を持たせて、開いたブラウザで強制的にリダイレクトをさせるようにしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/6f908c16-bdb1-edd5-1ee4-420c8e0c69be.png)

リダイレクトさせるために、まずブラウザに本文が **HTML** だと認識させる必要があります。これは **ヘッダー** に `Content-Type: text/html; charset=Shift_JIS` を指定する必要があります。ここでは `Shift_JIS` にしてますが `UTF-8` でも問題ないと思います。

次に本文です。強制的にリダイレクトさせるために以下の **HTML** を記述してます。

```HTML
<html>
    <head>
        <meta http-equiv="refresh" content="0; URL='@{variables('リダイレクトURL')}'"/>
    </head>
</html>
```

`URL=` の後ろは本文にカーソルを置いて右に表示される画面から **[リダイレクトURL]** を選べば、上記のコードが記載されます。

#Flow の保存
最後に私もよく忘れるのですが、Flow はちゃんと保存をしましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/18b9f072-055e-d5ab-2d78-39441266343c.png)

左上で Flow に **名前** を付けて、右側で **[保存]** です。Flow の一番下の **[保存]** ボタンでも OK です。

そして Flow を閉じる前にこのフローを呼ぶための URL をコピーしておく必要があります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/ac810637-4bb7-ec7b-4f5f-49ed63e40d83.png)

**[HTTP 要求の受信時]** を開いて赤枠のボタンを押すと URL がコピーできます。
`https://prod-xx.japaneast.logic.azure.com:443/workflows/XXXXXXXXXXXXXXXXXXXXX/triggers/manual/paths/invoke?api-version=2016-06-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=xxxxxxxxxxxxxxxxxxxxxxxx`
こんな感じの URL です。
コピーしてメモ帳にでも貼り付けておいてください。

#Back to Power BI (再び Power BI へ)
はい、戻ってきました Power BI。まずは先ほどの **Flow** を起動するための **URL** をパラメータ化しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/b2af95b4-5c50-37b2-6d98-58c045931e45.png)

Power Query エディターで左側の **[クエリ]** の部分を右クリックして [新しいパラメーター] をクリックしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/8cbd1e13-96f8-b56e-c2e8-582490cf81fc.png)

- 名前：任意の値
- 種類：テキスト
- 提案された値：任意の値
- 現在の値：(コピーした URL)

入力が終わったら **[OK]** ボタンをクリックしてください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/10f01552-2310-c029-ee69-996b16c553dc.png)
ここから新たに列を追加して、先ほどの URL の後ろに URL パラメータとして **メールアドレス** と **リダイレクトURL** を値として、設定してます。言葉で説明すると難しく聞こえますが、つまりは **文字列連結** をします。

リボンの [列の追加] - [カスタム列] をクリックすると以下の画面が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/1b1cf428-3e1e-0ba7-2147-108e7a225b19.png)

- 新しい列名：（任意の名称）← 私は InvokeFlow としてます
- カスタム列の式：`FlowLink & [Mail] & "&RedirectURL=" & [RedirectURL]`
 - FlowLink：先ほど作ったパラメータ
 - [Mail]：Mail 列
 - &：テキスト型の列を連結する場合は & を使います
 - "&RedirectURL="：ダブルコーテーション(") は文字列を表します
 - [RedirectURL]：RedirectURL 列

```FlowInvoke.url
https://prod-06.japaneast.logic.azure.com:443/workflows/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/triggers/manual/paths/invoke?api-version=2016-06-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&mail=yugo@xxxxxxxxxx.com&RedirectURL=https://qiita.com/yugoes1021
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/725caa41-261c-aa94-1ae6-1af32e5d0ab0.png)

こうすると **[InvokeFlow]** という列が追加され、各行の **[Mail]** 列と **[RedirectURL]** 列の値が **URL パラメータ** の形で付加されます。ここまで行けばデータとしては OK です。リボンの **[ホーム]** - **[閉じて適用]** をクリックしましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/d5f9f121-fb9c-1b62-f7f7-da872e617858.png)

##URL を URL として認識させる
Power BI Desktop のレポートを作成する画面(Report Pane)に戻って、**[視覚化]** でテーブルを選んでデータを表示してみてください。
そうすると以下の画像の一番左の **[InvokeFlow]** 列のように URL が表示されているが、リンクではない状態で単なる文字列になっています。これを URL リンクとして認識させるには画面右側 **[フィールド]** で **[InvokeFlow]** を選択して **[リボン]** - **[モデリング]** - **[プロパティ]** - **[データカテゴリ]** で **[Web URL]** を選んでください。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/5f66e281-c5a1-3b1f-b036-0bb5332d2e9a.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/10331be7-88c9-4418-3ce6-f6f72cdf0666.png)

※ちなみにもしデータに画像の URL があって、Power BI のレポートで画像を表示したい場合は **[イメージの URL]** にすると画像が表示されます

次にテーブルを選んで **[書式]** - **[値]** - **[URL アイコン]** を **ON** にすると URL がアイコンに変わります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/344d47a7-1e5f-4965-b2d4-37d9aefe730a.png)


##動作確認
![image.png](https://qiita-image-store.s3.amazonaws.com/0/152946/aa800e4d-b80a-0dd9-7449-d946866136f6.png)

あとは冒頭の動画のようにメールと Flow を開いておいて、**[InvokeFlow]** をクリックしてみてください。うまく動作しない場合は、Flow の実行履歴を見て、どこまで動いているかを確認するとよいと思います。

##最後に
いかがでしたか？無事に動きましたか？

無事に動作した方は、ぜひこれを何に利用するか、考えてみてください。
**Flow** が呼び出せてデータを渡せるということは **Flow** で使えるコネクタにデータを渡せることを意味します。

**Power Platform** は突き詰めると **データ連携** ですので、

- 何のデータを
- どこに
- どんなタイミングで渡すのか
- 渡した後に何が起こるのか
- その目的は？

を考えないと**使いこなせません**！！！
**In Power Platform, No benefits without DATA.**

なにか不明なところがあれば、この記事のコメント欄でも結構ですし、[Twitter: yugoes1021](https://twitter.com/yugoes1021) でも結構ですので、お気軽にメッセージをください。

**Happy Power Platform Life (*'▽')**