# レコード件数のリアルタイム取得

**URL:** <https://community.cybozu.dev/t/topic/9844>\
**Category:** kintone 開発相談\
**Created:** [2024 年 12 月 12 日午前 2:51 UTC](https://community.cybozu.dev/t/topic/9844 "2024-12-12T02:51:54Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![LALA](https://avatars.discourse-cdn.com/v4/letter/l/b5e925/32.png) [@LALA](https://community.cybozu.dev/u/LALA)\
**Post date:** [2024 年 12 月 12 日午前 2:51 UTC](https://community.cybozu.dev/t/topic/9844/1 "2024-12-12T02:51:54Z")

</div>

Aアプリ（活動履歴アプリ）のレコード件数をBアプリ（顧客管理アプリ）の数値フィールド（活動履歴数）にリアルタイムで表示させたいと考えています。  
トリガーはAアプリにレコードが登録/更新されたタイミングとしたく、  
レコード抽出条件は両アプリに存在する「顧客管理レコード番号」が一致したレコードとしたいです。

いろいろと調べながら自分なりにコードを書いてJSファイルをAアプリに登録して動かしてみましたが、  
Aアプリでレコード登録してもBアプリに件数が反映されませんでした。

何が間違っているのか、そもそもそのようなことは技術的に難しい等ご教示いただけますと幸いです。  
よろしくお願いいたします。

＜ソースコード＞

```javascript
(function() {
    "use strict";

    const B_APP_ID = "1833"; // BアプリID
    const MANAGEMENT_NUMBER_FIELD = "顧客管理レコード番号"; 
    const COUNT_FIELD_CODE = "活動履歴数"; 

    const events = [
        'app.record.create.submit.success',
        'app.record.edit.submit.success'
    ];

    kintone.events.on(events, async function(event) {
        const record = event.record;
        const managementNumber = record[MANAGEMENT_NUMBER_FIELD].value;

        // Bアプリのデータを取得
        const query = encodeURIComponent(`顧客管理レコード番号 = "${managementNumber}"`);
        const url = `/k/v1/records.json?app=${B_APP_ID}&query=${query}`;

        const response = await kintone.api(url, "GET");
        const records = response.records;
        const count = records.length;

        // Bアプリのレコードを更新
        if (records.length > 0) {
            const recordId = records[0].$id.value; // 最初のレコードのIDを取得
            const updateBody = {
                app: B_APP_ID,
                id: recordId,
                record: {
                    [COUNT_FIELD_CODE]: {
                        value: count
                    }
                }
            };

            await kintone.api('/k/v1/record.json', 'PUT', updateBody);
        }

        return event;
    });
})();

```

---

<div class="post-metadata">

**Author:** ![puppet](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/puppet/32/2126_2.png) [@puppet](https://community.cybozu.dev/u/puppet)\
**Post date:** [2024 年 12 月 12 日午前 3:02 UTC](https://community.cybozu.dev/t/topic/9844/2 "2024-12-12T03:02:57Z")

</div>

```javascript
                record: {
                    [COUNT_FIELD_CODE]: {
                        value: count
                    }
                }

```

の箇所ですが、何かエラーが出ていないでしょうか？

```javascript
                record: {
                    `${COUNT_FIELD_CODE}`: {
                        value: count
                    }
                }

```

や、

```javascript
                //直書き
                record: {
                    "活動履歴数": {
                        value: count
                    }
                }

```

に変更してみるとどうでしょうか？

現在 @LALA さんがお使いの書き方が見慣れない方法のため、質問です。

---

<div class="post-metadata">

**Author:** ![LALA](https://avatars.discourse-cdn.com/v4/letter/l/b5e925/32.png) [@LALA](https://community.cybozu.dev/u/LALA)\
**Post date:** [2024 年 12 月 12 日午前 4:05 UTC](https://community.cybozu.dev/t/topic/9844/3 "2024-12-12T04:05:34Z")

</div>

早速のご回答ありがとうございます。  
申し訳ございません、いろいろなサイトで調べながら試行錯誤してコードを書いてみたのでおかしな記述になっていると思います…。

```javascript
                record: {
                    [COUNT_FIELD_CODE]: {
                        value: count
                    }
                }

```

元のソースコードについて改めてコンソール画面を確認すると、以下のエラーが出ていました。

＜表示されたエラーメッセージ＞

```javascript
edit.js:205 Uncaught Error: USAGE: kintone.api(pathOrUrl, method, params, opt_callback, opt_errback)
    at Object.Tq [as api] (edit.js:205:61)
    at download.do?app=1834&jsType=DESKTOP&contentId=41533&hash=6edb6141126b0fcd55c575dea894e3370f24a54c:21:40
    at edit.js:258:482
    at new vk (edit.js:125:449)
    at qx (edit.js:258:461)
    at edit.js:258:257
    at e.o (edit.js:127:285)
    at Mk (edit.js:129:271)
    at Gk (edit.js:129:154)
    at f.et (edit.js:870:125)

```

また、教えていただきました内容に修正したところ、それぞれ以下のエラーメッセージが表示されました。

＜修正したコード＞

```javascript
                record: {
                    `${COUNT_FIELD_CODE}`: {
                        value: count
                    }
                }

```

＜表示されたエラーメッセージ＞  
`download.do:32 Uncaught SyntaxError: Unexpected template string`

＜修正したコード＞

```javascript
                //直書き
                record: {
                    "活動履歴数": {
                        value: count
                    }
                }

```

＜表示されたエラーメッセージ＞

```javascript
Uncaught Error: USAGE: kintone.api(pathOrUrl, method, params, opt_callback, opt_errback)
    at Object.Tq [as api] (edit.js:205:61)
    at download.do?app=1834&jsType=DESKTOP&contentId=41529&hash=5b6cc49f15a9bc36453c9aad7e2360c026e846d0:21:40
    at edit.js:258:482
    at new vk (edit.js:125:449)
    at qx (edit.js:258:461)
    at edit.js:258:257
    at e.o (edit.js:127:285)
    at Mk (edit.js:129:271)
    at Gk (edit.js:129:154)
    at f.et (edit.js:870:125)

```

何が原因かお分かりになりますでしょうか…？

---

<div class="post-metadata">

**Author:** ![puppet](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/puppet/32/2126_2.png) [@puppet](https://community.cybozu.dev/u/puppet)\
**Post date:** [2024 年 12 月 12 日午前 5:18 UTC](https://community.cybozu.dev/t/topic/9844/4 "2024-12-12T05:18:14Z")

</div>

```javascript
            await kintone.api('/k/v1/record.json', 'PUT', updateBody);

```

を、

```javascript
            await kintone.api(kintone.api.url('/k/v1/record.json',true), 'PUT', updateBody);

```

に変更してみるとどうでしょうか？  
更新元になる1834アプリからみて、自分自身かそうでない（1833アプリ）かでkintone.api()の挙動が変わるのかなと思ったので。

---

<div class="post-metadata">

**Author:** ![LALA](https://avatars.discourse-cdn.com/v4/letter/l/b5e925/32.png) [@LALA](https://community.cybozu.dev/u/LALA)\
**Post date:** [2024 年 12 月 12 日午前 7:28 UTC](https://community.cybozu.dev/t/topic/9844/5 "2024-12-12T07:28:15Z")

</div>

ご返信いただきありがとうございます！  
教えていただきましたコードに変更しましたが、件数は表示されませんでした…。

record: {～～の部分は以下の通りにしております。

```javascript
                record: {
                    [COUNT_FIELD_CODE]: {
                        value: count
                    }
                }

```

Aアプリでのレコード登録時にコンソール画面には以下のメッセージが表示されています。  
`Uncaught SyntaxError: Unexpected template string (at download.do?app=1834&jsType=DESKTOP&contentId=41565&hash=f9145c4acd95b2858449e349152d460a1c171f5a:32:21)`

---

<div class="post-metadata">

**Author:** ![puppet](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/puppet/32/2126_2.png) [@puppet](https://community.cybozu.dev/u/puppet)\
**Post date:** [2024 年 12 月 13 日午前 12:12 UTC](https://community.cybozu.dev/t/topic/9844/6 "2024-12-13T00:12:20Z")

</div>

エラー内容に変化が見られましたね！

```javascript
            const updateBody = {
                app: B_APP_ID,
                id: recordId,
                // フィールドコードを文字列にせず直書き
                record: {
                    活動履歴数: {
                        value: count
                    }
                }
            };

            // URLをkintone.api.url()で囲う
            await kintone.api(kintone.api.url('/k/v1/record.json',true), 'PUT', updateBody);

```

こちらのコードにするとどうでしょうか？  
私はフィールドコードを日本語で記述しないので違和感がありますが、[こちらのページ](https://cybozu.dev/ja/id/607d2f57a86f03ca70588ab8/#sample-code)だとダブルクォーテーションで囲っていないようでしたので。

---

<div class="post-metadata">

**Author:** ![LALA](https://avatars.discourse-cdn.com/v4/letter/l/b5e925/32.png) [@LALA](https://community.cybozu.dev/u/LALA)\
**Post date:** [2024 年 12 月 13 日午前 3:47 UTC](https://community.cybozu.dev/t/topic/9844/7 "2024-12-13T03:47:50Z")

</div>

引き続きご確認いただきありがとうございます。。  
ご教示いただいたコードに変更しまして現在は全体として以下のコードになっております。

```javascript
(function() {
    "use strict";

    const B_APP_ID = "1833"; // BアプリID
    const MANAGEMENT_NUMBER_FIELD = "顧客管理レコード番号"; 
    const COUNT_FIELD_CODE = "活動履歴数"; 

    const events = [
        'app.record.create.submit.success',
        'app.record.edit.submit.success'
    ];

    kintone.events.on(events, async function(event) {
        const record = event.record;
        const managementNumber = record[MANAGEMENT_NUMBER_FIELD].value;

        // Bアプリのデータを取得
        const query = encodeURIComponent(`顧客管理レコード番号 = "${managementNumber}"`);
        const url = `/k/v1/records.json?app=${B_APP_ID}&query=${query}`;

        const response = await kintone.api(url, "GET");
        const records = response.records;
        const count = records.length;

        // Bアプリのレコードを更新
        if (records.length > 0) {
            const recordId = records[0].$id.value; // 最初のレコードのIDを取得
            const updateBody = {
                app: B_APP_ID,
                id: recordId,
                // フィールドコードを文字列にせず直書き
                record: {
                    活動履歴数: {
                        value: count
                    }
                }
            };

            // URLをkintone.api.url()で囲う
            await kintone.api(kintone.api.url('/k/v1/record.json',true), 'PUT', updateBody);
        }

        return event;
    });
})();

```

こちらを適用してAアプリでレコード登録したところコンソール画面では以下のエラーメッセージが表示されました。

```javascript
edit.js:205 Uncaught Error: USAGE: kintone.api(pathOrUrl, method, params, opt_callback, opt_errback)
    at Object.Tq [as api] (edit.js:205:61)
    at download.do?app=1834&jsType=DESKTOP&contentId=41738&hash=20a33e9b445d7420650de1af04d17049b94e7d6a:21:40
    at edit.js:258:482
    at new vk (edit.js:125:449)
    at qx (edit.js:258:461)
    at edit.js:258:257
    at e.o (edit.js:127:285)
    at Mk (edit.js:129:271)
    at Gk (edit.js:129:154)
    at f.et (edit.js:870:125)

```

また、Aアプリで「保存」ボタンを押しても画面遷移せず、その画面に留まっている状態で本当に保存できているのか？という状態になっております。。

---

<div class="post-metadata">

**Author:** ![puppet](https://sea1.discourse-cdn.com/flex015/user_avatar/community.cybozu.dev/puppet/32/2126_2.png) [@puppet](https://community.cybozu.dev/u/puppet)\
**Post date:** [2024 年 12 月 13 日午前 5:06 UTC](https://community.cybozu.dev/t/topic/9844/8 "2024-12-13T05:06:04Z")

</div>

うーんコードを見ても特におかしな点が見当たらず…  
[フィールド形式](https://cybozu.dev/ja/id/2736678ef8d2aad09a33e8bb/#field-type-update)も今の内容で問題なさそうなのですが…  
お役に立てなくてごめんなさい🙇‍♂️

---

<div class="post-metadata">

**Author:** ![LALA](https://avatars.discourse-cdn.com/v4/letter/l/b5e925/32.png) [@LALA](https://community.cybozu.dev/u/LALA)\
**Post date:** [2024 年 12 月 13 日午前 9:03 UTC](https://community.cybozu.dev/t/topic/9844/9 "2024-12-13T09:03:36Z")

</div>

いえいえ、ここまでご対応いただきありがとうございました 🙇‍♂️  
教えていただいたコードを元に自分でもいろいろと確認進めてみます！

---

<div class="post-metadata">

**Author:** ![LALA](https://avatars.discourse-cdn.com/v4/letter/l/b5e925/32.png) [@LALA](https://community.cybozu.dev/u/LALA)\
**Post date:** [2024 年 12 月 13 日午前 9:24 UTC](https://community.cybozu.dev/t/topic/9844/10 "2024-12-13T09:24:43Z")

</div>

puppet様から教えていただいたコードをもとに以下のコードに変更し、レコード登録してみたところ、エラーが消え、「活動履歴数」に「1」と表示されました！  
ただ、同じ「顧客管理レコード番号」のレコードで追加登録をしてみてもカウントアップはされませんでした。。  
（「1」から変わらず…）  
何かもう一息な気がします。。

```javascript
(function () {
    "use strict";

    const B_APP_ID = "1833"; // BアプリID
    const MANAGEMENT_NUMBER_FIELD = "顧客管理レコード番号";
    const COUNT_FIELD_CODE = "活動履歴数";

    const events = [
        'app.record.create.submit.success',
        'app.record.edit.submit.success'
    ];

    kintone.events.on(events, async function (event) {
        const record = event.record;
        const managementNumber = record[MANAGEMENT_NUMBER_FIELD].value;

        // Bアプリのデータを取得
        const query = `顧客管理レコード番号 = "${managementNumber}"`;
        const response = await kintone.api(kintone.api.url('/k/v1/records.json', true), "GET", {
            app: B_APP_ID,
            query: query
        });
        const records = response.records;
        const count = records.length;

        // Bアプリのレコードを更新
        if (records.length > 0) {
            const recordId = records[0].$id.value; // 最初のレコードのIDを取得
            const updateBody = {
                app: B_APP_ID,
                id: recordId,
                record: {
                    [COUNT_FIELD_CODE]: {
                        value: count
                    }
                }
            };

            await kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', updateBody);
        }

        return event;
    });
})();

```

---

<div class="post-metadata">

**Author:** ![LALA](https://avatars.discourse-cdn.com/v4/letter/l/b5e925/32.png) [@LALA](https://community.cybozu.dev/u/LALA)\
**Post date:** [2024 年 12 月 16 日午前 12:22 UTC](https://community.cybozu.dev/t/topic/9844/11 "2024-12-16T00:22:37Z")

</div>

こちら以下のコードで無事やりたいことが実現できましたので共有させていただきます。  
（ラジオボタンの値別の件数も表示できるようにしています）

```javascript
(function () {
    "use strict";

    const B_APP_ID = "1833"; // BアプリID
    const MANAGEMENT_NUMBER_FIELD = "顧客管理レコード番号";
    const COUNT_FIELD_CODE_ACTIVITY = "活動履歴数"; // 「活動履歴数」フィールドコード
    const COUNT_FIELD_CODE_SAMPLE1 = "サンプル1件数"; // Bアプリの「サンプル1件数」フィールドコード
    const COUNT_FIELD_CODE_SAMPLE2 = "サンプル2件数"; // Bアプリの「サンプル2件数」フィールドコード
    const RADIO_BUTTON_FIELD = "ラジオボタン"; // Aアプリの「ラジオボタン」フィールドコード

    const events = [
        'app.record.create.submit.success',
        'app.record.edit.submit.success'
    ];

    kintone.events.on(events, async function (event) {
        const record = event.record;
        const managementNumber = record[MANAGEMENT_NUMBER_FIELD].value;
        const radioButtonValue = record[RADIO_BUTTON_FIELD].value; // ラジオボタンの選択値を取得

        // Bアプリのデータを取得
        const query = `顧客管理レコード番号 = "${managementNumber}"`;
        const response = await kintone.api(kintone.api.url('/k/v1/records.json', true), "GET", {
            app: B_APP_ID,
            query: query
        });
        const records = response.records;
        let activityCount = records.length; // 現在の「活動履歴数」

        // Bアプリのレコードを更新
        if (records.length > 0) {
            const recordId = records[0].$id.value; // 最初のレコードのIDを取得

            // 現在の活動履歴数を取得し、インクリメントする
            const currentActivityCount = parseInt(records[0][COUNT_FIELD_CODE_ACTIVITY].value) || 0;
            activityCount = currentActivityCount + 1;

            const updateBody = {
                app: B_APP_ID,
                id: recordId,
                record: {
                    [COUNT_FIELD_CODE_ACTIVITY]: { value: activityCount }
                }
            };

            // ラジオボタンの選択値に応じて件数を更新
            let sampleCount = 0;
            if (radioButtonValue === "sample1") {
                // サンプル1件数をインクリメント
                sampleCount = parseInt(records[0][COUNT_FIELD_CODE_SAMPLE1].value) || 0;
                sampleCount += 1;
                updateBody.record[COUNT_FIELD_CODE_SAMPLE1] = { value: sampleCount };
            } else if (radioButtonValue === "sample2") {
                // サンプル2件数をインクリメント
                sampleCount = parseInt(records[0][COUNT_FIELD_CODE_SAMPLE2].value) || 0;
                sampleCount += 1;
                updateBody.record[COUNT_FIELD_CODE_SAMPLE2] = { value: sampleCount };
            }

            // 「活動履歴数」も更新
            await kintone.api(kintone.api.url('/k/v1/record.json', true), 'PUT', updateBody);
        }

        return event;
    });
})();

```

---

<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:** [2024 年 12 月 19 日午前 12:23 UTC](https://community.cybozu.dev/t/topic/9844/12 "2024-12-19T00:23:23Z")

</div>

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