Microsoft Graph を使ってみよう : ノートリソース (OneNote) 

# Microsoft Graph における OneNote

OneNote は OneDrive、グループ、SharePoint ドキュメントなど様々な場所に存在します。それぞれの場所において、同一の操作が可能です。OneNote は以下の要素で構成されており、それぞれが Microsoft Graph リソースとなります。

- ノートブック
- セクション
- セクショングループ
- ページ
- リソース

Microsoft Graph の OneNote API は非常に充実しており、データの取得だけでなく作成や更新もできるため、非常に使い甲斐があります。

# ノートブックリソース

OneNote のノートブックを表すリソースです。

## 主なシナリオ

- ノートブックの一覧取得、作成、更新、削除
- 最近使ったノートブックの取得
- ノートブックのコピー

## ノートブックリソースの操作
いくつか代表的な操作を以下に紹介します。

**ノートブック一覧の取得**
パスに場所を指定することで、任意の場所のノートブックが取得できます。

GET: https://graph.microsoft.com/v1.0/me/onenote/notebooks
GET: https://graph.microsoft.com/v1.0/groups/{id}/onenote/notebooks
GET: https://graph.microsoft.com/v1.0/sites/{id}/onenote/notebooks

```csharp:C#
await graphClient.Me.Onenote.Notebooks.Request().GetAsync();
await graphClient.Groups["id"].Onenote.Notebooks.Request().GetAsync();
await graphClient.Sites["id"].Onenote.Notebooks.Request().GetAsync();
```

**ノートブックの作成**

POST: https://graph.microsoft.com/v1.0/me/onenote/notebooks

```json:Body
{
  "displayName": "decode 2018用"
}
```

```csharp:C#
await graphClient.Me.Onenote.Notebooks.Request().AddAsync(new Notebook()
{
    DisplayName = "decode 2018用"
});
```

**特定のノートブックや最近使ったノートブックを取得する**
最近のノートを取得する場合、個人のノートブックを含めるか指定可能。

GET: https://graph.microsoft.com/v1.0/me/onenote/notebooks/{id}
GET: https://graph.microsoft.com/v1.0/me/onenote/notebooks/getRecentNotebooks(includePersonalNotebooks=true)

```csharp:C#
await graphClient.Me.Onenote.Notebooks["id"].Request().GetAsync();
await graphClient.Me.Onenote.Notebooks.GetRecentNotebooks(true).Request().GetAsync();
```

# セクションリソース

OneNote のセクションを表すリソースです。

## 主なシナリオ

- セクション一覧の取得、作成、コピー
- セクションのページ一覧を取得、作成

## セクションリソースの操作
いくつか代表的な操作を以下に紹介します

**セクションの作成**

POST: https://graph.microsoft.com/v1.0/me/onenote/notebooks/{id}/sections

```json:Body
{
  "displayName": "セッションについて"
}
```

```csharp:C#
await graphClient.Me.Onenote.Notebooks["id"].Sections.Request().AddAsync(new OnenoteSection()
{
    DisplayName = "セッションについて"
});
```

<img width="693" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/933326af-9933-22d1-8883-8ac3d0938a7f.png">

**セクションの一覧および特定セクションの取得**
セクションはノートブックから辿ることも、全体から探すことも出来ます。

GET: https://graph.microsoft.com/v1.0/me/onenote/notebooks/{id}/sections
GET: https://graph.microsoft.com/v1.0/me/onenote/sections
GET: https://graph.microsoft.com/v1.0/me/onenote/sections/{id}

```csharp:C#
await graphClient.Me.Onenote.Notebooks["id"].Sections.Request().GetAsync();
await graphClient.Me.Onenote.Sections.Request().GetAsync();
await graphClient.Me.Onenote.Sections["id"].Request().GetAsync();
```

# セクショングループリソース

セクショングループは名前のとおり、複数のセクションをグループ化したものです。

## 主なシナリオ

- セクショングループ一覧の取得、作成
- セクショングループ内のセクション一覧を取得、作成

## セクショングループリソースの操作
いくつか代表的な操作を以下に紹介します。

**セクショングループの作成とグループ内にセクションの作成**

POST: https://graph.microsoft.com/v1.0/me/onenote/notebooks/{id}/sectionGroups

```json:Body
{
  "displayName": "セッションについて"
}
```

POST: https://graph.microsoft.com/v1.0/me/onenote/sectionGroups/{id}/sections

```json:Body
{
  "displayName": "Microsoft Graph 関連セッション"
}
```

```csharp:C#
var sectionGroup = await graphClient.Me.Onenote.Notebooks["id"].SectionGroups.Request().AddAsync(new SectionGroup()
{
    DisplayName = "セッションについて"
});
await graphClient.Me.Onenote.SectionGroups[sectionGroup.Id].Sections.Request().AddAsync(new OnenoteSection()
{
    DisplayName = "Microsoft Graph 関連セッション"
});
```

<img width="603" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/327b49c8-05ea-cda9-7cb2-47c488b0ea91.png">

# ページリソース

OneNote のページ表すリソースです。

## 主なシナリオ

- ページの一覧取得、作成、取得、更新、削除
- ページをサクションにコピー
- 
## ページリソースの操作
いくつか代表的な操作を以下に紹介します。

**ページの作成**
ページ本体は HTML で表現できますが、バイナリを含める場合などは multipart/form-data として表現します。またページを作成するセクションを指定して作ります。以下はシンプルなページを作っていますがマルチパートのサンプルは [page を作成する](https://developer.microsoft.com/ja-jp/graph/docs/api-reference/v1.0/api/section_post_pages) を参照

POST: https://graph.microsoft.com/v1.0/me/onenote/sections/{id}/pages

```text:Header
Content-type: text/html
```
```html:Body
<!DOCTYPE html>
<html>
  <head>
    <title>Microsoft Graph セッションアジェンダ</title>
  </head>
  <body>
    <p>Build から新機能を紹介する</p>
    <p>認証</p>
    <img src="https://user-images.githubusercontent.com/13203188/37057063-1076865a-217e-11e8-862b-e2211642175d.png" alt="認証のイメージ" width="500" />
  </body>
</html>
```

```csharp:C#
await graphClient.Me.Onenote.Sections["id"].Pages.Request().AddAsync(@"<!DOCTYPE html>
<html>
  <head>
    <title>Microsoft Graph セッションアジェンダ</title>
  </head>
  <body>
    <p>Build から新機能を紹介する</p>
    <p>認証</p>
    <img src=""https://user-images.githubusercontent.com/13203188/37057063-1076865a-217e-11e8-862b-e2211642175d.png"" alt=""認証のイメージ"" width=""500"" />
  </body>
</html>", "text/html", CancellationToken.None);
```

<img width="682" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/6512c91c-deb1-f9f4-310c-84d958bba77d.png">

**ページの取得**

GET: https://graph.microsoft.com/v1.0/me/onenote/pages/{id}/content

```csharp:C#
await graphClient.Me.Onenote.Pages["id"].Content.Request().GetAsync();
```
# リソースリソース

OneNote のページ上にあるオブジェクトの事です。

## 主なシナリオ

- リソースの取得
 
## リソースリソースの操作

**リソースの取得**
ページのコンテンツを取得した際、リソースがあればリソースのアドレスが表示されます。そこにアクセスすることでリソースが取得できます。リンクはページからしか取得できません。

GET: https://graph.microsoft.com/v1.0/users('{user_id}')/onenote/resources/{resource_id}/$value

```csharp:C#
await graphClient.Users["user_id"].Onenote.Resources["resource_id"].Content.Request().GetAsync();
```

# まとめ

OneNote は非常にリッチなメモとしても、OCR としても色々使えます。プログラムに組み込むとできることが充実します。是非試してください。

[目次に戻る](https://qiita.com/kenakamu/items/6a1ca508dc093779eefa)

# 参照
[Microsoft Graph での OneNote 操作](https://developer.microsoft.com/ja-jp/graph/docs/api-reference/v1.0/resources/onenote-api-overview)
[Microsoft Graph でのノートブック操作](https://developer.microsoft.com/ja-jp/graph/docs/api-reference/v1.0/resources/notebook)
[Microsoft Graph でのセクション操作](https://developer.microsoft.com/ja-jp/graph/docs/api-reference/v1.0/resources/section)
[Microsoft Graph でのセクショングループ操作](https://developer.microsoft.com/ja-jp/graph/docs/api-reference/v1.0/resources/sectiongroup)
[Microsoft Graph でのページ操作](https://developer.microsoft.com/ja-jp/graph/docs/api-reference/v1.0/resources/page)
[Microsoft Graph でのリソース操作](https://developer.microsoft.com/ja-jp/graph/docs/api-reference/v1.0/resources/resource)