Power Automate と SharePoint REST API を使って内部名と表示名が異なる列を1リクエストで作成する
SharePoint は REST API や Power Automate で利用するとき、なにかと列の内部名が必要になるシーンが多いです。
そのため、列の内部名を指定の値に設定したいのですが、これを画面から手動で行うなら、列の作成時は内部名にしたい文字列で作成しその後列を表示名にしたい文字列で更新するといった面倒な方法をとる必要があります。
今回は SharePoint REST API を使ってそこを楽する方法を記載したいと思います。
ちなみにタイトルの1リクエストで作成するができるのは、ケース3です。
作成する列の種類の指定の方法など JSON や XML にどのように定義したらよいかをお探しの場合は、参考のリンクをご確認いただく、または GET でそれぞれのエンドポイントにリクエストを投げて、実行結果からをコピーするなどやってみてください。
注意事項
この記事中で、列の内部名、表示名という言葉を使っていますが、よく使われているだけで正式なものではありません。
手動で列を作成したときに画面に表示される値を表示名、URL バーに表示されるものを内部名として扱っています。
事前準備(共通部分)
API を実行するよう方法はいろいろあると思いますが、今回は Power Automate で以下のようなフローを作成して実行します。
共通部分として、以下の赤枠の部分を先に作成しておきます。
-
フローの全体像
-
変数を初期化する : 対象のリストがあるサイトURL、対象のサイトの内部名
-
変数を初期化する : 列を作成するリストの表示名、作成する列の表示名、作成する列の内部名
それと検証用の SharePoint サイトとカスタムリストを作成しておきます。
- SharePoint サイト、カスタムリスト
ケース1 : REST API v1.0 と JSON で列を作成する
まず、1番よく使われているであろう、~/fields エンドポイントに POST する方法でやってみます。
事前準備で作成したフローに以下の赤枠の部分を追加します。
-
追加部分
-
SharePoint に HTTP 要求を送信します : CreateFieldFromJSON の設定値
項目 | 設定値 |
---|---|
サイトのアドレス | {対象のリストがあるサイトURL} |
方法 | POST |
URI | Accept : /_api/lists/getbytitle('{列を作成するリストの表示名}')/fields
|
ヘッダー | Accept : application/json;odata=verbose, Content-Type : application/json;odata=verbose |
ボディ | 以下に記載 |
{
"__metadata": {
"type": "SP.Field"
},
"Title": "{作成する列の内部名}",
"FieldTypeKind": 2,
"Required": "true",
"EnforceUniqueValues": "true",
"Indexed": true
}
- SharePoint に HTTP 要求を送信します : UpdateFieldFromJSON の設定値
項目 | 設定値 |
---|---|
サイトのアドレス | {対象のリストがあるサイトURL} |
方法 | POST |
URI | Accept : /_api/lists/getbytitle('{列を作成するリストの表示名}')/fields/getbytitle('{作成する列の内部名}')
|
ヘッダー | Accept : application/json;odata=verbose, Content-Type : application/json;odata=verbose, X-HTTP-Method : MERGE |
ボディ | 以下に記載 |
{
"__metadata": {
"type": "SP.Field"
},
"Title": "{作成する列の表示名}"
}
- 実行結果
無事、列の表示名と、内部名を指定したもので作成することができました。
仕組みとしては、1つ目のリクエストで内部名にて列を作成し、2つ目のリクエストで表示名で列を更新するという、普段画面上で行っていることを API に置き換えて実行しただけです。
列を作成するときのプロパティはいろいろあるのですが、いくつか試しても、内部名と表示名を別々に指定して作成することはできず、2リクエスト必要になります。
ケース2 : REST API v1.0 と XML で列を作成する
次に、~/field/createfieldasxml エンドポイントに POST する方法でやってみます。
事前準備で作成したフローに以下の赤枠の部分を追加します。
-
追加部分
-
SharePoint に HTTP 要求を送信します : CreateFieldFromXML の設定値
項目 | 設定値 |
---|---|
サイトのアドレス | {対象のリストがあるサイトURL} |
方法 | POST |
URI | Accept : /_api/lists/getbytitle('{列を作成するリストの表示名}')/fields/createfieldasxml
|
ヘッダー | Accept : application/json;odata=verbose, Content-Type : application/json;odata=verbose |
ボディ | 以下に記載 |
{
"parameters": {
"__metadata": {
"type": "SP.XmlSchemaFieldCreationInformation"
},
"SchemaXml": "<Field Type=\"Text\" DisplayName=\"{作成する列の内部名}\" Required=\"TRUE\" EnforceUniqueValues=\"TRUE\" Indexed=\"TRUE\"/>"
}
}
-
SharePoint に HTTP 要求を送信します : UpdateFieldFromJSON の設定値
ケース1と同じなので割愛 -
実行結果
こちらも無事、列の表示名と、内部名を指定したもので作成することができました。
仕組みとしては、ケース1と同じで、列の作成、更新を順番に実行しています。
こちらも同じく、列を作成するときのプロパティはいろいろあるのですが、いくつか試しても、内部名と表示名を別々に指定して作成することはできず、2リクエスト必要になります。
ケース3 : REST API v2.0 と JSON で列を作成する
最後に、v2.0 ~/columns エンドポイントに POST する方法でやってみます。
事前準備で作成したフローに以下の赤枠の部分を追加します。
-
追加部分
-
SharePoint に HTTP 要求を送信します : v2.0CreateFieldFromJSON の設定値
項目 | 設定値 |
---|---|
サイトのアドレス | {対象のリストがあるサイトURL} |
方法 | POST |
URI | Accept : /_api/v2.0/sites/{対象のサイトの内部名}/lists/{列を作成するリストの表示名}/columns
|
ヘッダー | Accept : application/json, Content-Type : application/json |
ボディ | 以下に記載 |
{
"displayName": "{列を作成するリストの表示名}",
"name": "{作成する列の内部名}",
"required": true,
"enforceUniqueValues": true,
"indexed": true,
"text": {}
}
- 実行結果
なんと、列の表示名と、内部名を指定したもので作成できるだけでなく、1リクエストで完了してしまいました。
v2.0 すごい!というかできるなら、画面上からも入力できるようにしてほしい!
感想
というわけで、ケース3にて個人的な長年の夢だった、1リクエストで内部名と表示名を同時に指定する、が実現できて非常にうれしかったです。
ループ処理を使ったりすれば、列作成ツールなんかを作成することも可能ですので、興味ある方はぜひやってみてください。
もし、何度も同じような列を作成する場合は、こんなことしなくてもサイト列とサイトコンテンツタイプを作って展開するという方法もありますので、そちらもお勧めです。
参考 SharePoint REST API v1.0
SharePoint REST API v1.0 概要
列の操作に関する詳細なリファレンスと JSON 定義の参考 (かなり古いけど使える)
XML 定義の参考
参考 SharePoint REST API v2.0
SharePoint REST API v2.0(= Microsoft Graph API の一部) 概要
列の作成に関する詳細なリファレンス
JSON 定義の参考
Discussion