一覧表示データをボタンで別アプリ一括登録

お世話なります。JavaScript初心者になります。

実現したいことは、発注アプリの一覧に表示された複数データ(サブテーブルあり)を、

仕入アプリへ新規登録したいです。よくある問題かとは思いますが、調べても正解にたどりつけず困っております。

参考(1) jsでのサブテーブルへのPOST方法

参考(2) 一覧で表示したレコードのキーを使用して一括で別のアプリに登録したい

配列についてよく理解できていなかったり、つぎはぎで色々とおかしい部分があると思います。

アドバイスいただけると幸いです。

 

エラーはありませんが、コンソール画面がこちらです。

 

(() => {
  'use strict';
  //レコード一覧画面表示後イベント
  kintone.events.on('app.record.index.show', (event) => {

    const records = event.records;

    // ヘッダースペース要素の取得
    const headerSpace = kintone.app.getHeaderMenuSpaceElement();

    // ボタン要素の作成
    const button = document.createElement("input");
    button.value = "一括登録";
    button.type = "button";

    // ボタンがクリックされた時の処理
    const submit = function(){
    const recRecords = [];
    const postRecords = [];

      // 取得したレコード分ループ
      records.forEach(function(eachRecord) {
        let subTable = eachRecord.発注詳細.value;

        // サブテーブル分ループ
        subTable.forEach(function(eachRow) {
                                            
          let tableA = eachRow.value.商品名.value;
          let tableB = eachRow.value.数量.value;
          let tableC = eachRow.value.単位.value;
          let tableD = eachRow.value.単価.value;
          let tableE = eachRow.value.摘要.value;

          recRecords.push({
            "商品名": { "value": tableA },
            "数量": { "value": tableB },
            "単位": { "value": tableC },
            "単価": { "value": tableD },
            "摘要": { "value": tableE },
          });
        })
        
        postRecords["仕入先"] = eachRecord.発注先.value;
        postRecords["仕入日"] = eachRecord.発注日.value;
        postRecords["仕入No"] = "S-2022-0002";
        postRecords["発注No"] = eachRecord.発注No.value;
        postRecords["担当者"] = eachRecord.担当者.value;
        postRecords["仕入詳細"] = recRecords;
        postRecords["工番"] = eachRecord.工番.value;
        postRecords["科目名"] = eachRecord.科目名.value;        
        
      });

    const postParams = {
      app: 73,
      records: postRecords
    };
          
    console.log(postParams);
    console.log(postRecords);

    kintone.api(kintone.api.url('/k/v1/records.json', true), 'POST', postParams, (resp) => {
      // success
      console.log(resp);
    }, (error) => {
      // error
      console.log(error);  
    });
  };

  // ボタンをヘッダースペースに追加
  headerSpace.appendChild(button);
  // ボタンのクリックイベントに処理を登録
  button.onclick = submit;

});
})();

渡邉祐子様

コードをみると、postparamsのrecordsが配列になっていないようです。
またさかのぼってrecords.forEachで複数のレコードに対してループしていますが、
postRecordsが上書きされているようです。
配列を追加するにはpushする必要があります。

        postRecords["仕入先"] = eachRecord.発注先.value;
        postRecords["仕入日"] = eachRecord.発注日.value;
        postRecords["仕入No"] = "S-2022-0002";
        postRecords["発注No"] = eachRecord.発注No.value;
        postRecords["担当者"] = eachRecord.担当者.value;
        postRecords["仕入詳細"] = recRecords;
        postRecords["工番"] = eachRecord.工番.value;
        postRecords["科目名"] = eachRecord.科目名.value;    

ここを、

        postRecords.push({
"仕入先": {value: eachRecord.発注先.value},
        "仕入日": {value: eachRecord.発注日.value},
        "仕入No": {value: "S-2022-0002"},
        "発注No": {value: eachRecord.発注No.value},
        "担当者": {value: eachRecord.担当者.value},
        "仕入詳細": {value: recRecords},
        "工番": {value: eachRecord.工番.value},
"科目名": {value: eachRecord.科目名.value}
});

とすると良いかと思います。
(テーブルと同じことをしています)

なお、エラー情報やうまく行っていないこと(具体的に)を記載すると回答がつきやすいと思います。

 

TO

アドバイスありがとうございます。

説明不足で失礼いたしました。

質問時点では、エラーはなく、コンソール画面には下記の表示でしたので、

登録はされておらず、処理は完了していた(?)という認識でした。

 

その後、JavaScriptのpush部分を変更してみましたが、テーブル部分がうまくできていないようです。

エラーはこちらです。

試しに

"仕入詳細": {value: recRecords},

の部分を

"仕入詳細": {

            "value": [

                {

                    "value": {

                        "商品名": {

                            "value": "aaa"

                        },

                        "単価": {

                          "value": "100"

                        }

                    }

                }                          

            ]

        }

のようにしたところ、登録に成功しました。

成功時のデータは、"0:"の下に"value:"があるようです。

試行錯誤してみたのですが、解決に至らず、どのように修正したらよろしいでしょうか?

渡邉祐子様

         recRecords.push({
          "商品名": { "value": tableA },
            "数量": { "value": tableB },
            "単位": { "value": tableC },
            "単価": { "value": tableD },
            "摘要": { "value": tableE },
      });

ここを,

         recRecords.push({
         "value": {
            "商品名": { "value": tableA },
            "数量": { "value": tableB },
            "単位": { "value": tableC },
            "単価": { "value": tableD },
            "摘要": { "value": tableE },
           }
        });

に変えてみていただけますか?
テーブルの部分のvalueが抜けていました.
おそらくこれでいけるのでは,と思います.
(今検証環境が手元にないので未検証です)

TO様

無事に登録することが出来ました。ありがとうございます!

また勉強しながら進めていきたいと思います。

貴重なお時間いただきまして、感謝いたします。

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