詳細画面でボタンを押したら関連レコードの集計値を特定フィールドにセットしたい

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

表示された関連レコード内のカテゴリ別レコード数の集計値をボタンを押したら特定フィールドにセットされるようにしたいです
カテゴリ別レコード数のの集計値をスペースフィールドに表示させることはできています。スペースフィールドに表示させるために取得した値をボタンを押すことでそれぞれ特定のフィールドに値をセットしたいと思ってコード作成を試みています。

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

ボタンを押してもエラーも何も起こらないので、そもそものコードの書き方が違うのかなと思っています。
作成したコードを貼り付けますので、何がいけないのかわかる方いらっしゃいましたらアドバイスいただきたいです

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

(() => {
    'use strict';

    const events = [
        'app.record.detail.show',
        'app.record.edit.show'
    ];

    kintone.events.on(events, async (event) => {
        const clientRecordId = event.record['日付文字列'].value;
        const sagyouAppId = kintone.app.getRelatedRecordsTargetAppId('関連レコード一覧');
        const appUrl = kintone.api.url('/k/v1/records');

        try {
            // 関連レコードを取得
            const query = `日付文字列="${clientRecordId}" limit 500`;
            const params = {
                'app': sagyouAppId,
                'query': query
            };
            const resp = await kintone.api(appUrl, 'GET', params);

            // カテゴリ別のレコード件数を集計
            let counts = {
                'Okazu1keNsu': 0,
                'Gohan1keNsu': 0,
                'Okazu2keNsu': 0,
                'Gohan2keNsu': 0
            };

            resp.records.forEach(record => {
                const factory = record['所属工場'].value;
                const category = record['弁当区分2'].value;

                if (factory === '第一工場') {
                    if (category === '1') {
                        counts['Okazu1keNsu']++;
                    } else if (category === '2') {
                        counts['Gohan1keNsu']++;
                    }
                } else if (factory === '第二工場') {
                    if (category === '1') {
                        counts['Okazu2keNsu']++;
                    } else if (category === '2') {
                        counts['Gohan2keNsu']++;
                    }
                }
            });

            // カテゴリ別のレコード件数をそれぞれのスペースフィールドに表示
            for (const field in counts) {
                const divKeNsu = document.createElement('div');
                divKeNsu.style.fontWeight = 'bold';
                divKeNsu.style.textAlign = 'left';
                divKeNsu.style.verticalAlign = 'middle';
                divKeNsu.style.fontSize = '12px';

                // 下詰めスタイルの追加
                divKeNsu.style.display = 'flex';
                divKeNsu.style.alignItems = 'flex-end';

                const countSpan = document.createElement('span');
                countSpan.style.marginRight = '5px';
                countSpan.innerHTML = counts[field];

                const unitSpan = document.createElement('span');
                unitSpan.innerHTML = ' 件';

                divKeNsu.appendChild(countSpan);
                divKeNsu.appendChild(unitSpan);

                kintone.app.record.getSpaceElement(field).appendChild(divKeNsu);
            }

            // ボタンを追加
            const buttonDiv = document.createElement('div');
            buttonDiv.style.marginTop = '10px';
            const button = document.createElement('button');
            button.innerHTML = '数量反映';
            button.onclick = function() {
                // 各フィールドに値をセット
                const record = kintone.app.record.get();
                record.record['第一工場の弁当1集計_'].value = counts['Okazu1keNsu'];
                record.record['第一工場の弁当2集計_'].value = counts['Gohan1keNsu'];
                record.record['第二工場の弁当1集計_'].value = counts['Okazu2keNsu'];
                record.record['第二工場の弁当2集計_'].value = counts['Gohan2keNsu'];

                kintone.app.record.set(record);
            };
            buttonDiv.appendChild(button);
            kintone.app.record.getSpaceElement('botan').appendChild(buttonDiv);

        } catch (err) {
            console.error(err);
        }

        return event;
    });
})();

ボタンは表示されてるってことですよね、なにかしらエラーでそうにもみえますけどねぇ…
問題の切り分けのためにonclickの中でログだしたり、ブレークポイントはってみてはいかがでしょうか

https://cybozu.dev/ja/id/42b1d7ce01fd5d9b53dbf4df/#methods-list-4

mura様
お返事ありがとうございます
確認したところ特に問題になるところはみあたらなかったです。
編集画面でボタンを押すとうまくいくようでしたが、詳細画面でボタンを押しても何もならないのは、詳細画面上では値のセットはできないということでしょうか?初心者でよくわかっていないのですが、ご教授いただきたいです。よろしくお願いします

あーなるほど、意味わかりました!

詳細画面上では値のセットはできないということでしょうか

これは、Yesです。
kintone.app.record.set() は編集画面や作成画面でフォームに値いれるものですね。
で、詳細画面においてはどうするのかというとやりたいこと次第でして、

  1. 見た目だけ変えれば良い
  2. データ自体を変えたい
    • 保存されているデータを編集画面外から書き換えることになりますので、REST API経由で変更する必要があります。さらにこの場合は、通信してる間にSpinnerを挟んだり、終わったあとは画面をリロードするなどの処理も考慮する必要がありますね。
    • 不慣れで、かかるコストを考えると編集画面からやってください、が素直ではありますね。
1 Like