【働き方の可視化】Power BI × Graph API で O365 のデータを取得する方法

#働き方の可視化に Power BI × Graph API が便利！
コロナ禍でオンラインでの働き方が推奨された背景もあり、O365 を活用し家で仕事するという機会が増えたと思います。企業によっては在宅時の勤務時間を管理したいという会社もあり、クラウドサービスの利用履歴から勤務時間を算出するといった試みもあるかと思います。O365 標準でユーザーのアクティビティを取得することはできますが、企業ごとに抽出したいデータを選択し可視化するためには少し作りこみが必要です。
そこで便利なのは、Microsoft の BI ツールである [Power BI](https://docs.microsoft.com/ja-jp/power-bi/fundamentals/power-bi-overview) と、O365 のデータにアクセスすることができる [Graph API](https://docs.microsoft.com/ja-jp/graph/use-the-api) です。しかし、Power BI から Graph API を呼び出すコネクタは限られているので、匿名アクセスを使用して Graph API を呼び出す必要があります。今回の記事ではその方法についてご紹介します。

**Power BI の概要を知りたい => [PowerBI 概要](https://docs.microsoft.com/ja-jp/power-bi/fundamentals/power-bi-overview)**
**Graph API 概要を知りたい => [Graph API 概要](https://docs.microsoft.com/ja-jp/graph/use-the-api)**

#手順概要
主な手順は 3 STEP です。具体的なクエリについては今回の記事では触れません。とりあえず Power BI から Office 365 の　Users の情報を Graph API 経由で取得することを試して見たいと思います。

- Azure AD でアプリ登録
- Power BI でアクセストークンを所持させるクエリを作成
- Power BI で Graph API を呼び出す 

前提条件としては、① Power BI Desktop (無料) をインストールしている環境、Office 365 の管理者権限、です。今回はこの二つが既に準備されている前提で説明しますが、わからないという方は以下の記事が参考になるかと思います。

**Power BI のインストール方法を知りたい => [Power BI Desktop の取得](https://docs.microsoft.com/ja-jp/power-bi/fundamentals/desktop-get-the-desktop)**
**Office 365 の管理者ページにアクセスしたい => [Microsoft 365 管理センターについて](https://docs.microsoft.com/ja-jp/microsoft-365/admin/admin-overview/about-the-admin-center?view=o365-worldwide)**

#Azure AD で アプリ登録
では早速やっていきましょう。まずは Office 365 の管理センターに管理者アカウントでアクセスします。
**Office 365 の Admin Portal にアクセスしたい => [Microsoft 365 管理センター](https://admin.microsoft.com/#/homepage)**
左側のメニューを広げると `Azure Active Directory` へのリンクがあるので、それをクリックし O365 テナントの Azure AD にアクセスしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/0d96107a-b048-62bb-f6b0-0d94aa5a1db2.png)
Azure AD には入れたら、左のメニューの `アプリ登録` を選択します。英語だと `App Registrations` ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/61aa1f99-ab5b-7d9a-fc7e-41626407171e.png)
新しくアプリ登録を実行します。`+New Registration` をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/437dc517-a1be-7db3-5185-35997200f3d1.png)
アプリの名前はサンプルで `Graph API Sample App` とします。この APi へのアクセスはシングルテナントの該当のテナントのみからのアクセスを選択します。Ridirect URI は空欄ままで大丈夫です。(ここは Azure AD B2C の認証などでリダイレクトを設定する際に使用します。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/94421e20-9069-3ec9-ec76-314ed5d9f0de.png)
登録したアプリの情報を見てみます。ここで ID がいくつか出てきていると思います。この情報を使用することで Power BI から Access Token を所持させて Graph API を呼び出すことができます。今回使用するのは、①Applicatoin ID と ②Directory ID なのでこれらを Notepad などにコピペしておきます。(あとで使用します。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/9af6e13d-009d-e98a-7755-9eea6c41439b.png)
次に API アクセスを付与させます。API Permissions から設定することができます。Graph API は GUI ベースで権限を付与させることができるので非常に便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/26e738ba-3a69-f37e-2685-32b30396131b.png)
ちょくちょく仕様が変わるので、このあたり、どこをクリックするかは敢えて解説を割愛しますが、基本の流れは、API Permissions → + Add a permission -> Microsoft Graph -> Users の権限をすべて許可 -> 最後に権限を与える確認、です。こちらの Gif 画像を参照ください。
![aadappreg.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/694c6e54-251a-a1d6-10c0-932e4b20c7f8.gif)
**Azure AD でアプリ登録の詳しい手順を知りたい => [Microsoft ID プラットフォームにアプリケーションを登録する](https://docs.microsoft.com/ja-jp/azure/active-directory/develop/quickstart-register-app)**
最後に Secret を取得します。左のメニューの `Certificates & secrets` から新しく Secret を取得します。このシークレットは一度しか表示されないので、作成したタイミングで忘れずに Notepad にコピペしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/343dda6a-984c-101c-34cb-eb7c8cba75f8.png)
これで Azure AD にアプリを登録は完了です。あとは Power BI 側に必要な権限を持たせて呼び出すだけです！
**シークレットの作成方法をもう少し詳しく知りたい => [新しいアプリケーション シークレットを作成する](https://docs.microsoft.com/ja-jp/azure/active-directory/develop/howto-create-service-principal-portal#option-2-create-a-new-application-secret)**

#Power BI でアクセストークンを所持させるクエリを作成
Power BI では主に二つのクエリを作成します。ひとつは Graph API で O365 のデータにアクセスするための Access Token を持たせるクエリ、もうひとつは Access Token を基に Graph API を呼び出すクエリです。まずは Access Token を持たせるクエリを作成します。
まずはクエリエディターで `AzureAccessToken` という名前のクエリを作成します。クエリの作成方法や PowerBI の UI が分かりにくい方はこちらのドキュメントをご覧ください。
**Power BI でクエリを作成する方法を知りたい => [Power BI Desktop でのクエリの概要](https://docs.microsoft.com/ja-jp/power-bi/transform-model/desktop-query-overview)**
クエリエディターで新しい `AzureAccessToken` というクエリを作成できたら、詳細エディターを開き、以下のクエリを入力します。↓詳細エディターは ホーム > クエリカテゴリーの詳細エディターを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/b0b93b83-0c66-875f-ef03-f5f3c4ba87f3.png)
**詳細エディターでクエリを編集する方法を知りたい -> [カスタム列に対して詳細エディターを使用する](https://docs.microsoft.com/ja-jp/power-bi/create-reports/desktop-add-custom-column#use-the-advanced-editor-for-custom-columns)**

```M
let
    TokenResponse = Json.Document(Web.Contents("https://login.windows.net/<コピペしたテナント ID>/oauth2/token", 
    [
    Content = Text.ToBinary(Uri.BuildQueryString([
            client_id = "<コピペしたクライアント ID>", 
            resource = "https://graph.microsoft.com", 
            grant_type = "client_credentials", 
            client_secret = "<コピペした Secret>"
        ])), 
    Headers = [Accept = "application/json"], ManualStatusHandling = {400}
        ]
    )),
    AzureAccessToken = TokenResponse[access_token]
in
    AzureAccessToken
```
入力すると自動的にクエリが実行され、なにやら Access Token の様なランダムの値がみることができると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/4654d0c8-11ae-9bdd-5105-53c8da90af3e.png)
これで Access Token の取得は完了です。次にこの Access Token を所持させながら Power BI から Graph API を呼び出すクエリを作成します。
#Power BI で Graph API を呼び出す
新しいクエリを作成します。空のクエリの作成方法は先ほどと同様です。
クエリには以下を入力します。今回は O365 にあるユーザーの情報を持ってくる Graph API を実行しています。

```M
    let
        Users = OData.Feed("https://graph.microsoft.com/beta/users?$select=id, deletedDateTime, accountEnabled, AgeGroup, assignedLicenses, assignedPlans, businessPhones, city, companyName, consentProvidedForMinor, country, createdDateTime, creationType, department, deviceKeys, displayName, employeeHireDate, employeeId, employeeOrgData, employeeType, externalUserState, externalUserStateChangeDateTime, faxNumber, givenName, identities, imAddresses, infoCatalogs, isResourceAccount, jobTitle, lastPasswordChangeDateTime, legalAgeGroupClassification, licenseAssignmentStates, mail, mailNickname, mobilePhone, officeLocation, onPremisesDistinguishedName, onPremisesDomainName, onPremisesExtensionAttributes, onPremisesImmutableId, onPremisesLastSyncDateTime, onPremisesProvisioningErrors, onPremisesSamAccountName, onPremisesSecurityIdentifier, onPremisesSyncEnabled, onPremisesUserPrincipalName, otherMails, passwordPolicies, passwordProfile, postalcode, preferredDataLocation, preferredLanguage, provisionedPlans, proxyAddresses, refreshTokensValidFromDateTime, showInAddressList, signInSessionsValidFromDateTime, state, streetAddress, surname, usageLocation, userPrincipalName, userType", [ Authorization = "Bearer " & AzureAccessToken ], [ Concurrent = true, ODataVersion = 4, Implementation = "2.0" ])
    in
        Users
```
少し長いですが、今回は取得するクエリをひとつずつ指定してあげています。実はこれは重要で、Graph API は取得できる値がどんどんアップデートされていくので、ある程度パラメータを指定してあげた方が表に落とし込むときに便利です。
また Graph API にはクエリパラメータを設定する詳細情報があります。色々な情報を取りたい時に是非参考にしてください。
**Graph API でクエリパラメータを使用して取得できる値をカスタマイズしたい => [クエリ パラメーターを使用して応答をカスタマイズする](https://docs.microsoft.com/ja-jp/graph/query-parameters)**

では、実際に結果はどうなるでしょうか。上述のクエリを実行するとこんな感じで表が作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/7869a876-5753-d91a-50a2-c2f315056c89.png)
O365 の値を取得することができました！
もろもろ値が入っていない部分もありますが、これは私の O365 検証環境にユーザーが3名しか入っておらず、それぞれのプロフィールや所属を詳細に設定していないからです。もし本番環境などの実際にユーザーが使用している環境だとより具体的なユーザープロフィールが取得できると思います。
ちなみに Graph Explorer でサンプルの O365 環境の値を取得することができるので、users でどんな値が取得できるか試すことができます。Graph Explorer で実行した API は `https://graph.microsoft.com/v1.0/users` です。
![aadappreg2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/b794d18c-2c52-c35b-41c1-99b0af595b54.gif)
Graph API で取得できるものは Power BI から呼び出せるということがイメージができたと思います。Graph API には様々な取得できる値があるので、以下の参考リンクから Graph API を実行してみたり、Graph API のドキュメントからどんな値が取得できるのか参考にしてみてください！
**Graph Explorer を使ってサンプルクエリを実行してみたい => [Graph Explorer](https://developer.microsoft.com/ja-jp/graph/graph-explorer)**
**Graph API でどんな値が取得できるのか知りたい => [Microsoft Graph の主要なサービスおよび機能](https://docs.microsoft.com/ja-jp/graph/overview-major-services)**

#まとめ
今回は Power BI から Azure AD に登録したアクセストークンを用いて Graph API 経由で O365 のデータを取得するところまでを実行しました。GUI で非常に簡単にできるということが分かりました！コロナ禍においてリモート勤務体制を構築するのは非常に大切でどの企業も自治体も必死に IT 改革を進めてみるところかと思います。その次のフェーズとして、より効率的な働き方をするという点で働き方の可視化は重要な観点かと思います。
今回紹介した Power BI × Graph API を使用すれば様々なデータを可視化し、新しい働き方を見直すことができると思います。是非積極的に試して見てください。次回以降の記事では、Users のプロファイル情報だけでなく、User のアクティビティなども取得して可視化する方法に触れていこうと思います！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149921/8391d3b6-e86d-1201-271d-65680d0f715d.png)
#参考記事一覧
**■ 働き方の可視化に Power BI × Graph API が便利！**
Power BI の概要を知りたい => [PowerBI 概要](https://docs.microsoft.com/ja-jp/power-bi/fundamentals/power-bi-overview)
Graph API 概要を知りたい => [Graph API 概要](https://docs.microsoft.com/ja-jp/graph/use-the-api)

**■ Azure AD でアプリ登録**
Power BI のインストール方法を知りたい => [Power BI Desktop の取得](https://docs.microsoft.com/ja-jp/power-bi/fundamentals/desktop-get-the-desktop)
Office 365 の管理者ページにアクセスしたい => [Microsoft 365 管理センターについて](https://docs.microsoft.com/ja-jp/microsoft-365/admin/admin-overview/about-the-admin-center?view=o365-worldwide)
Office 365 の Admin Portal にアクセスしたい => [Microsoft 365 管理センター](https://admin.microsoft.com/#/homepage)
Azure AD でアプリ登録の詳しい手順を知りたい => [Microsoft ID プラットフォームにアプリケーションを登録する](https://docs.microsoft.com/ja-jp/azure/active-directory/develop/quickstart-register-app)
シークレットの作成方法をもう少し詳しく知りたい => [新しいアプリケーション シークレットを作成する](https://docs.microsoft.com/ja-jp/azure/active-directory/develop/howto-create-service-principal-portal#option-2-create-a-new-application-secret)

**■Power BI でアクセストークンを所持させるクエリを作成**
Power BI でクエリを作成する方法を知りたい => [Power BI Desktop でのクエリの概要](https://docs.microsoft.com/ja-jp/power-bi/transform-model/desktop-query-overview)
詳細エディターでクエリを編集する方法を知りたい -> [カスタム列に対して詳細エディターを使用する](https://docs.microsoft.com/ja-jp/power-bi/create-reports/desktop-add-custom-column#use-the-advanced-editor-for-custom-columns)

**■Power BI で Graph API を呼び出す**
Graph Explorer を使ってサンプルクエリを実行してみたい => [Graph Explorer](https://developer.microsoft.com/ja-jp/graph/graph-explorer)
Graph API でどんな値が取得できるのか知りたい => [Microsoft Graph の主要なサービスおよび機能](https://docs.microsoft.com/ja-jp/graph/overview-major-services)