複数アプリからcsv書出し(条件に一致しない場合は空欄にする)

【アプリA】
ID
氏名

【アプリB】
ID(ルックアップ)
関係者

【アプリC】
ID(ルックアップ)
手続
年月日

【アプリB】にボタンを配置し,
上記3つのアプリから,IDが共通し,さらに【アプリC】の「手続」が"生年月日"の年月日を抽出し,csvファイルを作りたいです。

(例)
[ID] [氏名] [関係者] [生年月日]
999 山田太郎 山本良子 1999-01-01

以下のようにコードを書いてみたのですが,
【アプリC】に"生年月日"が無い場合,[生年月日]だけでなく,[氏名],[関係者]も空欄になってしまいます。
"生年月日"が無い場合は,[生年月日]欄を空欄で,[氏名],[関係者]を抽出したいです。

どのように修正したらいいでしょうか?

・・・

// csvデータの作成
function getMakeCsv(appId, customerRecords) {
var header = ['氏名', '関係者', '生年月日'].join(',');//CSVのヘッダー設定
var csvData = [header];

・・・

return new kintone.Promise(function(resolve, reject) {
fetchRelatedRecords().then(function(resp) {
csvData = csvData.concat(resp);
resolve(csvData);
});//function(resp)
});//kintone.Promise

・・・

function fetchRelatedRecords(opt_index, opt_data) {
var index = opt_index || 0;
var data = opt_data || [];

var name = record.関係者.value;
var JJID = record.ID.value;//queryで利用するためにデータのJIDを変数に入れる
var query = 'ID ="'+JJID+'"';
var query2 = 'ID ="'+JJID+'" and 手続 = "生年月日"';
var params = {
app: 【アプリA】,
query: query
};//params


var params2 = {
app: 【アプリC】,
query: query2
};//params2

・・・

return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params)
.then(function(resp) {

return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params2)
.then(function(resp2) {

・・・

var row = [name];
var relatedRecords = resp.records;
var relatedRecords2 = resp2.records;

・・・

if (relatedRecords.length > 0) {
relatedRecords.forEach(function(relatedRecord) {
relatedRecords2.forEach(function(relatedRecord2) {//←★★このあたりが原因?
row.push(relatedRecord.氏名.value);
row.push(relatedRecord2.年月日.value);
data.push(row.join(','));
});//relatedRecords.forEach
});//relatedRecords2.forEach
}//if
return data;
});//function(resp)
});//function(resp2)
}//function fetchRelatedRecords
}//getMakeCsv
});//app.record.detail.show

// ダウンロード関数
function downloadFile(data) {
var csv = data.join('\r');
// ファイル名
var filename = 'TEST.csv';//ファイル名(固定)

// Blob準備
var bom = new Uint8Array([0xef, 0xbb, 0xbf]);
var blob = new Blob([bom, csv], { type: 'text/csv' });

if (window.navigator.msSaveBlob) {
window.navigator.msSaveBlob(blob, filename);
} else {
var e = new MouseEvent('click', {view: window, bubbles: true, cancelable: true});
var url = window.URL || window.webkitURL;
var blobUrl = url.createObjectURL(blob);
var a = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');
a.href = blobUrl;
a.download = filename;
a.dispatchEvent(e);
}

こんにちは。

直接の回答ではありませんが、

1番目のPromiseの結果をthen()でチェーンして、チェーンした先の2番目のPromise内でも

1番目の結果を受け取る場合には、下記のような書き方になるかと思います。

// Promiseを返す関数 promiseA
const promiseA = value => {
return new Promise(resolve => {
resolve(value.toUpperCase());
})
}

// Promiseを返す関数 promiseB
const promiseB = value => {
return new Promise(resolve => {
resolve(value.toLowerCase());
})
}

// promiseA と promiseB を利用する関数
function promiseC1 (value) {
return promiseA(value)
.then(result1 => {
// 何か処理
console.log(result1);
return promiseB(result1);
})
.then(result2 => {
// 何か処理
console.log(result1); // result1は取得できないのでエラーになる
console.log(result2);
})
.catch(error => {
console.log(error);
})
}
promiseC1('Hi!');


// Promiseを返す関数 promiseB1
const promiseB1 = value => {
return new Promise(resolve => {
// promiseB1の引数と処理結果を配列で返す
resolve([value, value.toLowerCase()]);
})
}

// promiseA と promiseB1 を利用する関数
function promiseC2 (value) {
return promiseA(value)
.then(result1 => {
// 何か処理
console.log('result1 =>', result1);
return promiseB1(result1);
})
.then(result2 => {
// 何か処理
console.log('promiseAの処理結果 =>', result2[0]);
console.log('promiseB1の処理結果 =>', result2[1]);
})
.catch(error => {
console.log(error);
})
}
promiseC2('HiHo!');

>Kazuhiro Yoshida さま

 

ありがとうございます!やってみます!!

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