REST APIでの他のアプリへのレコード登録(POST)で空レコードが登録されてしまう。

機器情報マスターをもとに顧客マスターへレコードの登録、更新をしたいと思っています。

機器情報マスターにあるボタンをクリックすると、
機器情報マスターのデータを一括取得し、顧客マスターのデータに同じ得意先id名がないか検索します。
(得意先id名は顧客マスターでは重複禁止フィールドです。)

一致するデータがすでにある場合は 顧客マスターを更新(PUT)
一致するデータがない場合は 顧客マスターに登録(POST)

下記のようにコードを書いたのですが、顧客マスターには空レコードでデータが追加されてしまいうまくデータが登録されていない状態です。
更新も更新時間は変わっているのですが、値は全く変わっていませんでした。

デバック画面で確認しながら進めてみたのですが、bodyPost(登録用の変数)やbodyPut(更新用の変数)に配列されているのにも関わらず

kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘POST’, bodyPost);
kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘PUT’, bodyPut);

のところでうまくデータが登録、更新ができていないみたいです。

javascript 初心者のためいろいろなコミュニティを見てみたのですが、解決できずに困っています。
どなたかわかるかたいらっしゃいましたらご教授をお願いしたいです。

何卒宜しくお願い致します。

 

愛知県だけデータが入っているのはドロップダウンのため初期で愛知県を設定しているためです。

こちらが、100件ずつ更新・登録する前までの変数の中身です。
顧客情報が載っている箇所は白く塗りつぶしています。↓

こちらが、bodyPostやbodyPutにデータを格納したときの変数の中身です。

(() => {
  'use strict';
  
  //レコード一覧画面
  kintone.events.on('app.record.index.show', (event) => {
  
    //増殖バグを防ぐ
    if (document.getElementById('my_index_test') !== null) {
      return;
    }
    
    //ボタン要素の作成
    const myIndextest = document.createElement('button');
    
    //ボタンのid
    myIndextest.id = 'my_index_test';
    
    //ボタンに表示される名前
    myIndextest.innerText = 'テスト';
    
    //CSS
    myIndextest.style.backgroundColor = 'rgb(255, 10, 0)';
    myIndextest.style.borderRadius = '5px';
    myIndextest.style.padding = '10px 15px';
    myIndextest.style.fontWeight = 'bold';
    myIndextest.style.marginLeft = '10px';
    
    //ボタンクリック時の処理
    myIndextest.onclick = (async() => {
      const message = confirm('テストする。');
      if (message) {
        let manager = await new KintoneRecordManager();
        manager.getRecords( async function(records) {
          // レコード取得後の処理
          console.log(records);
          //顧客マスターのアプリID
          const appId = 2;
          //前回のデータを保持
          let idName = '';
          // 顧客マスターに登録
          let bodyPost = {
            "app": appId,
            "records": []
          };
          let recordPost = {};
          let recordArrPost = [];
          let setInt = 0;
          //顧客マスターの更新
          let bodyPut = {
            "app": appId,
            "records": []
          };
          let recordPut = {};
          let recordArrPut = [];
          let upInt = 0;
        
        for (let i = 0; i < records.length; i++) {
            const bodyU = {
              "app": appId,
              "query": '得意先id名 = "' + records[i]['得意先id名'].value + '"'
            };
            const resp = await kintone.api(kintone.api.url('/k/v1/records.json', true), 'GET', bodyU);
            if (resp.records.length === 0) {
              if (records[i]['得意先id名'].value !== idName) {
                //レコードの登録処理
                recordPost[setInt] = {
                  "record": {
                    '得意先id名': {
                      'value':records[i]['得意先id名'].value
                    },
                    '会社名': {
                      'value':records[i]['得意先名'].value
                    },
                    '会社カナ名': {
                      'value':records[i]['得意先カナ名'].value
                    },
                    '会社略名': {
                      'value':records[i]['得意先略名'].value
                    },
                    '郵便番号': {
                      'value':records[i]['得意先郵便番号'].value
                    },
                    '都道府県名': {
                      'value':records[i]['得意先都道府県名'].value
                    },
                    '市町村名': {
                      'value':records[i]['得意先市区町村名'].value
                    },
                    '町域名': {
                      'value':records[i]['得意先町域名'].value
                    },
                    'ビル名': {
                      'value':records[i]['得意先ビル名'].value
                    },
                    '営業担当コード': {
                      'value':records[i]['営業担当コード'].value
                    },
                    'TEL': {
                      'value':records[i]['得意先電話番号'].value
                    }
                  }
                };
                //recordPostをrecordArrPost[]に格納する
                console.log(recordPost[setInt]);
                recordArrPost.push(recordPost[setInt]);
                //配列の数字を更新
                setInt = setInt + 1;
                idName = records[i]['得意先id名'].value;
              }
            }else{
              console.log(resp.records[0].得意先id名.value);
              if (resp.records[0].得意先id名.value !== idName) {
                //レコードの更新処理
                recordPut[upInt] = {
                  // "updateKey":{
                  //   filed:"得意先id名",
                  //   value:records[i]['得意先id名'].value 
                  // },
                  "id": resp.records[0]['レコード番号'].value,
                  "record": {
                    '会社名': {
                      'value':records[i]['得意先名'].value
                    },
                    '会社カナ名': {
                      'value':records[i]['得意先カナ名'].value
                    },
                    '会社略名': {
                      'value':records[i]['得意先略名'].value
                    },
                    '郵便番号': {
                      'value':records[i]['得意先郵便番号'].value
                    },
                    '都道府県名': {
                      'value':records[i]['得意先都道府県名'].value
                    },
                    '市町村名': {
                      'value':records[i]['得意先市区町村名'].value
                    },
                    '町域名': {
                      'value':records[i]['得意先町域名'].value
                    },
                    'ビル名': {
                      'value':records[i]['得意先ビル名'].value
                    },
                    '営業担当コード': {
                      'value':records[i]['営業担当コード'].value
                    },
                    'TEL': {
                      'value':records[i]['得意先電話番号'].value
                    },
                  }
                };
                //recordPutをrecordArrPut[]に格納する
                console.log(recordPut[upInt]);
                recordArrPut.push(recordPut[upInt]);
                //配列の数字を更新
                upInt = upInt + 1;
                idName = resp.records[0].得意先id名.value;
              }
            }
          }
          
          // 100件ずつ更新
          var s = 0;
          var e = 0;
          while (s < recordArrPost.length) {
            e = s + 100;
            bodyPost.records = recordArrPost.slice(s, e);
            await kintone.api(kintone.api.url('/k/v1/records', true), 'POST', bodyPost);
            try{
              console.log(e);
            } catch {
              console.log(errors.records.得意先id.value.messages);
            }
            s = s + 100;
          }
          // 100件ずつ更新
          var s = 0;
          var e = 0;
          while (s < recordArrPut.length) {
            e = s + 100;
            bodyPut.records = recordArrPut.slice(s, e);
            await kintone.api(kintone.api.url('/k/v1/records', true), 'PUT', bodyPut);
            try{
              console.log(e);
            } catch {
              console.log(errors.records.得意先id.value.messages);
            }
            s = s + 100;
          }
          // 再読み込み
          //return event;
          location.reload();
          alert("おわり!!");
        });
      }
    });
    //メニューの右側の空白部分(kintone.app.getHeaderMenuSpaceElement())
    kintone.app.getHeaderMenuSpaceElement().appendChild(myIndextest);
  });
})();
 /**
   * kintoneと通信を行うクラス
   */
  var KintoneRecordManager = (function() {
    KintoneRecordManager.prototype.records = [];    // 取得したレコード
    KintoneRecordManager.prototype.appId = null;    // アプリID
    KintoneRecordManager.prototype.query = '';      // 検索クエリ
    KintoneRecordManager.prototype.limit = 100;     // 一回あたりの最大取得件数
    KintoneRecordManager.prototype.offset = 0;      // オフセット

    function KintoneRecordManager() {
        this.appId = kintone.app.getId();
        this.records = [];
    }

    // すべてのレコード取得する
    KintoneRecordManager.prototype.getRecords = function(callback) {
      kintone.api(
        kintone.api.url('/k/v1/records', true),
          'GET',
          {
            app: this.appId,
            query: this.query + ('order by レコード番号 asc' + ' limit ' + this.limit + ' offset ' + this.offset),
          },
        (function(_this) {
          return function(res) {
            var len;
            Array.prototype.push.apply(_this.records, res.records);
            len = res.records.length;
            _this.offset += len;
            if (len < _this.limit) { // まだレコードがあるか?
                _this.ready = true;
                if (callback !== null) {
                    callback(_this.records); // レコード取得後のcallback
                }
            } else {
                _this.getRecords(callback); // 自分自身をコール
            }
          };
        })(this)
      );
    };
    return KintoneRecordManager;
  })();

空のレコードは登録される、ということから、

「API自体は成功しているが、APIにのせるデータにあやまりがある」という見立てが可能性高いですね。

API成功してるのであれば、コード上のデバッグより、実際どういうデータが送信されているかみてみたほうが確実かとおもいます。
一度下記を参考にしていただき、ネットワーク上どのようなデータをおくってるか、みてみてください

https://developer.cybozu.io/hc/ja/articles/4977994758297-kintone-JavaScript-%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%BE%E3%81%A8%E3%82%81#check-the-network

村濱一樹

早速のコメントありがとうございます。
掲載してくださった参考を一度拝見し、確認してみたいと思います。

確認後また結果ご報告させていただきます。
お忙しいところ恐縮ですがよろしくお願いします。

村濱一樹

先程のを参考に実際どういうデータが送信されているのか確認したのですが、
すべてvalueデータが入って送信されていました。

ただ、records.jsonをダブルクリック時にこのような画面が表示されました。

こちら何か関係あるのでしょうか?

リクエストの送り方がやはり間違っていますね。こちらをみていただきたいのですが、

records: [record: { フィールドコード: { value: ‘’ } }] ではなく
records: [{ フィールドコード: { value: ‘’ } }] がただしいです!
※ record: {} が不要

> ただ、records.jsonをダブルクリック時にこのような画面が表示されました。

クリックされたときに再度通信がはしってしまっただけなので、これは問題ないです!

奥田 帆乃果様

横やりすいません.

本件は,PUTとPOSTを両方行っているので,PUTにはrecordが必要ですし,
村濱一樹様の仰る通りPOSTには不要です.
が,コードにおけるその部分は適切でした.

問題なのは,

recordPost[setInt] = {
~
recordArrPost.push(recordPost[setInt]);

と,

recordPut[upInt] = {
~
recordArrPut.push(recordPut[upInt]);

の箇所と思います.
recordPost/Putは連想配列{}として宣言していますが,格納時に引数を付けています.
(setInt/upInt)
これのせいで連想配列に余計な名前がついてしまっているものと思われます.
なので,

recordPost = {
~
recordArrPost.push(recordPost);

…とするとうまくいくかもしれません.
(putも同じです)

参考になれば幸いです.

村濱一樹

 record: {} を消したところ無事にデータが入りました!
本当にありがとうございます。
ずっと困っていたため大変助かりました。

私の不注意にもかかわらず最後までご丁寧にご指導ありがとうございました。
今後ともよろしくお願いいたします。

TO

コメントありがとうございます。
POSTとPUTの処理がこんがらがっていました。

POSTは不要で、PUTは必要なのですね!
今一度REST APIについて見直したいと思います。

recordPost = {
~
recordArrPost.push(recordPost);

一度こちらにコードを書き換えて試してみたいと思います。
お忙しいところ本当にありがとうございます!

奥田 帆乃果様

あ,うまくいったのですね?
すいません,的外れな回答になってしまったかもしれません.
試して悪化するようでしたら,さらっと読み飛ばし下さい….