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

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

(() => {
  ‘use strict’;

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

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

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

      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}
      });
    });

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

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

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

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

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

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

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

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

    return event;
  });
})();

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

    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);
        }

として下さい。

 

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

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

こちらは

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

このようになります。

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

mls-hashimoto 様

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

 

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

解決できました。
原因は以下でした。
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);

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

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