Power AutomateでSharePoinリストのユーザー型の列の値をクリアする

## はじめに
SharePointリストで、すでに登録されている値をクリアしたいという場合、テキストならnullで上書きしてやればよいのですが、ユーザー型を消そうとした際に場合にはうまく消せませんでした。試行錯誤しながらネットの海を探し回って、いくつか解説を見つけたものの、とっても大事な部分を強調して説明されていなかったので記事にしてみました。
## 対象となる人
SharePointリストをPower Automateから操作する方向けです。

## 列のタイプ「ユーザー」
まずサンプルのSharePointリストを作ります。列の追加から「ユーザー」を選択します。便宜上この記事では「ユーザー型」と呼びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/9037e6ce-d7a3-da62-d17f-da80cfa42da1.png)
名前は「user」と付けました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/1acc58c9-4b1c-4892-5b8b-d59c1d1ab333.png)
比較するために、age列を数値型、memo列をテキスト型で作り、１レコードサンプルとして作成しました。nameのところにテナントから検索したユーザー「Patti Fernandez」が入ってます。皆さんはテナントに実際にいるユーザーや、自分自身のメールアドレスを入力して検索できたユーザーを指定してください。今回はこの値の部分をPower Automateからどうやって消すかがテーマです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/ca04e9e6-11a5-10bb-e4d6-bd121b9197d4.png)

## まずは失敗例
まずは、数値型のage列と、テキスト型のmemo列をクリアしてみます。消す前はこんな状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/88d0d312-5b4e-3147-c9c7-9beea91facc0.png)
Power Automateのアクションから、SharePointの中にある「項目の更新」を使います。ageの欄にカーソルを置き、動的なコンテンツを選択できる状態になったら「式」を選択します。式の中身にはnullと入力して、「ＯＫ」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/9bc602a9-80e0-167b-ece7-df54680930ae.png)

同じ手順でmemo列にもnullの式を入れてやると、以下のような状態になります。ちなみに、何も入力しなかった列には変更はかかりません。
IDの列に1と入力しているのは、あらかじめテストで入力したSharePointリストの行番号です。SharePointリストで新規にレコードを登録すると自動的に振られるID列は初期状態では隠れているので、「すべてのアイテム」＞「現在のビューの編集」からID列を表示させることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/35da4e1d-eaa5-f0f0-cc73-19ac3f4c48cd.png)

早速テストを実行して、SharePointリストがどうなったか見てみましょう。ageとmemoの値がクリアできました。非常に簡単です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/f912a65c-677f-f632-7f58-780691629499.png)
では、ユーザー型であるuser列も「null」で更新してみるとどうなるでしょう？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/64ad91f1-1843-eb37-4912-590fd4e6d6cb.png)
nullで更新した場合、エラーこそ出ませんでしたが消えませんでした。
テストの出力結果を見てみると、user値は単なるテキストではなくて、user Claims,user DisplayName,user Email,user Picture,user Department,user JobTitleなど複数の値が入っています。もともとテナントのユーザーを選択して使えるという列なので、情報がまとまって入っているようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/67347698-f90f-d728-6186-95da89ede992.png)
## SharePointにHTTP要求を送信　で読み取り
既存のアクションだと更新が無理そうなので、「SharePointにHTTP要求を送信する」アクションを使います。これはPower AutomateがGUIで簡単に実現してくれる裏側の仕組みに直接要求を送って、アクションだけではうまくいかない命令も届けてしまおうというものです。

このアクションの使い方は、こちらのYouTube動画がとても分かりやすかったです。
https://www.youtube.com/watch?v=_mZhSKTxGLQ
動画の手順に従って、アクションを設定します。
まずは、SharePointリストがどんな応答をしてくるのか、動画のやり方に従って、リストの読み出しをして確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/e179bcf6-211e-12c9-dc01-0943414bb4b5.png)
|項目  |値  |備考|
|---|---|---|
|サイトのアドレス  |SharePointリストがあるサイトを選択  ||
|方法  |GET | |
|URI  |_api/web/lists/GetByTitle('testList')/items(1)|testListの部分は使っているリスト名に変更してください。IDの番号は更新したい行のID番号にしてください。|
|ヘッダー||入力しない|
|ボディー||入力しない|

テスト動作を動かしてみると、こんな値が取れました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/dbf139d0-4880-72a0-c8ec-9d9aed974881.png)
取得できた値で、ユーザー型のuser列の部分が、userIdとuserStringIdであらわされています。しかもどちらも12になっている。これはなんでしょう？ http://portal.azure.com から確認してもユーザーにこんなIDはついていません。おそらくSharePointで選択可能なユーザーリストに対してついているIDなのかしら？

とりあえず、今回のテーマはこのユーザーをリストの値から消したいので、userIdは数値で。userStringIdは空文字で上書きしてやればよさそうです。
**項目の指定は厳密に行わないといけないので、この部分をテキストエディタにコピーしておきます。**

## SharePointにHTTP要求を送信　で上書き
ふたたび、動画を参考にしてSharePointリストの中身を更新していきます。読み取りの場合はヘッダーは不要でしたが、更新する場合には以下のように設定します。
ヘッダーはJSON形式入力モードに切り替えて、以下の表のJSONを貼り付けると間違いがなくてよいでしょう。なぜかcontent-typeの後ろに半角スペースを入れないとエラーとなります。これって仕様？？
|項目  |値  |備考|
|---|---|---|
|サイトのアドレス  |SharePointリストがあるサイトを選択  ||
|方法  |POST | |
|URI  |_api/web/lists/GetByTitle('**testList**')/items(1)|testListの部分は使っているリスト名に変更してください。|
|ヘッダー|{"content-type ": "application/json;odata=verbose","If-Match": "*","X-HTTP-Method": "MERGE"}|content-typeの後ろに半角スペースが入っているのがポイントです。|
|ボディー|{"**user**Id": 0,"**user**StringId": ""}|太字の部分は列名によって変えてください。ここがポイントです。さきほどコピーした文字列を使ってIDを0に。""の中身を空にしてください。|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/856d728d-a389-7ed0-d645-bc5e6f126855.png)
実行してみると、ついにユーザー型の値を消すことができました！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285141/ca791ecd-e261-8904-22f5-01a45974524b.png)

## 最後に
ユーザー型については特殊でnullでは消せないのですが、これはぜひ簡単に消せるようにしてほしいですね。HTTP要求はかなり繊細な作業が必要でなかなかハードルが高いですが、ピンポイントで使い方をストックしておくと、いつか役に立つかもしれません。
https://learn.microsoft.com/ja-jp/sharepoint/dev/sp-add-ins/working-with-lists-and-list-items-with-rest