kintoneのカスタマイズをしていると、多くの方がRDB(リレーショナルデータベース)でない点で何かしらの問題にぶつかると思います。そこで、APIを利用して、複数のアプリ(テーブル)から共通するキーを利用して紐づけるJavaScriptを作りました。
今回の想定イメージ
顧客管理システムのようなもので、企業情報に先方担当者や案件情報が紐づくようなシステムで、
任意のレコード番号の企業に紐づく、先方担当者・案件情報を取得するプログラム例です。
アプリ1「企業情報」 ⇒ 親アプリ。子アプリとはレコード番号で紐づいている。
アプリ2「先方担当者」 ⇒ 子アプリ。「企業ID」で企業情報アプリと紐づいている。
アプリ3「案件情報」 ⇒ 子アプリ。「企業ID」で企業情報アプリと紐づいている。
取得する企業情報のレコード番号 1001、1002、1003
var appId_1 = 1; // 企業情報のアプリID
var appId_2 = 2; // 先方担当者のアプリID
var appId_3 = 3; // 案件情報のアプリID
var arr =[];
var arr_ids =[];
var query_src = '$id in ("1001","1002","1003") ';
fetchRecords ( appId_1, query_src )
.then(function(result1) {
arr['企業'] = result1;
// 親テーブルの紐づけキーを配列に取得
for (var i = 0 ; i < arr['企業'].length ; i++){
arr_ids.push( arr['企業'][i].$id.value );
}
return fetchRecords ( appId_2, '企業ID in (' + arr_ids + ') ');
}).then(function(result2) {
arr['担当者'] = result2;
return fetchRecords(appId_3, '企業ID in (' + arr_ids + ') ');
}).then(function(result3) {
arr['案件']= result3;
var marge_arr = arr['企業'];
for (var i = 0 ; i < arr['企業'].length ; i++){
marge_unit(marge_arr[i],arr,'$id','担当','企業ID');
marge_unit(marge_arr[i],arr,'$id','案件','企業ID');
}
});
/*
=================================================
2テーブルの結合関数
=================================================
■引数
marge_arr_i :マージ結果を保存する配列(対象の1レコードのみ)
arr :取得した全データ
parent_key :親テーブル側の紐づけキー
child_table :マージ対象の子テーブルの名前(「ビル」と「フロア」であれば「フロア」)
child_key :子テーブル側の紐づけキー
*/
function marge_unit ( marge_arr_i, arr, parent_key, child_table, child_key ) {
marge_arr_i[child_table] = [];
// 子テーブルの各レコードについて、紐づけキーが合致したら、当該親テーブルの指定するフィールドへ配列を追加
for ( var j = 0 ; j < arr[child_table].length ; j++ ) {
if ( marge_arr_i[parent_key]['value'] == arr[child_table][j][child_key]['value'] ) {
marge_arr_i[child_table].push( arr[child_table][j] );
}
}
}
//レコード取得
function fetchRecords ( appId, query_src, opt_offset, opt_limit, opt_records ) {
var offset = opt_offset || 0;
var limit = opt_limit || 500;
var allRecords = opt_records || [];
var params = { app: appId, query: query_src + ' limit ' + limit + ' offset ' + offset } ;
return kintone.api ( '/k/v1/records', 'GET', params ).then( function ( resp ) {
allRecords = allRecords.concat ( resp.records ) ;
if ( resp.records.length === limit ) {
return fetchRecords ( appId,query_src,offset + limit, limit, allRecords ) ;
}
return allRecords ;
});
}