【SharePoint】Microsoft GraphでサイトID, ドライブID, アイテムIDを調べる方法

# やりたいこと

Microsoft GraphからSharePoint APIを使いたいが、そこで必要な **[サイトID](https://docs.microsoft.com/ja-jp/graph/api/drive-get?view=graph-rest-1.0&tabs=http#path-parameters)** や **[ドライブID](https://docs.microsoft.com/ja-jp/graph/api/drive-get?view=graph-rest-1.0&tabs=http#get-a-drive-by-id)** （各種ID）を調べたい

## 前提条件

* ログインしているユーザーが各種IDを取得してくるドライブやファイル/フォルダの閲覧以上の権限を持っていること
* **[Microsoft Graph Explorer](https://developer.microsoft.com/ja-jp/graph/graph-explorer)** が使用できること

## 事前準備

* **[Microsoft Graph Explorer](https://developer.microsoft.com/ja-jp/graph/graph-explorer)** でログインしておく

## 各種IDのざっくりとした説明

SharePointではサイトごとに存在するドライブやフォルダ、ファイルなど
それぞれにユニークな値が付与されており、```〇〇〇-id```と呼ばれるものが複数登場します。
1つのSharePointサイトに **[サイトID](https://docs.microsoft.com/ja-jp/graph/api/drive-get?view=graph-rest-1.0&tabs=http#path-parameters)** が割り当てられ、そのなかにdriveが存在し、
driveの中にフォルダ/ファイルが存在しているような感じです。
そのため、各種IDを取得するためにまずは一番上のサイトIDから探し、そのあと **[ドライブID](https://docs.microsoft.com/ja-jp/graph/api/drive-get?view=graph-rest-1.0&tabs=http#get-a-drive-by-id)** , **[アイテムID](https://docs.microsoft.com/ja-jp/graph/api/resources/driveitem?view=graph-rest-1.0#properties)** も取得していきます

## 作業の流れ

### ➀[サイトID](https://docs.microsoft.com/ja-jp/graph/api/drive-get?view=graph-rest-1.0&tabs=http#path-parameters)を取得する

Graph APIでクエリを実行します
<検索したい値>をSharePointサイト名に置き換えてGraph APIを実行します。

```:クエリURL
https://graph.microsoft.com/v1.0/sites?search=<検索したい値>
```

レスポンスのJSONが返ってきて、目的のSharePointサイトのvalueを探します。
**[サイトID](https://docs.microsoft.com/ja-jp/graph/api/drive-get?view=graph-rest-1.0&tabs=http#path-parameters)** は```id```の値である```contoso.sharepoint.com,2C712604-1370-44E7-A1F5-426573FDA80A,2D2244C3-251A-49EA-93A8-39E1C3A060FE```に該当します。

```json:GraphAPI応答のプレビュー
{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites",
    "value": [
        {
            "createdDateTime": "<日付>",
            "description": "<説明文>",
            "id": "contoso.sharepoint.com,2C712604-1370-44E7-A1F5-426573FDA80A,2D2244C3-251A-49EA-93A8-39E1C3A060FE",
            "lastModifiedDateTime": "<日付>",
            "name": "<URLに使用されるサイト名>",
            "webUrl": "<SharePointのURL>",
            "displayName": "<SharePointの表示で使用されるサイト名>",
            "root": {},
            "siteCollection": {
                "hostname": "contoso.sharepoint.com"
            }
        }
    ]
}
```

### ➁[ドライブID](https://docs.microsoft.com/ja-jp/graph/api/drive-get?view=graph-rest-1.0&tabs=http#get-a-drive-by-id)を取得する

➀で取得したサイトIDを使って次はドライブIDを取得します
<サイトID>の値を当てはめてクエリを実行します

```:クエリURL
https://graph.microsoft.com/v1.0/sites/<サイトID>/drive
```

参考 : **[サイトのドキュメント ライブラリを取得する - Microsoft Graph](https://docs.microsoft.com/ja-jp/graph/api/drive-get?view=graph-rest-1.0&tabs=http#get-the-document-library-for-a-site)** 

ドライブIDは```id```の値になります。

```JSON:応答のプレビュー
{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#drives/$entity",
    "createdDateTime": "<日付>",
    "description": "",
    "id": "<ドライブID>",
    "lastModifiedDateTime": "<日付>",
    "name": "ドキュメント",
    "webUrl": "https://contoso.sharepoint.com/sites/folderName",
    "driveType": "documentLibrary",
    "createdBy": {
        "user": {
            "displayName": "<ユーザー名>"
        }
    }
    ...
}
```

### ➂[アイテムID](https://docs.microsoft.com/ja-jp/graph/api/resources/driveitem?view=graph-rest-1.0#properties)を取得する

ドライブ内のアイテムのうち、ここではまずドライブのルートに存在するファイル/フォルダのアイテムIDを取得してみます

```:クエリURL
https://graph.microsoft.com/v1.0/drives/<➁で取得したドライブID>/items/root/children
```

JSONの記載は省きますが、レスポンスで返ってきたJSONのvalueに、ファイルとフォルダの情報が配列で含まれています。
そこに存在する```id```がアイテムIDになります。

ルートフォルダ以外のアイテム(フォルダ/ファイル)のアイテムIDを探したい場合、
上記のやり方では面倒なので、ほかのクエリを使用します。

```:クエリURL
https://graph.microsoft.com/v1.0/drives/<➁で取得したドライブID>/root/search(q='<ドライブ内で検索したい値>')
```

正しく検索ができていれば、レスポンスのJSONからアイテムIDが分かるはずです。

## 補足

Microsoft Graphを実行したときに権限エラーで怒られた場合、下記の権限設定がされている必要があるかもしれません。実行したいAPIのURLを入力した後に、青色の権限編集ボタンを押すと、実行するために必要な権限が表示されるため、必要なもの（すべて必要なわけではないと思います）に赤枠のところから権限委任をしておいてください。
Microsoft Graphがログインユーザーの代わりにAPI実行するのを許可しているのだと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022607/bce5003d-993f-0e65-736f-11e4c28ad7ba.png)