新規投稿
フォローする

他アプリからレコード取得後、一括登録

お世話になっております。

現在、A(入金データ)・B(マスタ)・C(マスタ)という3つのアプリからレコードを全件取得し、Aアプリの件数分、2つのマスタから必要な情報を取得したのち、Dアプリに一括登録をするカスタマイズを実装中です。

Aアプリ全件分、マスタから情報取得→配列に入れるという部分までは実装できたのですが、登録処理を追加したところ、配列の中身が空になるという現象が起きてしまいました。

(lengthはA全件分になるため、空のレコードが一括登録されてしまいます。)

原因が全く分からないのですが、初心者のため、おそらくpromiseの使い方に間違いがあるのではないかと考えております。

以下、ソースコードです。ご教授お願い致します。

====================================

(function checkError() {
 'use strict'

 kintone.events.on('app.record.index.show', function(event) {
 // 増殖バグを防ぐ
 if (document.getElementById('my_index_button') !== null) {
 return;
 }

 //エラーチェック用ボタン
 var myIndexButton = document.createElement('button');
 myIndexButton.id = 'my_index_button';
 myIndexButton.innerHTML = '作成';

 // ボタンを配置するスペース
 var el = kintone.app.getHeaderMenuSpaceElement();

 // スペースに作成したボタンを追加
 el.appendChild(myIndexButton);

 //ボタン押下時イベント
 myIndexButton.onclick = (function(){
  //Aアプリからデータ取得
  var get1 = function(){
   return new kintone.Promise(function(resolve, reject){
   var ebdata = getAllRecords1(アプリID);
   resolve(ebdata);
   });
  };

  //Bアプリからデータ取得
   var get2 = function(){
   return new kintone.Promise(function(resolve, reject){
   var kouzaMaster = getAllRecords2(アプリID);
   resolve(kouzaMaster);
   });
  };

  //Cアプリからデータ取得
  var get3 = function(){
   return new kintone.Promise(function(resolve, reject){
   var master = getAllRecords3(アプリID);
   resolve(master);
   });
  };

  //非同期処理の結果を取得
  get1().then(function (ebdata){
   get2().then(function(kouzaMaster){
    get3().then(function(master){
     createData(ebdata, kouzaMaster, master).then(function(putRecords){
      console.log(putRecords);
      console.log(putRecords.length);

      //登録用関数呼び出し
      var resolve = putAllData(putRecords);
     });
    });
   });
  });
  //location.reload();
 });
 return event;
 });


 const getAllRecords1 = //Aアプリ全取得処理
 const getAllRecords2 = //Bアプリ全取得処理

 const getAllRecords3 = //Cアプリ全取得処理

 //レコード登録処理
 function putAllData(putRecords){
  while(putRecords.length){
   kintone.api(kintone.api.url('/k/v1/records', true), 'POST', {
    'app': kintone.app.getId(),
    'records': putRecords.slice(0,100)
   });
   putRecords.splice(0,100);
  }
 }
 //Dアプリ登録用データ作成処理
 function createData(ebdata, kouzaMaster, master){
  return new kintone.Promise(function(resolve, reject){
   var putRecords = new Array();
   for(var i = 0; i < ebdata.length; i++){
    //マスタから必要データ取得処理


    //配列に登録するレコードを入れる
    var record = {
     'accountNum':{
      'value':kouzaNo
     },
     'branchAccountName':{
      'value':naiyou
     },
     'startM':{
      'value':ebdata[i]['startM']['value']
     },
     'startD':{
      'value':ebdata[i]['startD']['value']
     },
     'sum':{
      'value':kingaku
     },
     'balance':{
      'value':zandaka
     },
     'description':{
      'value':tekiyo
     },
     'inCharge':{
      'value':[{
        'code':tantou,
       'name':tantouName
      }]
     },
     'organization':{
      'value':[{
       'code':sosiki,
       'name':sosikiName
      }]
     },
     'status':{
      'value':'未'
     },
    };
    putRecords.push(record);
    console.log(putRecords);
   };
   resolve(putRecords);
  });
 };
})();

0

4件のコメント

Avatar
juridon

こんにちは!

どの行まで正常に動いているのでしょうか!?💦

ソースを追おうと見ていたのですが、インデントが全部解除されていて途中で断念してしまいました💦(ここの仕様上、ソースの貼り付けが難しいといえば難しいのですが)

登録でこけている?ということから、function putAllData(putRecords)~あたりを見ていましたが、このputRecordsには登録したいレコードが入ってきているのでしょうか??
エラーコードなど出ているのでしょうか?(゜-゜)💦

「配列の中身が空になる」とは、どの行のところでしょうか?

console.logなどをちょいちょい仕込んで、コンソール画面から今どの変数になにが入っている・・・

みたいのを試されてみてください^0^

juridonにより編集されました
0
Avatar
m.u

コメントありがとうございます。

分かりづらくて申し訳ありません。インデントを整えましたので、再度ご確認いただけますと幸いです。

function putAllData(putRecords)の部分についてですが、putRecords自体には登録したいレコードが入ってきていません。ただ、登録処理後、画面をリロードするとフィールドの中身がすべて空白のレコードが、Aアプリのレコード分登録されるという結果になります。

また、

//登録用関数呼び出し
var resolve = putAllData(putRecords);

の部分をコメントアウトしてみると、「Dアプリ登録用データ作成処理」後のコンソールでは登録したいデータが配列に入っていることが確認できています。

エラーは特に出ていない状態です。

promiseについて理解しきれていないので、おそらくそのあたりで躓いているのではないかと思っております。

お手数をおかけしますが、よろしくお願い致します。

0
Avatar
m.u

すみません、自己解決致しました。

原因は初歩中の初歩で、kintoneに登録しているフィールドコードと、登録処理で指定しているフィールドコードの不一致でした。

なので、コード自体は問題なさそうです。

お手数おかけして申し訳ありません。

参考コードとしてご覧いただければと思います。

よろしくお願い致します。

1
Avatar
juridon

スミマセン、返信があったのを見落としていましたm(_ _)m

解決できたみたいで良かったです^0^

0
サインインしてコメントを残してください。