#kintoneで別アプリからAPI経由でデータを取得して処理する
##処理イメージ
新規で作るkintoneアプリに、テーブルを設け、別アプリ(マスターデータ登録アプリ)から、ステータスが「使用中」のものだけを引っ張ってきて、新規アプリのテーブルにデータを突っ込む。テーブルの行数は引っ張ってきたデータの件数に依存するが、随時増やす。
##REST APIを使う
kintone関係のサイボウズのページを検索すると、REST APIを使うように書いてあるのだが、戻り値はJSONで返ってくる、と書いてある。JSONで返って来たデータを、巧いこと処理してテーブルに突っ込んで行かなくてはならないのだが、サイボウズのページには
console.log(record);
みたいなlog出力のサンプルしかなくて、戻り値のJSONをどう処理するべきか、というのに非常に苦労したので、ここに書いておく。
###検索条件の設定
まず、検索してデータを引っ張ってくるので、その検索条件を書く。一応、順番に並べる必要があるので、「ソートキー」というフィールドを作ってあって、そこに並び順を設定している。この辺の検索条件の設定の仕方はサイボウズkintone関係のページにたくさん書いてある。ちなみに件数は後でfor文を回すためにonにしてある。
var body = {
"app": 27, //検索しに行くアプリのアプリID
"query": 'ステータス in ("使用中") order by ソートキー asc',
totalCount: true
};
###REST APIの実行
検索条件を設定したら、実際にREST APIで検索を実行して、データを引っ張ってくるわけなのだが、引っ張って来る方法も、サイボウズkintone関係のページには書いてある。ただし、注意点があって、
検索する処理と検索結果をなんとかする処理を別に書かずにpromiseでひとつにして書く
という部分は注意が必要。
// 別アプリからレコード用データを取得
// promiseで書かないと取得と処理が同時に走るので注意
kintone.api(kintone.api.url('/k/v1/records', true), 'GET', body).then(function(resp){
return resp;
}, function(error) {
console.log(error);
}).then(function(resp){
// 取得したレコードの処理
var records = JSON.stringify(resp);
var results = JSON.parse(records);
// データを作成
var makeDataLineResult = makeDataLine(events, results, results['totalCount']);
});
###取得したデータの処理
取得したデータの処理は別関数にして処理させている。上記で言うと、'makeDataLine()'なのだが、取得した件数を元に、基本は繰り返し処理。
// 取得したデータを元にして処理
function makeDataLine(event, results, counts){
for(var i=0; i<counts; i++){
addRow(i, results);
}
deleteRow();
}
最初に書いたが、今回は取得してきたアプリで、取得してきたデータをテーブルに突っ込んでいるので、以下のような感じ。ちなみに「dataSheet」というのは、データを突っ込んでいるkintone詳細画面上のテーブルの名前。
// 行追加
function addRow(i, results){
const record = kintone.app.record.get().record;
record.dataSheet.value.push({
value: {
"No":{
value: i+1,
type: 'SINGLE_LINE_TEXT',
},
"間隔":{
value: results['records'][i]['作業間隔']['value'],
type: 'SINGLE_LINE_TEXT',
},
// --- (中略と解説) ---
// 引数で渡す前にparseしたresultsの配列にはrecordsという形で情報が入っているので、そこに順番を示す「i」をつけて、
// 検索に行った先の「フィールド名」と「value」をつければ、値が取れる。
// typeに定義するのは、情報を格納するテーブルのフィールド形式。
"メモ":{
value: '',
type: 'MULTI_LINE_TEXT',
}
}
});
kintone.app.record.set({record: record});
}
ちなみに、データを書き込むアプリには予めテーブルが定義されていて、1行目にはデータを突っ込めないので、最後に消す。便宜上、データシートのナンバリングに「0」を定義しておく。
// 1行目を消す関数
function deleteRow(){
const record = kintone.app.record.get().record;
const targetRowNo = 0;
record.dataSheet.value.forEach(function(row, i){
if(row.value.No.value === '0'){
record.dataSheet.value.splice(i,1);
}
kintone.app.record.set({record: record});
});
}
まとめると、REST APIで戻ってきたJSONをstringifyして、parseした上で、for文で回せばvalueがとれますよ、と。