Power BI REST API を使ってデータセットの更新を仕掛ける

手早く実現できるので Microsoft Flow のカスタムコネクタを使うけれども、手順は一緒なので、Logic Apps でも構わない。で、Microsoft Flow には Power BI サービスをサポートする標準コネクタはあるのだけど、用意されていないほかのことをしたいのです。なければ作ればいいじゃない。

# そもそも標準コネクタは？
[Power BI (Preview) - Connectors | Microsoft Docs](https://docs.microsoft.com/en-us/connectors/powerbi/)
いつまでプレビューなのでしょう。長いですね。そのままかも。
## 用意されている Action と Triggers
テンプレートから用意されているからさほどは困らないけれども。
・[テンプレートの閲覧 | Microsoft Flow](https://japan.flow.microsoft.com/ja-jp/templates/)

**Action :** Add rows to a dataset (AddRows)
データセットに行を追加するってことなんだけど、そもそもデータセットがサポートしていなければならないから、ストリーミングデータセットにデータを送り込むときに使っている感じでしょうか。
サポートするデータセットについては以前にポストした。
・[Power BI REST API を使って Push をサポートするデータセットを作成](https://qiita.com/PowerBIxyz/items/d40d95c6f106e66d34ee)

**Triggers :** When a data driven alert is triggered (CheckAlertStatus)
Power BI サービスで設定したデータ アラートを検知してメールを送信したり。
・[Microsoft Flow と Power BI](https://docs.microsoft.com/ja-jp/power-bi/service-flow-integration)

**Refresh a dataset アクションが追加され**
カスタムコネクタ作らなくてもよくなった :smile: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193509/d0160d7d-5e78-a69b-65d1-ef48b10d54f6.png)


## データセットの更新がしたかった
こんな感じのことをしようかと。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/9c23c2a4-0972-33be-4bcc-2ffdb47e6f49.png)
データセットのリフレッシュがしたかったのです。更新のスケジュールは Power BI サービスで設定できるのだけど、別の契機で更新させたいなと。ならば、カスタムコネクタ。

**制限**
先に越えられない制限は更新の回数。データセットごとに限界値があって 8 回/日 ないし 48 回/日で後者は Premium キャパシティ。スケジュールされた更新の回数に含まれ、8 ~~or 48~~ の限界値を超えるものではない。
>In Shared capacities this call is limited to eight times per day (including refreshes executed via Scheduled Refresh)
In Premium capacities this call is not limited in number of times per day, but only by the available resources in the capacity, hence if overloaded, the refresh execution may be throttled until the load is reduced. If this throttling exceeds 1 hour, the refresh will fail.

Premium キャパシティであれば回数の制限はないんですって。

# 情報
最初はいろいろとやることや知ることがあり。
## Power BI REST API
・[Power BI の開発者向け機能 - Power BI | Microsoft Docs](https://docs.microsoft.com/ja-jp/power-bi/developer/what-can-you-do#using-api-automation)
オートメーションに使用できるAPIなのだけど、標準コネクタではその一部(AddRows)で使われているのです。Power BI REST API にはもっと多くの Action が用意されているのでそれを使いたいなと。
### Action
[Power BI REST APIs - Power BI REST API | Microsoft Docs](https://docs.microsoft.com/en-us/rest/api/power-bi/)
眺めているだけでもたくさんのことができるというのがわかる。で、いくつかを使うことにする。
#### Group
まずはアプリのワークスペースからの情報を
##### Groups - Get Groups
[Groups - Get Groups (Power BI REST APIs) | Microsoft Docs](https://docs.microsoft.com/en-us/rest/api/power-bi/groups/getgroups)
参加しているアプリのワークスペースに関する情報を GET する
必要なAPIのアクセス許可 : Workspace.Read.All or Workspace.ReadWrite.All
アプリのワークスペースを参照できればよいので、"Workspace.Read.All" で事足りる。Query パラメータも使えるけどこれも今回では使わない。

```text:HTTP
GET https://api.powerbi.com/v1.0/myorg/groups
GET https://api.powerbi.com/v1.0/myorg/groups?$filter={$filter}&$top={$top}&$skip={$skip}
```
[Admin - Groups GetGroupsAsAdmin (Power BI REST APIs) | Microsoft Docs](https://docs.microsoft.com/en-us/rest/api/power-bi/admin/groups_getgroupsasadmin) ってのがあるけど、これは Office 365 全体管理者 もしくは Power BI サービス管理者 の権限が必要でまさしく管理用途なのでこれは使わない。
#### Datasets
つづいて アプリのワークスペースに配置されたデータセットについて
##### Datasets - Get Datasets In Group
[Datasets - Get Datasets In Group (Power BI REST APIs) | Microsoft Docs](https://docs.microsoft.com/en-us/rest/api/power-bi/datasets/getdatasetsingroup)
必要なAPIのアクセス許可 : Dataset.ReadWrite.All or Dataset.Read.All 

```text:HTTP
GET https://api.powerbi.com/v1.0/myorg/groups/{groupId}/datasets
```
アプリのワークスペースを特定できる groupId が必須。Get Groups で取得した結果を使う感じで。

##### Datasets - Refresh Dataset In Group
[Datasets - Refresh Dataset In Group (Power BI REST APIs) | Microsoft Docs](https://docs.microsoft.com/en-us/rest/api/power-bi/datasets/refreshdatasetingroup)
アプリのワークスペースに配置されたデータセットをRefresh
必要なAPIのアクセス許可 : Dataset.ReadWrite.All 

```text:HTTP
POST https://api.powerbi.com/v1.0/myorg/groups/{groupId}/datasets/{datasetKey}/refreshes
```
アプリのワークスペースを特定する groupId と データセットと特定する datasetKey が必須。
結果をお知らせするオプションを Request Body で POST

```json:RefreshRequest
{
  "notifyOption": "MailOnFailure"
}
```
オプションには、NoNotification / MailOnCompletion / MailOnFailure が用意されているので適宜。

# ひと通り動作まで

## アプリの登録
ともかくこれが必要です。[アプリの登録 - Azure Active Directory 管理センター](https://aad.portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps) で構成してもよいのだけど手間がかからなさそうなツールを使う。

[Power BI Development Center - App Registration Tool](https://dev.powerbi.com/apps) もしくは [Onboarding Embed Tool](https://aka.ms/embedsetup) で。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/07558d55-e82c-f901-d085-67a8ddb48022.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/6d6f3a20-a884-e3d5-42a8-d244b89a3678.png)
Application Name : (お好きな名前で)
Home Page URL : (必要な情報などが配置されているところなど)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/92adf4f6-19ca-23c0-e663-d6970ebccfde.png)
STEP 2 で カスタムコネクタ作成に必要な Client Id と Client secret を取得できる。メモしたら終了でよい。

## カスタムコネクタの作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/c5304a0c-3d50-debd-33a4-4b9c25473e27.png)

### 1.全般
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/4702f6cd-62c3-ad27-4340-9b0b76fb529f.png)
スキーマ : HTTPS
ホスト : api.powerbi.com
ベースURL : /
### 2.セキュリティ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/d6c357a7-2bcb-bb88-f078-96ec4fd34900.png)
認証タイプ：OAuth 2.0

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/a1e9d88f-3298-1bf5-8090-cf7da3e16dc6.png)
ID プロバイダー : Azure Active Directory
Client id : (アプリ登録で取得したもの)
Client secret : (アプリ登録で取得したもの)
Resource URL : https://analysis.windows.net/powerbi/api
リダイレクトURL : カスタムコネクタを保存すると発行される
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/d2d3c87a-9a60-0341-9fb8-e254b327cb52.png)
既に作成されているアプリの[認証]-[リダイレクト URI] を発行されたリダイレクトURLに変更してアプリを更新
### GetGroup
#### 3.定義 - GetGroup
##### 全般
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/7c3f07b2-76f8-828e-86d7-4d341b58460f.png)
表示 : internal
##### 要求
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/b8292469-9cdf-b3de-3476-a05e27375061.png)
[サンプルからインポート]押下
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/f6ad58b0-4380-2c26-e44d-9338a9c38446.png)
動詞 : GET
URL : https://api.powerbi.com/v1.0/myorg/groups

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/f6a4e60b-316a-d672-5dc1-854046298e25.png)

#### 4.テスト - GetGroup
##### 接続
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/c7bb2f67-d685-cfd6-b303-fe883deea54b.png)
[新しい接続]押下

##### 操作
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/ee993658-7cfd-bf92-7edc-8eee013b8475.png)
[テスト操作]押下

##### 応答
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/08313852-c315-ee8a-601a-8b87a80f76ba.png)
応答ボディをコピー

#### 3.定義 - GetGroup
##### 応答
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/4ec26238-a8ed-9048-d601-a98e599a1f54.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/a3023fc5-b769-55c3-5234-cb6aa4153b56.png)
[サンプルからインポート]押下
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/7a6556d8-e759-486b-c1f8-22e3faef2cf9.png)
テストでコピーした応答ボディをペースト [インポート]押下
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/6d42936f-1dcf-48db-a90e-926e9f24dc7c.png)

### GetDatasetsInGroup
#### 3.定義 - GetDatasetsInGroup
##### 全般
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/f4e93e0f-ab64-d285-9a7d-9f289b039ab9.png)
表示 : internal

##### 要求
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/2c0950c7-5462-c414-e09e-54174c38f3a0.png)
[サンプルからインポート]押下
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/4ed61a63-b8c3-3c74-3cfb-7131212628a0.png)
動詞 : GET
URL : https://api.powerbi.com/v1.0/myorg/groups/{groupId}/datasets
##### 要求 - パス
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/e0c1f6fb-2b5c-bf07-59a6-68439e6114f0.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/5c64feda-577a-16c9-c1ca-4c7d63382c45.png)

#### 4.テスト - GetDatasetsInGroup
##### 操作
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/ddf0d9cf-3388-15a8-29eb-1a4e652990b4.png)

##### 応答
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/0c2bcfb0-94b6-f901-01da-b15cbd572f80.png)

#### 3.定義 - GetDatasetsInGroup
##### 応答
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/ea8ef946-dfe0-516f-53db-90527a6e7ccf.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/662307a5-01ba-880a-2100-755a51008f7a.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/6f307be8-2918-6f97-dde2-a397f302b0dd.png)

### RefreshDatasetInGroup
#### 3.定義 - RefreshDatasetInGroup
##### 全般
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/a190601d-4a41-88c2-0e08-9bba6bab77ee.png)

##### 要求
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/e2b5da3a-845f-d689-63d5-79a00daa55c8.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/535c270a-79a5-58bc-e9e7-fc63309fa8a7.png)

##### 要求 - パス - groupId
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/03747504-1111-9f70-c809-b2138dac79b1.png)

##### 要求 - パス - groupId - パラメーター
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/29d6c8b3-0016-96ba-d188-d22289d010f9.png)

##### 要求 - パス - datasetKey
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/c5297146-6a32-3be5-19f8-8505f15bda23.png)

##### 要求 - パス - datasetKey - パラメーター
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/bbcc2ff0-1474-61ef-0c17-ac5d5b9c0a87.png)

##### 要求 - 本文 - body
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/210ea1df-22e3-ba38-c74b-0e504c34fa22.png)

##### 要求 - 本文 - body - スキーマのプロパティ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/b6279e10-7e7f-3d50-819e-e8e1f73da1e4.png)

# 試す
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/d6427855-fe4f-296b-080b-ecaca079b7cf.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/9ab58809-d955-8ab1-0292-1cee0499e997.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/0d27b384-d5bd-ada6-0e0d-e65fbb766d69.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/1bba7620-7c99-df8d-0476-5176ac089ed5.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/a5e7097e-957d-d62a-e8c4-fc92fe834457.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/f830e70b-b248-d348-24e8-a1a8143958e1.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193509/0ad2452d-b7e0-c910-9c06-97fb9f897ee7.png)

# その他
- [Power BI 勉強会 - connpass](https://powerbi.connpass.com/)
- [Power BI Desktop を使い始めるには](http://qiita.com/PowerBIxyz/items/6c4735cb5b5712e70981)
- [Excel で Power Query を使い始めるには](http://qiita.com/PowerBIxyz/items/52e563037b855a099ca9)