[MODIFIER型のフィールドに値を設定することはできません。]の回避方法

何を実現したいのかを書きましょう

①このJSを設定するアプリでUSER(ユーザー選択)を行う
②選択されたユーザーと一致する値をもつアプリID:2のAccount(ユーザー選択)のレコードを検索
③一致するレコードのID(文字列)をコピーし、①のアプリのID(文字列複数)にカンマ区切りでコピー
(例えば、USERで2つアカウントを設定すると①のアプリのIDフィールドにID1,ID2のような形で入る)

発生した問題やエラーメッセージを具体的に書きましょう

新規レコード追加時には想定通りの挙動
編集保存時に[“MODIFIER型のフィールドに値を設定することはできません。”]のエラーが出る

原因はPUTする際に更新者フィールドの値をkintone側で自動でセットしてしまっていることと推測
更新者フィールド削除処理も試すも効果がなかった

実行したコードをコピー&ペーストしましょう

(function() {
“use strict”;

// レコードが追加または編集されたときのイベント
kintone.events.on(['app.record.create.submit', 'app.record.edit.submit'], function(event) {
    // アプリID
    var anotherAppId = 2; // 

    // ユーザ選択フィールドの値を取得
    var userFieldValues = event.record['USER'].value;

    // ユーザIDを取得して比較するための配列を作成
    var selectedUserIds = userFieldValues.map(function(user) {
        return user.code; // ユーザーIDを取得するためにはcodeプロパティを使用します
    });

    // 別のアプリからレコードを検索して条件に合致するレコードを取得
    kintone.api(kintone.api.url('/k/v1/records', true), 'GET', {
        "app": anotherAppId,
        "query": 'Account in ("' + selectedUserIds.join('","') + '")',
        "fields": ["ID"]
    }, function(resp) {
        if (resp.records.length > 0) {
            // 別のアプリから取得したレコードのIDをカンマ区切りで結合して設定
            var roomIds = resp.records.map(function(record) {
                return record['ID'].value;
            }).join(',');

            event.record['ID'].value = roomIds.toString(); // 文字列に変換して設定

            // レコードの内容を更新
            kintone.app.record.set({record: event.record});
            
            // レコードが新規作成か更新かを確認
            var method = (event.type === 'app.record.create.submit') ? 'POST' : 'PUT';

            // レコードIDを取得
            var recordId = (event.type === 'app.record.edit.submit') ? event.recordId : null;

            // レコードを保存
            kintone.api(kintone.api.url('/k/v1/record', true), method, {
                "app": kintone.app.getId(),
                "record": event.record,
                "id": recordId // 更新時にレコードIDを指定
            }, function(saveResp) {
                // レコードの保存が成功した場合の処理
                console.log('レコードが正常に保存されました:', saveResp);
                // 保存後の画面遷移
                location.href = "/k/" + kintone.app.getId() + "/"; // レコード一覧に遷移
            }, function(saveError) {
                // レコードの保存が失敗した場合の処理
                console.error('レコードの保存中にエラーが発生しました:', saveError);
                alert("レコードの保存中にエラーが発生しました: " + saveError.message);
            });
        } else {
            alert("別のアプリのレコードが見つかりませんでした。");
        }
    }, function(error) {
        console.error(error);
        alert("エラーが発生しました: " + error.message);
    });

    // イベントのデフォルトの動作を中止
    return false;
});

})();

こんにちは。

推察の通り、[“MODIFIER型のフィールドに値を設定することはできません。”] のエラーは、
更新者フィールドに値を設定しようとした際に発生するエラーかと思います。

※ 更新者フィールドは値の登録のみ可能で、更新できないみたいです。
参考:フィールド形式 - cybozu developer network

実行したコードでは、PUT 処理で “record”: event.record を指定してるので、
更新者フィールドに対しても値の更新が行われてエラーが発生してように見えます。

更新者フィールド削除処理を試した際にも、正常にフィールドの削除が出来ておらず、
エラーが発生していたのかなと思いますよ。

更新者フィールド削除処理を追加して、正常にフィールドの削除が行えているか、
確認してみるといいかもです。

実行されたリクエストは、開発者ツールから確認できるので確認してみてください。

「いいね!」 1

ご回答ありがとうございます!
再度、更新者フィールド削除処理を実施してみたいと思います

「いいね!」 1

このトピックはベストアンサーに選ばれた返信から 3 日が経過したので自動的にクローズされました。新たに返信することはできません。