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 ; }); }