他アプリからデータを取得し、条件別に表示する

いつもお世話になっております。
REST API、Promise等についてなかなか理解が追いついておらず苦戦しており、
こちらで再びご質問させてください。

それぞれ担当が異なりますが連携しているA、Bの在庫アプリがあります。
各A、Bの状況によってCに現在の状況を表示させたいと思っています。

(Aアプリ)
受付前→準備中→対応済
(Bアプリ)
対応前→対応中→完了
(Cアプリ)
A:受付前 & B:対応前 = 受付前
A:準備中 & B:対応前 = 準備中
A:対応済 & B:対応前 = 対応前
A:対応済 & B:対応中 = 対応中
A:対応済 & B:完了 = 出荷済

juri_donさまのこちらの記事を参考にさせて頂いております。
数値計算ではなく条件を分岐させるのにはこれもまたif文でよろしいのでしょうか?

どう書けばいいかすらあまりわかっていないので、
大変恐縮なのですがご教示いただけますと幸いです。
宜しくお願い致します。

https://qiita.com/juri_don/items/cb897325198a230c2ff3

kintone.events.on(‘app.record.create.show’, event => {

//非同期処理A~Cを準備

constrespA = kintone.api(‘/k/v1/record’, ‘GET’, {‘app’:アプリAのID,‘id’:1});

constrespB = kintone.api(‘/k/v1/record’, ‘GET’, {‘app’:アプリBのID,‘id’:1});

constrespC = kintone.api(‘/k/v1/record’, ‘GET’, {‘app’:アプリCのID,‘id’:1});

//respA ~ C の処理が全部成功したら、sum を計算する処理を行う

returnkintone.Promise.all([respA, respB, respC]).then(resps=> {

//respA~Cの処理が全部成功したら行う処理

//アプリA、アプリB、アプリCのレコードIDが1のレコードの数値フィールドの総和を求める

letsum =0;

resps.forEach(v=>{

sum += Number(v.record.数値.value);

});

//総和をアプリDの数値フィールドに表示させる

event.record.数値.value = sum;

returnevent;

});

});

if文で問題ありません。恐らく以下のような書き方で可能と思われます。

(function() {
'use strict';

var fieldA = 'アプリAの状況のフィールドコード';
var fieldB = 'アプリBの状況のフィールドコード';
var fieldC = 'アプリCの状況のフィールドコード';

kintone.events.on('app.record.create.show', event => {
var record = event.record;
const respA = kintone.api('/k/v1/record', 'GET', {'app': アプリAのID,'id':1});
const respB = kintone.api('/k/v1/record', 'GET', {'app': アプリBのID,'id':1});

return kintone.Promise.all([respA, respB]).then(resps => {
if (resps[0].record[fieldA].value == '受付前' && resps[1].record[fieldB].value == '対応前') {
record[fieldC].value = '受付前';
} else if (resps[0].record[fieldA].value == '準備中' && resps[1].record[fieldB].value == '対応前') {
record[fieldC].value = '準備中';
} else if (resps[0].record[fieldA].value == '対応済') {
switch(resps[1].record[fieldB].value) {
case '対応前':
record[fieldC].value = '対応前';
break;
case '対応中':
record[fieldC].value = '対応中';
break;
case '完了':
record[fieldC].value = '出荷済';
break;
};
}
return event;
});
});
})();

但し、こちらは「アプリの新規登録画面を開いた時に、アプリAとアプリBのレコード番号が1のレコードを参照し、if文で判定した結果をアプリCに反映する」ようになっているので、在庫管理が用途であれば単一のアプリ内に商品別で複数のレコードがあるのではないかと推測いたします。

商品名や商品コード等をキーにしてアプリA、アプリBと連携する場合はidを指定したレコード取得ではなくクエリを指定したレコード取得になる上、イベントも新規作成時ではなくなると思います。

 

ちなみに記事にあるPromise.allだと返り値である配列の順番は保証されるものの、今回のような処理では複雑になりやすいので、記事後半にあるasync/awaitの方が良いかとも思います(以下も処理内容は同じです)。

(function() {
'use strict';

var fieldA = 'アプリAの状況のフィールドコード';
var fieldB = 'アプリBの状況のフィールドコード';
var fieldC = 'アプリCの状況のフィールドコード';

kintone.events.on('app.record.create.show', async event => {
var record = event.record;
var respA = await kintone.api('/k/v1/record', 'GET', {'app': アプリAのID,'id':1});
var respB = await kintone.api('/k/v1/record', 'GET', {'app': アプリBのID,'id':1});

if (respA.record[fieldA].value == '受付前' && respB.record[fieldB].value == '対応前') {
record[fieldC].value = '受付前';
} else if (respA.record[fieldA].value == '準備中' && respB.record[fieldB].value == '対応前') {
record[fieldC].value = '準備中';
} else if (respA.record[fieldA].value == '対応済') {
switch(respB.record[fieldB].value) {
case '対応前':
record[fieldC].value = '対応前';
break;
case '対応中':
record[fieldC].value = '対応中';
break;
case '完了':
record[fieldC].value = '出荷済';
break;
};
}

return event;
});
})();

mls-hashimoto さま

ご連絡とお礼が遅くなってしまい申し訳ございません。
ご丁寧にコードとPromise、async/awaitの違い、細かいご提案まで頂き大変感動しております!
本当にありがとうございます;;

まさに仰る通りの動きを希望しておりましたので、Promise.allについての問題点も把握することができました。
無事、動作させることもできました。ありがとうございます。
ご教示頂いたコードにてさらに理解を深めてまいりたいと思います!

もう一つご質問なのですが、これを例えば一覧画面を表示した際のイベントで一括取得?することは可能なのでしょうか?
度重なるご質問で恐縮です。