Power BIでSharePointのデータを利用する

この記事は[Office 365 Advent Calendar 2018 (12/11)](https://adventar.org/calendars/3184) に参加しています。

**Power BIでSharePointのファイルやリストを扱うにはどうすればいいのか。**
専用コネクターが用意されているけど「実際どうやってSharePointと繋いでいるのか」という話をあまり聞かない気がするので、備忘も兼ねて書いていきます。

なお、筆者はオンプレSharePointを触れる環境にありません。
扱う内容はSharePoint Onlineが前提となりますが、オンプレSharePointユーザーの方にも参考になる内容です…多分。

#Power BIで使えるSharePointコネクター
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/ff09bfab-7fe9-32f9-2862-05e2f3dfbf1d.png)
**1. SharePoint フォルダー
2. SharePoint Online リスト
3. SharePoint リスト**

この三つがSharePointに絡むコネクターです。
SharePoint Online リストとSharePoint リストは動作上の違いが確認できなかったので一緒にご紹介します。

#各コネクターの共通部分
##接続の前準備
どのコネクターも、利用するには**必ずサイトのURL**を入力する必要があります。
基本は`https://xxx.sharepoint.com/sites/sitesname`
サブサイトのコンテンツを読み出したいなら`https://xxx.sharepoint.com/sites/sitesname/subsitesname`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/3b9446c3-7a70-b290-7405-687c4cb53f57.png)
ここで!マークにマウスオーバーすると設定のヒントを見ることができます。
SharePoint系コネクターの場合、「サブフォルダーを含めずにSharePointサイトのルートURLを入力します」と表示される。

ここで言う**ルートURL**とは、以下のURLなら**/sitesname**までの部分。
`https://xxx.sharepoint.com/sites/sitesname/Lists/Test%20List/AllItems.aspx`
後ろのリストやライブラリーを表す部分を消さずにダイヤログに入力するとエラーが出ます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/376f4bad-f535-8248-24ce-920bccb8033a.png)
正しいルートURLを入力すると、OKボタンが有効化されてSharePointのコンテンツにアクセスできます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/ad36a610-b8a2-3670-b0ad-59e757c49024.png)
##アクセス許可の設定
初めてSharePointコネクターを利用する際は**アクセス許可**を設定する必要があります。
アクセス許可には幾つか種類がありますが、SharePointを利用する場合は基本的に**Microsoft アカウント**を利用します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/03f1f4e1-ccfa-0040-a316-88fb5bc3cc7c.png)
適用対象レベルは一番下の**サイト名が入ったURL**を選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/9de20c17-773e-c434-cdc4-a4decb39c667.png)
それ以外のURLは会社のポリシー次第ですが、アクセスが拒否されてエラーになる事が多いと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/69e8440e-59c3-6d74-690a-2da351c50ef1.png)
[サインイン]をクリックするとお馴染みOffice365のサインイン画面が出てくるので、自身のアカウントでサインインします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/7cea4257-6fa7-be5f-1f37-6b5ffb365b00.png)
サインインすると、以下の画面表示になるので**[接続]**をクリックしてSharePointにアクセスします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/8c6d6b1c-9c3d-d0dc-97e0-6db046cd62a4.png)


#SharePoint フォルダー
##ドキュメントライブラリーと接続する
SharePoint フォルダーコネクターはドキュメントライブラリーからファイルを読み出すのに使用します。
このコネクターでサイトを読み出すと、**サイト上のドキュメントライブラリーに存在する全てのファイル**が一覧で表示されます。
**[編集]**をクリックして、Power Queryで読み出すファイルを指定しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/d54d7eac-4549-c7b4-6075-a8745184497b.png)

###各列の説明

![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/8ae84d17-09cd-d5f1-d110-712872027ba5.png)

- Content
    - Binary(ファイルの中身)
- Name
    - ファイル名
- Extension
    - ファイル拡張子
- Date accessed
    - ファイルへの最終アクセス日時
- Date modified
    - ファイルの最終更新日時
- Date created
    - ファイルの作成日時
- Attributes
    - ファイルサイズ、コンテンツタイプ、ファイルの種類
- Folder Path
    - ファイルが存在するライブラリー、もしくはフォルダーのパス

##使い方

- **Content列**にある**Binaryを直接クリック**して特定のファイルを読み出す。
- 列名部分にある**[ファイルの結合]ボタン**で複数のファイルを結合する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/4cf13ab0-7d7a-ceb5-246d-796bf48895c1.png)
- **[ファイルの結合]**ボタンは同じテーブルを持つファイルを結合する時に使います。
    - 例えば売上集計の1月分と2月分を一つのテーブルとして扱う時です。
- **Name列**や**Folder Path列**を利用してフィルターをかけることでより有効に使う事が出来るでしょう。

###Folder Path列の命名規則
`https://xxx.sharepoint.com/sites/サイト名/ドキュメントライブラリー名`
`https://xxx.sharepoint.com/sites/サイト名/ドキュメントライブラリー名/フォルダー名`
`https://xxx.sharepoint.com/sites/サイト名/サブサイト名/ドキュメントライブラリー名`
`https://xxx.sharepoint.com/sites/サイト名/サブサイト名/ドキュメントライブラリー名/フォルダー名`

覚えておくと何処のサイト、ライブラリー、フォルダに何が入っているかの確認に便利です。


###使用上の注意
このコネクターを利用した場合、**ドキュメントライブラリーで列を利用して付けたプロパティを確認する事ができません。**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/eaf61615-66b1-06f1-db2c-1ec42e731f20.png)
この様にカテゴリー分けをして整理していても、列の値を利用してフィルターを掛けたりするのはあきらめましょう。

#SharePoint Online リスト(SharePoint リスト)
##リスト、またはドキュメントライブラリーと接続する
SharePoint Online リスト(SharePoint リスト)コネクターは、**リストとドキュメントライブラリー両方の読出しに対応**しています。

このコネクターでサイトを読み出すと、**サイト上のリストとドキュメントライブラリーの一覧**が表示されます。
読み出すリストかライブラリーにチェックを入れ、**[OK]**をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/c1ce68bd-a39b-8e60-1fee-f8fb55e4b5fc.png)
###各列の説明
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/7d128fbb-102b-870e-ed77-2e22114ef3ef.png)
列の種類が多いので、主要な列に絞って解説します。

- Id
    - コンテンツに自動で割り振られる一意のID
- Title
    - リストやライブラリー新規作成時に必ず作成される[タイトル]列
    - この列から右側にユーザー作成列やデフォルトで存在している更新日などの列のプロパティが表示されている。
- OData_云々
    - 作成時に列名を日本語で作成したユーザー作成列。
    - 英語で列名を作成した場合、OData_は付かない。
- OData__UIVersionString
    - アイテムのバージョン数
- Modified
    - アイテムの更新日
- Created
    - アイテムの作成日
- Attachments
    - 添付ファイルの有無
- GUID
    - アイテムに割り振られたSharePointのGUID
- AttachmentFiles
    - 添付ファイルの情報(リストのみ)
- FieldValuesAsHtml(FieldValuesAsText、FieldValuesForEditも同様)
    - リスト、ライブラリーに存在する当該レコードの全ての列の値
- File(ライブラリーのみ)
    - アップロードされたファイルの名前、URL等のレコード
- Folder(ライブラリーのみ)
    - フォルダー名やフォルダー内のファイル情報のレコード(ライブラリにフォルダーが存在している場合のみ)
- Author
    - アイテムの作成者のレコード
- Editor
    - アイテムの更新者のレコード
- CheckoutUser
    - アイテムを現在チェックアウトしているユーザーのレコード

##使い方

- リスト
    - リストの内容を読み出す。
    - 添付ファイルを読み出す。
-  ライブラリー
    -  列のプロパティに基づいてファイルを選別し、読み出す。

このコネクターでは、列のプロパティを直接読み出す事が出来ます。
読み出すファイルをルールに基づいて自動で変えたり、複雑なフィルター条件を設定したい場合は便利です。

###使用上の注意
このコネクターを利用した場合、**リストの添付ファイルやライブラリーのファイルを事前処理無しで読み出すことはできません。**
**Power Queryでカスタム列を使いファイルのURLを生成**し、そこからBinaryを読み出す工程を入れる必要があります。

ライブラリーの場合、ファイルを扱うには**File列**を展開する必要があります。
リストの場合、ファイルを扱うには**AttachmentFiles列**を展開する必要があります。
場合によっては上記に加え、**FirstUniqueAncestorSecurableObject列**を展開する事もあります。

##ドキュメントライブラリーをPower Queryで読み出す
ドキュメントライブラリーのファイルは**File列**内に読出しに必要な情報が格納されています。
右上の展開ボタンを押して**File列**を展開しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/48b4b234-39b2-5a34-f2e6-b6393b8082a1.png)

ここで展開する列は**LinkingUrl、Name、ServerRelativeUrl**の三つがあれば十分だと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/00ccbd79-188e-50d7-888b-28508bd80949.png)
展開すると、以下の様になります。

- LinkingUrl
    - 絶対URLが入っている為、一番加工しやすいURL
    - 但しフォルダー及びフォルダー内のファイルはURLが表示されない
- Name
    - ファイル名
- ServerRelativeUrl
    - ファイルの相対URL
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/e5f33ece-d966-c0aa-ae90-b27c1875c729.png)

###読み出す前処理
ここでは**LinkingUrl**を利用した場合の読出し方法を説明します。
**ServerRelativeUrl**を使う方法は後述のリストを読み出す方法がそのまま使えるので、ここでは解説しません。
####完全URLの生成
まず、**LinkingUrl列**の構造を見てみると以下の様に絶対URLの後ろに**?d=**で始まる余計な部分が付いています。
`https://xxx.sharepoint.com/sites/サイト名/ドキュメントライブラリー名/ファイル名?d=wd28...`

これを外すため、**LinkingUrl列**を選択して**[変換]**タブの**[テキストの列]**から**[抽出]-[区切り記号の前のテキスト]**をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/a829aa1e-0a69-a408-8aef-606df2a6c3b8.png)
出てきたダイヤログに半角**?**を入れて**[OK]**を押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/61787116-31b4-eab9-d0ca-d60b343e49a9.png)
これで邪魔な部分が外れ、**LinkingUrl列**にファイルの**完全URL**が完成しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/bc78c3ab-b62d-969d-d503-6e87838a2447.png)
####Binaryの生成
ここからPower BIで読み込むためには、**LinkingUrl列**のURLから**ファイルのBinaryを生成**する必要があります。
**[列の追加]**から**[カスタム列]**を使い、以下の式を入力します。
`Web.Contents([LinkingUrl])`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/40e582f2-63d7-69c8-9f73-9d25558ed03d.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/272db4c7-21c5-9469-76e5-d9f538396823.png)
これで[カスタム]列にLinkingUrl列に格納されていたファイルのBinaryが生成されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/8db08bba-df92-33c9-bfdd-b2f9c22d648b.png)

###読出し
後はSharePoint フォルダーコネクターで解説したBinary読出し手順と一緒です。
必要なファイルを読み出してあげましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/4cf13ab0-7d7a-ceb5-246d-796bf48895c1.png)

##リストをPower Queryで読み出す
リストの添付ファイルは**AttachmentFiles列**内に読出しに必要な情報が格納されています。
右上の展開ボタンを押して**AttachmentFiles列**を展開しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/262e7caa-7585-ce08-2596-97e2f506c698.png)
ここで展開する列は**FileName、ServerRelativeUrl**の二つです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/ee59e7a5-8ef8-46f0-89f1-4551400d3734.png)
展開すると、以下の様になります。

- FileName
    - 添付ファイル名
- ServerRelativeUrl
    - 添付ファイルの相対URL

![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/35fae471-9e10-0939-763b-1ecbd0147d31.png)

###読み出す前処理
相対URLではBinaryを生成できません。
なので**別の列の情報を使って**完全URLを生成します。

####完全URLの生成

まず**FirstUniqueAncestorSecurableObject列**から**Url列**を展開しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/d590bffe-5982-fb5b-11e6-5724433a9d6c.png)

**Url列**と**ServerRelativeUrl列**を見比べてみると、以下の様に違いがあります。

- Url列
    - `https://xxx.sharepoint.com/sites/サイト名`
- ServerRelativeUrl列
    - `/sites/サイト名/リスト名/List/Attachments/37/ファイル名`

完全URLを作るには、**Url列のsharepoint.com以降**に**ServerRelativeUrl列の内容**をくっ付けてあげれば良さそうです。

**Url列**を選択して**[変換]**タブの**[テキストの列]**から**[抽出]-[区切り記号の前のテキスト]**をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/a829aa1e-0a69-a408-8aef-606df2a6c3b8.png)
出てきたダイヤログに半角**/**を入れて、詳細オプションを展開します。
**「区切り記号のスキャン」を「入力の先頭から」**、**「スキップする区切り記号の数」を「2」**に設定して**[OK]**を押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/49ef19cc-0543-eeb5-62b5-29704807fbfa.png)
URLの必要な個所だけ抜き出す事が出来ました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/23d29411-a2d2-3a68-3634-2aa7194b3462.png)
そして**Url列**と**ServerRelativeUrl列**を選択し、**[変換]タブ**の**[テキストの列]**から**[列のマージ]**をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/dbd741b8-28d9-8714-09fa-cb7e57fb0a97.png)
何も弄らず**[OK]**を押しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/af92d992-aa91-5c51-c848-7c5aac369b7b.png)
これで結合済み列に**添付ファイルの完全URL**が生成されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/e3940209-329e-3348-fef0-a34d678cdbef.png)
####Binaryの生成
Power BIで読み込むためには、**結合済み列のURL**から**ファイルのBinary**を生成する必要があります。
**[列の追加]**から**[カスタム列]**を使い、以下の式を入力します。
`Web.Contents([結合済み])`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/1e0ffe58-05b6-99ca-fc32-d89b13990521.png)
これで**カスタム列**に**添付ファイルのBinary**が生成されました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/dbdd4b74-72ee-6113-109e-6e9f20caf383.png)
###読出し
後はSharePoint フォルダーコネクターで解説したBinary読出し手順と一緒です。
必要なファイルを読み出してあげましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/313502/4cf13ab0-7d7a-ceb5-246d-796bf48895c1.png)
#まとめ

- **SharePoint用のコネクターは三つあるが、実質二つ。**
    - SharePoint Online リストとSharePoint リストの挙動が同じとは…。
- **ライブラリーとリストでファイルの読み出し方が全く異なる場合がある。**
    - 中でもリストコネクターの扱いは初心者殺しになること間違いなし。
    - GUIだけでポチポチやるのは無理でした。
- **自由にSharePoint上のファイルを扱いたいなら覚えるべき二つ**
    - =Web.Contents([列名])
    - 完全URLの作り方

SharePointを便利に使えば使う程、Power BIで読み出す手順が面倒になる謎仕様には頭を捻る。
せめてSharePoint フォルダーコネクターで列の値が取れればなぁ。