いつもお世話になっております。
標記の件ですが、以下の流れで処理を行うようにjavascriptで実装しているのですが、結果として1行しか処理できていません。
①Aアプリの一覧画面にそれぞれのレコードのサブテーブルの内容を更新するボタンを表示する
②①のボタンを押下すると一覧画面に表示されている全てのレコードをREST APIにてGETする
③一覧画面に表示されている全てのレコードに対して以下④~⑤の処理を行う
④Aアプリのレコード番号に合致するBアプリのレコードを取得する(BアプリにはAアプリのレコード番号は登録済)
⑤Bアプリより取得したレコードを加工し、AアプリのレコードのサブテーブルにPUTする
上記の流れのアプリを作成するにあたり、以下の投稿を参考にしております。
https://developer.cybozu.io/hc/ja/community/posts/204669873
私見では上記の投稿にもありますように、for文でのPromiseの呼び出しにて最初の1行しか実行されないことに起因しており、対処として.reduce関数の利用、もしくは.then()でメソッドをチェーンしていく必要があると読み解いております。
現在.reduce()の使い方がよくわからないこともあり、.thenでメソッドをチェーンする方法で実装しておりますがメソッドをチェーンする・しないに関わらず一覧画面に表示されているデータ1つしか処理されていません。
具体的なプログラムとしては、以下のように実装しています。
/* プログラム(ここから) */
(function() {
“use strict”;
// Aアプリ、Bアプリ共通で使用するデータを保持する
var DataDao = {};
kintone.events.on(‘app.record.index.show’, function(event) {
//ボタン作成
/////////////////////////////////////////////////////////////////
// ボタン増殖防止
if (document.getElementById(‘Menu_Button’) !== null) {
return;
}
////////////ボタン定義(ここから)////////////////
var MenuButton = document.createElement(‘button’);
//ボタンのID指定
MenuButton.id = ‘Menu_Button’;
//ボタン名表示
MenuButton.innerHTML = ‘一括更新’;
//ボタンサイズ
MenuButton.style.width = ‘200px’;
//左側のスペース
MenuButton.style.marginLeft = ‘250px’;
////////////ボタン定義(ここまで)////////////////
////////////メインルーチン(ここから)////////////////
DataDao.gettingIchiran().then(function (resp){
var resultIchiranRecord = resp[‘records’]; //Aアプリ一覧画面に表示されているレコードを取得
for(var row = 0; row < resultIchiranRecord.length ; row++){ //Aアプリのレコード1つ1つに対して以下の処理を行う
DataDao.gettingB(row, resultIchiranRecord).then(function (past_resp){ //Bアプリからデータ取得
var resultPastRecord = past_resp[‘records’]; //一覧画面に表示されているレコードを取得
}, function(err){ // エラー処理
console.log(err);
}).then(function (past_resp){
DataDao.updatingIchiran(row, resultIchiranRecord, past_resp.resultPastRecord); //Aアプリの各レコードのサブテーブル更新
});
} //for文の終わり
}, function(err){ // エラー開始
console.log(err);
}); // エラー処理の終わり
}; //onclickイベント終了
kintone.app.getHeaderMenuSpaceElement().appendChild(MenuButton); //ボタン表示
return event;
})// kintone.events.onの終わり
DataDao.gettingIchiran = function() {
var index_param = {
“app” : “AアプリのアプリID” //AアプリのアプリID
};
return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, index_param);
};// DataDao.gettingIchiranの終わり
houjiDao.gettingB = function(row_inf,resultIchiranRecord_inf) {
// Bアプリから該当するレコード番号のデータをGET
var record_No = resultIchiranRecord_inf[row_inf][“$id”][“value”];
var queryCondition = " 会員コード = " + record_No ;
var past_param = {
“app” : “BアプリのアプリID”,
“query” : queryCondition , // 検索条件
}; //end past_param
return kintone.api(kintone.api.url(‘/k/v1/records’, true), ‘GET’, past_param);
DataDao.updatingIchiran = function(row_inf, resultIchiranRecord_inf, resultPastRecord_Inf) {
/// サブテーブルに格納するデータの作成を行い、tableRecordsに格納する///
/* Aアプリのレコードを更新(PUT) */
kintone.api(kintone.api.url(‘/k/v1/record’, true), ‘PUT’,
{
“app”:appId, “BアプリのアプリID”
“id”:record_No, //更新対象のレコード
“record” :tableRecords // 更新するレコードのサブテーブル
})
}; // DataDao.updatingIchiranの終わり
})(); // functionの終わり
/* プログラム(ここまで) */
先ほど少し述べましたが1件だけは正しく処理できていますので、それぞれのfunctionの処理自体は問題ないと考えています。
こうすれば実現可能など、ご意見を頂戴できないでしょうか(そもそもで現在のロジックがおかしいなどのご意見でもかまいません)
どうぞよろしくお願いいたします。