Microsoft GraphAPIのID、概要、取得方法の一覧

* 前置き
公式ホームページの各ページでさまざまなエンドポイントが紹介されていますが、
エンドポイント内の各種IDの取得方法を探すのに苦労しました。
そのため、主要なIDの概要と取得方法をまとめておきます。
他にもさまざまなIDがありますが、今回はSharePoint List、ドキュメントライブラリやOneDriveへのGET操作に必要となるIDをまとめました。


:::note warn
注意
この記事ではIDに便宜上の名前をつけて解説しています。
理由は、公式にもページによってidの記載方法が異なり正式名称も見つからなかったためです。

例）"site-id"と書いてあるページと"siteId"のページがあるなど統一されていない
[公式の参考リンク 1](https://learn.microsoft.com/en-us/graph/api/site-list-columns?view=graph-rest-1.0&tabs=http)
[公式の参考リンク 2](https://learn.microsoft.com/en-us/graph/api/site-getapplicablecontenttypesforlist?view=graph-rest-1.0&tabs=http)
:::

* ID一覧

    | ID | 概要 | 必要な情報 | エンドポイント*1 |必要な情報*2|
    |:-----------|:------------|:------------|:------------|:------------|
    | site-id    | サイト、サブサイトごとに振られるID　　　 |site名,{組織に依存するID} |https://graph.microsoft.com/v1.0/sites/{組織に依存するID}.sharepoint.com:/sites/{siteName}|"Sites.Read.All" |
    | list-id   | ShrePoint ListのListごとに振られるIDアイテムの中身をGETするには必須| site-id  |https://graph.microsoft.com/v1.0/sites/{site-id}/lists|"Sites.Read.All"|
    | drive-id  | ドキュメントライブラリ、OneDriveのフォルダのID。格納してあるファイルをGETするには必須 |site-id |https://graph.microsoft.com/v1.0/sites/{site-id}/drives|"Files.Read"(site-id取得のためには"Sites.Read.All"が必要)|
    | 画像ID   | ドキュメントライブラリ、OneDriveに格納してある画像ごとに振られるID。このIDを使用して画像がGETできる |site-id, drive-id,画像の名前 |https://graph.microsoft.com/v1.0/sites/{site-id}/drives/{drive-id}/root/children?$filter=name eq ‘{画像の名前}’|"Files.Read"(site-id取得のためには"Sites.Read.All"が必要)|

    *1
    一覧を取得するための一番シンプルなエンドポイントのみ載せています。
    クエリでフィルタをかけるなどの工夫ができます。

    *2
    権限はいずれも「委任 (職場または学校のアカウント)」



* 各種IDの詳細

    * site-id
	リクエストURL
        https://graph.microsoft.com/v1.0/sites/{組織に依存するID}.sharepoint.com:/sites/{siteName}
    	siteNameはWebでSharePointを開き、ホーム表示させたURLの”sites/“以下で取得できるサイトの名前です。
    	Rootサイトだけでなく、サブサイトも続けて入力できます。
    	例）
    	URLが下記の場合、siteNameは{Site-ToolApp/test}になります。
    	https://{組織に依存するID}.sharepoint.com/sites/Site-ToolApp/test

        レスポンス例
        ```
        {
	    "@odata.context": "https://・・・",
	    "createdDateTime": "2024-01-06T00:41:52Z",
	    "description": "",
	    "id": “該当サイトのsite-id”,
	    "lastModifiedDateTime": "2024-01-06T00:41:56Z",
	    "name": “test”,
	    "webUrl": "https://{組織に依存するID}sharepoint.com/sites/Site-ToolApp/test”,
	    "displayName": “表示名”,
	    "parentReference": {
	        "siteId": “親サイト（Site-ToolApp）のsite-id”
	    }
          ・・・
    	}
        ```


    注意）該当サイトのsite-idは一番上の階層の”id”です。
    "parentReference”の中のsiteIdは親サイトのIDなので異なります。

    * list-id
        * APIでの確認方法
    	リクエストURL
        	全件表示：https://graph.microsoft.com/v1.0/sites/{site-id}/lists
            リスト名でリストを取得する：https://graph.microsoft.com/v1.0/sites/{site-id}/lists?$filter=displayName eq '{list-title}'
            または、https://graph.microsoft.com/v1.0/sites/{site-id}/lists/{list-title}

        レスポンス例
        ```
            [
              {
                "name" : "English_list",
                "displayName" : "English_list",
                "id" : “list-id”,
                "lastModifiedBy" : {
                  "user" : {
                    ・・・
                  }
                },
                "createdBy" : {
                  "user" : {
                    ・・・
                  }
                },・・・
             }
            ]
        ```


       * Webでの確認方法
        list-idはWeb上でも確認することができます。
        歯車マークの「リストの設定」を押下
        **URLのList=%7Bから%7Dの前までの文字列**がlist-idです。
     

        注意）
        Listのタイトルは英語で作成することをおすすめします。
        理由は、日本語でリストを作成するとListのnameは”List”や”List1”・・のように連番で自動作成になり、APIで管理するには不便であるためです。英語だとnameが作成したタイトルの名前と一致します。
        
        例）English_listで作成するとnameもEnglish_listになります。
        日本語リストで作成するとnameはListになります。
        Listの名前は内部名です。英語で作成するとランダム値になってしまいます。


    
    * drive-id
    リクエストURL
	https://graph.microsoft.com/v1.0/sites/{site-id}/drives
	サイト内の一覧のdrive-idを取得できます。
	内部名ではなく、**表示名のみ取得**できます。

     ```
        Keyが“value”の値の中の下記
        "value": [
	        {
	            "createdDateTime": "2023-11-24T00:23:07Z",
	            "description": “”,
	            "id": "drive-id(b!から始まる文字列)”,
	            "lastModifiedDateTime": "2024-01-04T05:03:07Z",
	            "name": "該当のドキュメントライブラリの名前（表示名）”,
	            "webUrl": "https://",
	            "driveType": "documentLibrary",
	            "createdBy": {
	                ・・・
	            }
	        }, ・・・
        ]
     ```

    他の階層にも”id”がたくさんありますが、**該当のnameと同じ要素内のidがdrive-id**です。


    * 画像ID
	リクエストURL（以下は画像の名前でフィルターをかける時のURLです。）
	https://graph.microsoft.com/v1.0/sites/{site-id}/drives/{drive-id}/root/children?$filter=name eq ‘{ドキュメントライブラリの「名前」列の文字列}’

    ```
    	"value": [
	        {
	            "@microsoft.graph.downloadUrl": "https://“,
	            "createdDateTime": "2024-01-04T05:03:07Z",
	            "eTag": "",
	            "id": “画像ID”,
	            "lastModifiedDateTime": "2024-01-04T05:15:06Z",
	            "name": “ドキュメントライブラリの「名前」列の文字列”,
	            "webUrl": "https://“,
	            "cTag": "",
	            "size": 3804939,
	            "createdBy": {
	                "user": {
	                    "email": "",
	                    "id": "",
	                    "displayName": ""
	                }
	            },
			・・・
	        }
        ]
    ```

* 参考
    * [リクエストURL一覧を参考](https://koruneko.hatenablog.com/entry/2022/12/19/034044)
    * [Microsoft GraphAPIを呼ぶ方法](https://learn.microsoft.com/en-us/entra/identity-platform/tutorial-v2-ios)