# レコード詳細画面表示時のロジック内で値を変更したい

**URL:** <https://community.cybozu.dev/t/topic/8235>\
**Category:** kintone 開発相談\
**Created:** [2023 年 10 月 22 日午後 4:37 UTC](https://community.cybozu.dev/t/topic/8235 "2023-10-22T16:37:15Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![shibatax](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/shibatax/32/429_2.png) [@shibatax](https://community.cybozu.dev/u/shibatax)\
**Post date:** [2023 年 10 月 22 日午後 4:37 UTC](https://community.cybozu.dev/t/topic/8235/1 "2023-10-22T16:37:15Z")

</div>

レコード詳細画面が表示された時に、ロジック内で自動計算された値をフィールドに保存したく、kintone.app.record.set(record) を使おうとしました。  
しかし、エラーが発生して保存できないため、以下のドキュメントを読むと

> **[レコードに値をセットする](https://cybozu.dev/ja/kintone/docs/js-api/record/set-record-value/)**
>
> 現在開いているレコードに値をセットします。

> `kintone.events.on()` のイベントハンドラー内では実行できません。  
> このイベントハンドラー内で、レコードの値をセットするには、ハンドラーに渡さ\> れる引数のイベントオブジェクトを return してください。

と書かれています。  
困ったことに具体的なサンプルのコードが見つからず、解決方法をイメージできません。  
どのような解決方法になるか、教えていただけますと幸いです。  
よろしくお願いいたします。

---

<div class="post-metadata">

**Author:** ![y\_minamitani9534](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/y_minamitani9534/32/462_2.png) [@y\_minamitani9534](https://community.cybozu.dev/u/y_minamitani9534)\
**Post date:** [2023 年 10 月 23 日午前 12:23 UTC](https://community.cybozu.dev/t/topic/8235/2 "2023-10-23T00:23:50Z")

</div>

@shibatax さん

こんにちは、少しお力になれそうだったので回答させていただきました。  
そうですよね、そのようにしか書かれてないと わからないですよね 💦  
詳細画面では、event変数をreturnしても値もできないので、REST APIで値を更新する必要があります。  
尚且つ、値を反映されたことを確認するためには値を変更後画面をリロードする必要もあります。  
以下に簡単にフローとサンプルコード書いてみますね。

```javascript
レコード詳細画面イベント発火
↓
event変数や計算したロジックの結果などの値を取得
↓
REST APIで値を更新
↓
画面を更新

```

簡単に書くとこんなフローになるかと思われます。

* * *
コードは、自社の社内共有用に作成してたコードを共有しますね。

```javascript
(() => {
    'use strict'

    //フィールドコード test , test2 , test3 の文字列一行が作成されていることを想定。
    //↓ awaitを使用するためasync関数にする。
    kintone.events.on(['app.record.detail.show'], async (event) => {
        const record = event.record;

        //↓このように画面リロードしたかどうか判別する変数がなければ画面リロードが永遠ループする。
        if (window.name !== "abc") {
            const test = record.test.value + '(複製)';

            //今表示しているレコードのappIDとレコード番号を指定。
            const body = {
                app: kintone.app.getId(),
                id: kintone.app.record.getId(),
                record: {
                    test2: {
                        value: test,
                    },
                    test3: {
                        value: test,
                    }
                }
            };

            //↓ REST APIのPUTメソッドを使用して表示しているレコードを更新
            await kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', body).then(() => {
                //↓ここで画面リロードする処理をおこなう。
                if (window.name !== "abc") {
                    location.reload();
                    window.name = "abc";
                } else {
                    window.name = "";
                }
            });
        }
        return event;
    });
})();

```

ざっくり書きましたが、恐らく言われている事と類似しているんじゃないかなと勝手ながら考えております。  
加えて参考URLを添付いたします。

> **[1 件のレコードを更新する](https://cybozu.dev/ja/kintone/docs/rest-api/records/update-record/)**
>
> 1 件のレコードを更新します。

---

<div class="post-metadata">

**Author:** ![shibatax](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/shibatax/32/429_2.png) [@shibatax](https://community.cybozu.dev/u/shibatax)\
**Post date:** [2023 年 10 月 23 日午前 12:54 UTC](https://community.cybozu.dev/t/topic/8235/3 "2023-10-23T00:54:25Z")

</div>

ご教授いただき、ありがとうございます！  
なるほど、うすうす感じてはいたのですが、やはりREST APIを使うしかないのですね。  
他のアプリとの連携で、REST APIによる値の変更はすでに動いているので、そのメソッドを利用すれば（自アプリに向ければ）よさそうです。  
大変助かりました。

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex015/uploads/cybozu/original/1X/d5c841c3c5a6cb66eed514001c1b45147c9e1f4f.png) [@system](https://community.cybozu.dev/u/system)\
**Post date:** [2023 年 10 月 26 日午前 12:54 UTC](https://community.cybozu.dev/t/topic/8235/4 "2023-10-26T00:54:54Z")

</div>

クローズされました: 2023 年 10 月 26 日午前 12:54 UTC

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