GraphAPIを使ってSharePointのリストに項目を追加する

# はじめに
Microsoft GraphAPIを使ってSharePointのリストに項目を追加する手順です。

# 準備

今回もJavaを使います。Javaの開発環境の他に必要なのは以下です。

- Microsoft Graph Java SDK
- クライアントID/クライアントシークレット生成(EntraID)
- siteidの取得

 上記の手順は前回のわたくしの記事に書かれているので参考にしてください。
 [Javaを使ってSharePointへファイルをアップロードする](https://qiita.com/fukasuke/items/5784e6c0f658f13f57e5,Javaを使ってSharePointへファイルをアップロードする)
 クライアントID/クライアントシークレットを作成するときのアクセス権は「sites.ReadWrite.all」が必要のようです。詳細はMicrosoftのページに記載されています。
 [リストに新しいアイテムを作成する](https://learn.microsoft.com/ja-jp/graph/api/listitem-create?view=graph-rest-1.0&tabs=http)

- リストID
リストIDは追加したいリストの「リストの設定」を表示するとURLに表示されます。

```
https://*****.sharepoint.com/sites/*****/_layouts/listedit.aspx?List=%7Bxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx%7D
```
パラメータ「List」の"%7B"と"%7D"に挟まれている文字列がリストIDです。

 # 実装サンプル
 MSのドキュメントにはなぜかJavaのサンプルが無いですが、こんな感じです。
```java
import com.azure.identity.ClientSecretCredential;
import com.azure.identity.ClientSecretCredentialBuilder;
import com.google.gson.JsonPrimitive;
import com.microsoft.graph.authentication.TokenCredentialAuthProvider;
import com.microsoft.graph.models.FieldValueSet;
import com.microsoft.graph.models.ListItem;
import com.microsoft.graph.requests.GraphServiceClient;

public class SharePointListAddItem {
	public static void main(String[] args) throws Exception {
		final ClientSecretCredential clientSecretCredential = new ClientSecretCredentialBuilder()
		        .clientId("<クライアントID>")
		        .clientSecret("<クライアントシークレット>")
		        .tenantId("<テナントID>")
		        .build();

		final TokenCredentialAuthProvider tokenCredentialAuthProvider = new TokenCredentialAuthProvider(clientSecretCredential);

		GraphServiceClient graphClient = GraphServiceClient.builder().authenticationProvider( tokenCredentialAuthProvider ).buildClient();

        String siteid = "<サイトID>";
        String listid = "<リストID>";

        // ここに各フィールドの値を設定
        FieldValueSet fieldsToUpdate = new FieldValueSet();
        fieldsToUpdate.additionalDataManager().put("Title", new JsonPrimitive("たいとる"));

        ListItem newItem = new ListItem();
        newItem.fields = fieldsToUpdate;

        ListItem item = graphClient.sites(siteid).lists(listid).items().buildRequest().post(newItem);
        System.out.println(item.id);
	}
```
post()メソッドの戻り値のidフィールドに項目のIDが設定されます。このIDを使って項目の更新、削除ができます。※MSのドキュメントに更新、削除のサンプルコードが記載されているため、ここでは割愛。

フィールドの設置値はStringだけでなく、int、日付形式も設定できます。
```Java
fieldsToUpdate.additionalDataManager().put("number", new JsonPrimitive(500000));
fieldsToUpdate.additionalDataManager().put("day", new JsonPrimitive("2023-08-18T18:30:00Z"));
```

# 他調べたこと
### 必須フィールドに値を設定しなくてもエラーにならない
エラーになりません。ちゃんと実装しましょう。

### 選択肢フィールドに選択肢に無い値を設定してもエラーにならない
エラーになりません。ちゃんと実装しましょう。

### 文字列型フィールドに数値を設定してもエラーにならない
数字の文字列として設定される模様。

### 数値型フィールドに文字列を設定するとエラーになる
これは想定した挙動。Bad Requestになります。

### 日付型フィールドに日付型以外の文字列を設定するとエラーになる
これも想定した挙動。同じくBad Requestになります。

### 添付ファイル
GraphAPIでは現時点では項目にファイルを添付することはできないようです。
↓は公式ドキュメントではありませんが、『Currently Graph API doesn't support, add/update/view attachments of list item.』と書かれています。
https://learn.microsoft.com/en-us/answers/questions/883474/create-a-new-item-in-a-list-with-attachment

### ユーザまたはグループフィールド
「ユーザまたはグループ」のフィールドにユーザ、グループを設定することはできません。メールアドレスやObjectIDをGraphAPIで設定することを想像していましたが、出来ないようです。

# 解決策
現時点でのGraphAPIは出来るないことが多すぎで、シンプルな項目の追加しかできません。解決策としては、項目追加時にPower Automateでフィールド値を補完してあげるくらいでしょうか。
今回はJavaのWEBシステムで、とある書類を作成してワークフローを実行する必要がありました。ワークフローをJavaで実装するのが面倒だったので、ワークフローをPower Automateで行うようにしました。
なので、今回問題になったところはPower Automateで何とかなったので良かったのですが、まだ業務システムで使用するのはちょっと厳しいかな。