【Power Automate】SharePoint ListsをMicrosoft Graph REST APIを介して作成する

# [SharePoint コネクタ](https://learn.microsoft.com/ja-jp/connectors/sharepoint/)で出来ること

- [リスト ビューを取得](https://learn.microsoft.com/ja-jp/connectors/sharepoint/#%E3%83%AA%E3%82%B9%E3%83%88-%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AE%E5%8F%96%E5%BE%97)
- [リストの取得](https://learn.microsoft.com/ja-jp/connectors/sharepoint/#%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E5%8F%96%E5%BE%97)
- [ルート フォルダーのリスト](https://learn.microsoft.com/ja-jp/connectors/sharepoint/#%E3%83%AA%E3%82%B9%E3%83%88-%E3%83%AB%E3%83%BC%E3%83%88-%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC)
- [項目の作成](https://learn.microsoft.com/ja-jp/connectors/sharepoint/#%E9%A0%85%E7%9B%AE%E3%81%AE%E4%BD%9C%E6%88%90)
- [項目の更新](https://learn.microsoft.com/ja-jp/connectors/sharepoint/#%E9%A0%85%E7%9B%AE%E3%81%AE%E6%9B%B4%E6%96%B0)
- [項目の削除](https://learn.microsoft.com/ja-jp/connectors/sharepoint/#%E9%A0%85%E7%9B%AE%E3%81%AE%E5%89%8A%E9%99%A4)
- [項目の取得](https://learn.microsoft.com/ja-jp/connectors/sharepoint/#%E9%A0%85%E7%9B%AE%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B)
- [アイテムの共有を停止](https://learn.microsoft.com/ja-jp/connectors/sharepoint/#%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E3%81%BE%E3%81%9F%E3%81%AF%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%85%B1%E6%9C%89%E3%82%92%E5%81%9C%E6%AD%A2%E3%81%97%E3%81%BE%E3%81%99)
- [アイテムへのアクセス権の付与](https://learn.microsoft.com/ja-jp/connectors/sharepoint/#%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0%E3%81%BE%E3%81%9F%E3%81%AF%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%83%BC%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%92%E8%A8%B1%E5%8F%AF)

非常に多くのアクションが、[SharePoint コネクタ](https://learn.microsoft.com/ja-jp/connectors/sharepoint/)で実行することができます。
一方で`リストを作成する`となると、[SharePoint に HTTP要求を送信する](https://learn.microsoft.com/ja-jp/connectors/sharepoint/#http-%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%92-sharepoint-%E3%81%AB%E9%80%81%E4%BF%A1%E3%81%97%E3%81%BE%E3%81%99)アクションで対処する領域のようです。

`リストを作成`に焦点をあてて、アクションを見ていきたいと思います。


https://learn.microsoft.com/ja-jp/connectors/sharepoint/

https://learn.microsoft.com/ja-jp/connectors/sharepoint/#http-%E3%83%AA%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88%E3%82%92-sharepoint-%E3%81%AB%E9%80%81%E4%BF%A1%E3%81%97%E3%81%BE%E3%81%99

https://learn.microsoft.com/ja-jp/sharepoint/dev/apis/sharepoint-rest-graph

https://learn.microsoft.com/ja-jp/graph/api/resources/sharepoint?view=graph-rest-1.0

# Excelから次の段階へ進めるSharePoint Lists
あらためてDX推進を担うにあたり、`SharePoint Lists`の強みは常々感じます。
`Microsoft 365`の強み、APIでサービスの間をつなげるという意味でも、
**SharePoint Listsは、最も身近で優秀なパートナーです。**

:::note info
GPT的な文章ですが、自分による作成文章です
:::

理由は、`共同作業向けのテーブル`であり、`コンフリクトを防ぐことができたり`、`データ型や入力規則を定義できる`というメリットが挙げられます。

`復元`も気軽にできたりと万々歳🙌

自由度が高い分、`Excel`が好まれることも重々理解しておりますが、まずは今`Excel`で担っているタスクを、`SharePoint Lists`に置き換えてみるだけでも、業務のシーンは大きく変わるのではないでしょうか。

そんな`SharePoint Lists`ですが、リストそのものを作成するために、結構なクリックを**個人的には** 要すると感じています。

そんなにリストをパカパカ作るな！という助言はあると思いますが、準備が手間です。
- データ型の設定
- 内部名・表示名を意識した設定
- コピペでサクっと準備できない

こういったことが、**私は！** ムムム🧐と感じることが多いです。

ExcelやCSVからサクっと作る手段もありますが、
`内部名・表示名を意識した設定`が上手く反映されなかったりと、ムムム🧐と感じてしまいます。

[SharePoint Online 管理シェル](https://learn.microsoft.com/ja-jp/powershell/sharepoint/sharepoint-online/connect-sharepoint-online)を使うことができれば、サクっといけそうですが、一般の従業員にそんなものは使わせていただけることは、まずないでしょう。

# Power Automateで解決してみよう！
そんなこんなで、Power Automateを使って、この問題を解決してみます。

[Graph API](https://learn.microsoft.com/ja-jp/onedrive/developer/rest-api/?view=odsp-graph-online)を使ってみましょう。

:::note info
SharePoint REST APIでやっているパターンは、ほかにも書いている人がいるのでやめておきました。
:::

https://learn.microsoft.com/ja-jp/onedrive/developer/rest-api/?view=odsp-graph-online

## [新しいリストを作成する](https://learn.microsoft.com/ja-jp/onedrive/developer/rest-api/api/list_create?view=odsp-graph-online) 方法
[Microsoft learn]((https://learn.microsoft.com/ja-jp/onedrive/developer/rest-api/api/list_create?view=odsp-graph-online))に記載がありますね。

https://learn.microsoft.com/ja-jp/onedrive/developer/rest-api/api/list_create?view=odsp-graph-online

これを`Power Automate`で実行すると、下記のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/d0d0a143-bde2-cf8d-5575-c43f66febc5c.png)

| 項目 | 設定値 |
|:-:|:-:|
| サイトのアドレス | 対象のSharePointサイト |
| 方法 | POST |
| URI | `_api/v2.1/sites/root/lists` |

```json:ボディ
{
  "displayName": "Books",
  "columns": [
    {
      "name": "Author",
      "text": { }
    },
    {
      "name": "PageCount",
      "number": { }
    }
  ],
  "list": {
    "template": "genericList"
  }
}
```

learnと異なっているのは、`name`プロパティが`displayName`になっていることです。
`name`のままだとエラーになります。

learnの例を見ると、URIは

```plaintext:URI
/sites/{site-id}/lists
```

となっていますが、特定の子に位置するサイトではないため、`root`で指定しています。

```plaintext:URI
_api/v2.1/sites/root/lists
```

`site-id`を調べる方法は、

```plaintext:SiteId
https://<tenant-name>.sharepoint.com/sites/<site-name>/_api/site/id
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/f47a59f5-22a9-3903-e9ba-a94db303b0f0.png)


SharePointサイトのアドレスの末尾に`/_api/site/id`を添えて、`GET`要求を送信すれば取得できます。
こんな感じで`d.Id`としてsite-idが表示されます。

さて、リストの作成に話を戻すと、下記のようにリストがサクっと作られることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/188491dc-263c-2baa-782b-7af90fe39e1d.png)

今回送信した要求のうち

```json
{
  "list": {
    "template": "genericList"
  }
}
```

こちらの`"template": "genericList"`は、タイトル列のみが含まれる`空白のリスト`に該当します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/fd90d27c-37d0-354d-f50c-aa641ddbef26.png)

使ってみるとわかりますが、タイトル列が入力必須になっていることが、少しムムム🧐ポイントです。

:::note info
とはいえ、1秒で出来るのは嬉しい✨
:::

以下に、画像の情報を文字起こしし、対応するJSONプロパティを表にまとめました。

### 列の情報の種類と対応するJSON

今回紹介するのは、検証できた下記の**種類！**

| 列の種類 | JSON |
|---|---|
| 1行テキスト | `"text": {}` |
| 複数行テキスト | `"text": {"allowMultipleLines": true}` |
| 選択肢（メニューから選択） | `"choice": {"choices": []}` |
| 数値（1、1.0、100） | `"number": {}` |
| 通貨（$, ¥, €） | `"currency": {}` |
| 日付と時刻 | `"dateTime": {}` |
| 参照（このサイトにある既存の情報） | `"lookup": {}` |
| はい/いいえ（チェック ボックス） | `"boolean": {}` |
| ユーザーまたはグループ | `"personOrGroup": {}` |
| ハイパーリンクまたは画像 | `"hyperlinkOrPicture": {}` |
| 集計値（他の列を基にした計算結果） | `"calculated": {}` |

**改めてみると列の種類が多い！**
設定値まで含めると、範囲が膨大になるため、基本的な記法に限定して書きます！

**■ 基本的な列の構成は、下記のようになります。**

```json:1行テキストの例
{
  "name": "内部名",
  "displayName": "表示名",
  "text": {}
}
```

`name`が`内部名`、`displayName`が`表示名`です。
**別々に指定できるのが、ほんっとうに嬉しい！✨**

### 列ごとのJSONの例

#### 1行テキスト
こちらで作成してみると

```json:1行テキスト
{
    "name": "InternalTextFieldName",
    "displayName": "表示名だよ",
    "text": {}
}
```

良い感じに・・・👀✨

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/5734f304-c0a2-10bc-1f9e-15d87215d9e5.png)

内部名も反映されている🙌

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/5397fbfa-813d-de20-a43b-7e56338cba08.png)


#### 複数行テキスト

`text`の`allowMultipleLines`を`true`にすることで設定できます。

```json:複数行テキスト
{
    "name": "InternalTextFieldName",
    "displayName": "表示名だよ",
    "text": {
        "allowMultipleLines": true
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/38de7c87-f9d4-af68-fbeb-78598de4d38a.png)

#### 選択肢（メニューから選択）

選択肢は`choice.choices`から配列で選択肢を指定します。

```json:選択肢
{
  "name": "ChoiceField",
  "displayName": "選択肢項目",
  "choice": {
    "choices": ["1", "いち", "わん"]
  }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/433c289c-59b8-15a2-79dc-ffa1e1079fc1.png)

#### 数値（1、1.0、100）
数値は、シンプルに`number`を指定すればOK！

```json:数値
{
    "name": "NumberColumn",
    "displayName": "数字",
    "number": {}
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/f9164adc-9145-17fc-788b-b1ee4a0f08f3.png)


#### 通貨（$, ¥, €）
`数値`と`通貨`は別もの💰

```json:通貨
{
  "name": "CurrencyColumn",
  "displayName": "通貨型",
  "currency": {}
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/ba30cab2-d61b-ea27-04a5-706a2ce2388e.png)


#### 日付と時刻
`dateTime`で指定すると、`時間を含める`にチェックが入った状態で作成されます。

```json:日付と時刻
{
  "name": "DateTimeFieldColumn",
  "displayName": "日時",
  "dateTime": {}
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/b339a6e1-27b4-a858-00cf-250a651b3713.png)

`dateTime`に`"format": "dateOnly"を設定すると、日付のみになります。

```json:日付のみ
{
    "name": "DateFieldColumn",
    "displayName": "日付",
    "dateTime": {
        "format": "dateOnly"
    }
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/02712ccd-8037-16bd-855f-16707cadba8e.png)

#### はい/いいえ（チェック ボックス）
`はい/いいえ`は`Boolean`で設定できます。

```json
{
  "name": "Boolean",
  "displayName": "はい、いいえ",
  "boolean": {}
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/8bf80593-bb8c-6a6f-ea3d-dc4521e55f3a.png)


#### ユーザーまたはグループ
`personOrGroup`は、デフォルトで`グループの選択を許可`

```json
{
  "name": "PersonGroup",
  "displayName": "人やグループ",
  "personOrGroup": {}
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/7af33c7a-c32f-6a51-ffb7-cb995a0b3ce2.png)

#### ハイパーリンクまたは画像
`ハイパーリンク`は、そのまんま

```json:ハイパーリンク
{
    "name": "HyperlinkField",
    "displayName": "ハイパーリンク",
    "hyperlinkOrPicture": {}
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/4575b8c0-21e6-8d09-5d36-826506b367ab.png)


#### 集計値（他の列を基にした計算結果）
集計列も作れてしまう！

```json:集計値
{
    "columns": [
        {
            "name": "Column1",
            "displayName": "Column1",
            "number": {}
        },
        {
            "name": "Column2",
            "displayName": "Column2",
            "number": {}
        },
        {
            "name": "SUM",
            "displayName": "足し算",
            "calculated": {
                "formula": "=([Column1]+[Column2])"
            }
        }
    ]
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/7b5c1714-3892-d0c1-d254-4674b76a0b5c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734332/c6ddacb0-5a26-0d4c-7422-e4647f8dd985.png)

# おわりに
非常に大変な実験でした・・・。
`_api/v2.1/sites/root/lists` でチャレンジした結果、かなり労力がかかりました。
列の詳細設定など深堀できるところは、まだまだあるので、**今後もアップデートしていきたいと思います！**

温かい目で見守ってください🐟✨