# jsによるサブテーブルのコピーについて

**URL:** <https://community.cybozu.dev/t/topic/127>\
**Category:** kintone 開発相談\
**Created:** [2022 年 10 月 1 日午前 6:53 UTC](https://community.cybozu.dev/t/topic/127 "2022-10-01T06:53:15Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![Legacy\_Account58](https://avatars.discourse-cdn.com/v4/letter/l/34f0e0/32.png) [@Legacy\_Account58](https://community.cybozu.dev/u/Legacy_Account58)\
**Post date:** [2022 年 10 月 1 日午前 6:53 UTC](https://community.cybozu.dev/t/topic/127/1 "2022-10-01T06:53:15Z")

</div>

テスト環境で実行しているのですが、サポートいただければと思います。  
アプリ(ID:24)のサブテーブルに入力した内容をアプリ(ID:23)のサブテーブルにコピーしたいのですが、POSTでエラー(code: ‘CB\_VA01’)が発生してしまいます。  
以下、コードとなります。

(() =\> {  
&nbsp; ‘use strict’;

&nbsp; kintone.events.on([  
&nbsp; &nbsp; ‘app.record.create.submit’, ‘app.record.edit.submit’  
&nbsp; ], async (event) =\> {  
&nbsp; &nbsp; let record= event.record;  
&nbsp; &nbsp; let copyFields = [‘明細行ID’, ‘行の種類’, ‘請求明細名’, ‘数量’, ‘単位’, ‘単価’, ‘金額’];  
&nbsp; &nbsp; let subTableValue = [];

&nbsp; &nbsp; record[‘請求書’].value.forEach((row) =\> {  
&nbsp; &nbsp; &nbsp; let subTableRow = {value: {}};

&nbsp; &nbsp; &nbsp; copyFields.forEach((field) =\> {  
&nbsp; &nbsp; &nbsp; &nbsp; subTableRow.value[field] = {  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value: row.value[field].value  
&nbsp; &nbsp; &nbsp; &nbsp; };  
&nbsp; &nbsp; &nbsp; });

&nbsp; &nbsp; &nbsp; subTableValue.push({  
&nbsp; &nbsp; &nbsp; &nbsp; “明細行ID”:{“value”:subTableRow.value.明細行ID.value},  
&nbsp; &nbsp; &nbsp; &nbsp; “行の種類”:{“value”:subTableRow.value.行の種類.value},  
&nbsp; &nbsp; &nbsp; &nbsp; “請求明細名”:{“value”:subTableRow.value.請求明細名.value},  
&nbsp; &nbsp; &nbsp; &nbsp; “数量”:{“value”:subTableRow.value.数量.value},  
&nbsp; &nbsp; &nbsp; &nbsp; “単位”:{“value”:subTableRow.value.単位.value},  
&nbsp; &nbsp; &nbsp; &nbsp; “単価”:{“value”:subTableRow.value.単価.value},  
&nbsp; &nbsp; &nbsp; &nbsp; “金額”:{“value”:subTableRow.value.金額.value}  
&nbsp; &nbsp; &nbsp; });  
&nbsp; &nbsp; });

&nbsp; &nbsp; let paramForGetStock1 = {  
&nbsp; &nbsp; &nbsp; “app”: 23,  
&nbsp; &nbsp; &nbsp; “query”: `請求月 = ${record['請求月'].value} and 取引先コード = "${record['取引先コード'].value}"`  
&nbsp; &nbsp; }; &nbsp;console.log(paramForGetStock1);

&nbsp; &nbsp; let resp = await kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, paramForGetStock1);  
&nbsp; &nbsp; &nbsp;&nbsp;

&nbsp; &nbsp; if (resp.records.length) {  
&nbsp; &nbsp; &nbsp; subTableValue.forEach((row) =\> {  
&nbsp; &nbsp; &nbsp; &nbsp; let matchIndex = resp.records[0][‘請求明細行’].value.findIndex((respRow) =\> respRow.value[‘明細行ID’].value === row.value[‘明細行ID’].value);

&nbsp; &nbsp; &nbsp; &nbsp; if (matchIndex \>= 0) {  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; resp.records[0][‘請求明細行’].value[matchIndex].value = row.value;  
&nbsp; &nbsp; &nbsp; &nbsp; } else {  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; resp.records[0][‘請求明細行’].value.push(row.value);  
&nbsp; &nbsp; &nbsp; &nbsp; }  
&nbsp; &nbsp; &nbsp; });

&nbsp; &nbsp; &nbsp; let putRecord = {  
&nbsp; &nbsp; &nbsp; &nbsp; app:23,  
&nbsp; &nbsp; &nbsp; &nbsp; id: resp.records[0][‘$id’].value,

&nbsp; &nbsp; &nbsp; &nbsp; record: {  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ‘請求明細行’: {  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value: resp.records[0][‘請求明細行’].value  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }  
&nbsp; &nbsp; &nbsp; &nbsp; }  
&nbsp; &nbsp; &nbsp; };console.log( resp.records[0][‘$id’].value);

&nbsp; &nbsp; &nbsp; await kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘PUT’, putRecord);  
&nbsp; &nbsp; } else {  
&nbsp; &nbsp; &nbsp; console.log(“テスト1”);  
&nbsp; &nbsp; &nbsp; let postRecord = {  
&nbsp; &nbsp; &nbsp; &nbsp; app: 23,  
&nbsp; &nbsp; &nbsp; &nbsp; record:subTableValue  
&nbsp; &nbsp; &nbsp; &nbsp; // “record”: {  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // ‘請求明細行’: {  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // value: subTableValue  
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // }  
&nbsp; &nbsp; &nbsp; &nbsp; // }  
&nbsp; &nbsp; &nbsp; };console.log(postRecord);

&nbsp; &nbsp; &nbsp; await kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘POST’, postRecord);  
&nbsp; &nbsp; }

&nbsp; &nbsp; return event;  
&nbsp; });  
})();

---

<div class="post-metadata">

**Author:** ![Legacy\_Account1177](https://avatars.discourse-cdn.com/v4/letter/l/77aa72/32.png) [@Legacy\_Account1177](https://community.cybozu.dev/u/Legacy_Account1177)\
**Post date:** [2022 年 10 月 1 日午前 9:40 UTC](https://community.cybozu.dev/t/topic/127/2 "2022-10-01T09:40:10Z")

</div>

私が先日投稿したコードですね。

```
    subTableValue.push({
      "明細行ID":{"value":subTableRow.value.明細行ID.value},
      "行の種類":{"value":subTableRow.value.行の種類.value},
      "請求明細名":{"value":subTableRow.value.請求明細名.value},
      "数量":{"value":subTableRow.value.数量.value},
      "単位":{"value":subTableRow.value.単位.value},
      "単価":{"value":subTableRow.value.単価.value},
      "金額":{"value":subTableRow.value.金額.value}
      });

```

この部分が間違っています。正しく記載するのであれば

```
    subTableValue.push({
value: {
      "明細行ID":{"value":subTableRow.value.明細行ID.value},
      "行の種類":{"value":subTableRow.value.行の種類.value},
// ...略
}
      });

```

とする必要があるのですが、そもそも私が投稿したコードは

```
     subTableValue.push(subTableRow);

```

このようになっていたと思います。

```
    let copyFields = ['明細行ID', '行の種類', '請求明細名', '数量', '単位', '単価', '金額'];

    let subTableRow = {value: {}};

    copyFields.forEach((field) => {
      subTableRow.value[field] = {
        value: row.value[field].value
      };
      });
    subTableValue.push(subTableRow);

```

この部分で上のコードと全く同じことを実行しているので、書き換える必要はありません。

また、私が投稿した時のミスなのですが、

```
        if (matchIndex >= 0) {
          resp.records[0]['請求明細行'].value[matchIndex].value = row.value;
        } else {
          resp.records[0]['請求明細行'].value.push(row.value);
        }

```

この部分は

```
        if (matchIndex >= 0) {
          resp.records[0]['請求明細行'].value[matchIndex].value = row.value;
        } else {
        resp.records[0]['請求明細行'].value.push(row);
        }

```

として下さい。

&nbsp;

また、POSTのリクエストボディについて

```
      let postRecord = {
        app: 23,
        record:subTableValue
        // "record": {
          // '請求明細行': {
            // value: subTableValue
          // }
        // }
      };console.log(postRecord);

```

こちらは

```
      let postRecord = {
        app: 23,
      record: {
        '請求明細行': { // サブテーブルのフィールドコード
        value: subTableValue // サブテーブルの値
        }
      }
    };

```

このようになります。

ただ、CB\_VA01エラーは主にリクエストボディの内容が正しくないことが起きるエラーという認識なので、それだけが原因とは限りません。

---

<div class="post-metadata">

**Author:** ![Legacy\_Account58](https://avatars.discourse-cdn.com/v4/letter/l/34f0e0/32.png) [@Legacy\_Account58](https://community.cybozu.dev/u/Legacy_Account58)\
**Post date:** [2022 年 10 月 2 日午前 3:32 UTC](https://community.cybozu.dev/t/topic/127/3 "2022-10-02T03:32:43Z")

</div>

[mls-hashimoto](https://community.cybozu.dev/hc/ja/profiles/385013133091-mls-hashimoto)&nbsp;様

コメントいただきありがとうございます。  
おっしゃる通り、パクリコードなのですが修正してもエラーとなってしまいます。  
これは何が不足しているということなのでしょうか？

&nbsp;

---

<div class="post-metadata">

**Author:** ![Legacy\_Account58](https://avatars.discourse-cdn.com/v4/letter/l/34f0e0/32.png) [@Legacy\_Account58](https://community.cybozu.dev/u/Legacy_Account58)\
**Post date:** [2022 年 10 月 2 日午前 3:50 UTC](https://community.cybozu.dev/t/topic/127/4 "2022-10-02T03:50:03Z")

</div>

postRecordのログ出力結果はこのようになっています。

---

<div class="post-metadata">

**Author:** ![Legacy\_Account58](https://avatars.discourse-cdn.com/v4/letter/l/34f0e0/32.png) [@Legacy\_Account58](https://community.cybozu.dev/u/Legacy_Account58)\
**Post date:** [2022 年 10 月 2 日午前 4:36 UTC](https://community.cybozu.dev/t/topic/127/5 "2022-10-02T04:36:08Z")

</div>

解決できました。  
原因は以下でした。  
await kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘POST’, postRecord);  
を  
await kintone.api(kintone.api.url(‘/k/v1/record.json’, true), ‘POST’, postRecord);

に変更したところ、上手くいきました。

---

<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 年 6 月 6 日午前 1:07 UTC](https://community.cybozu.dev/t/topic/127/6 "2024-06-06T01:07:40Z")

</div>

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