LoginSignup
0
2

More than 3 years have passed since last update.

kintoneのAPIで別アプリからqueryで取得したJSONデータの処理方法

Last updated at Posted at 2019-12-31

kintoneで別アプリからAPI経由でデータを取得して処理する

処理イメージ

新規で作るkintoneアプリに、テーブルを設け、別アプリ(マスターデータ登録アプリ)から、ステータスが「使用中」のものだけを引っ張ってきて、新規アプリのテーブルにデータを突っ込む。テーブルの行数は引っ張ってきたデータの件数に依存するが、随時増やす。

REST APIを使う

kintone関係のサイボウズのページを検索すると、REST APIを使うように書いてあるのだが、戻り値はJSONで返ってくる、と書いてある。JSONで返って来たデータを、巧いこと処理してテーブルに突っ込んで行かなくてはならないのだが、サイボウズのページには

sample.js
console.log(record);

みたいなlog出力のサンプルしかなくて、戻り値のJSONをどう処理するべきか、というのに非常に苦労したので、ここに書いておく。

検索条件の設定

まず、検索してデータを引っ張ってくるので、その検索条件を書く。一応、順番に並べる必要があるので、「ソートキー」というフィールドを作ってあって、そこに並び順を設定している。この辺の検索条件の設定の仕方はサイボウズkintone関係のページにたくさん書いてある。ちなみに件数は後でfor文を回すためにonにしてある。

sample.js
var body = {
    "app": 27, //検索しに行くアプリのアプリID
    "query": 'ステータス in ("使用中") order by ソートキー asc',
    totalCount: true
    };

REST APIの実行

検索条件を設定したら、実際にREST APIで検索を実行して、データを引っ張ってくるわけなのだが、引っ張って来る方法も、サイボウズkintone関係のページには書いてある。ただし、注意点があって、

検索する処理と検索結果をなんとかする処理を別に書かずにpromiseでひとつにして書く

という部分は注意が必要。

sample.js
// 別アプリからレコード用データを取得
// 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()'なのだが、取得した件数を元に、基本は繰り返し処理。

sample.js
// 取得したデータを元にして処理
function makeDataLine(event, results, counts){
    for(var i=0; i<counts; i++){
        addRow(i, results);
    }
    deleteRow();
}

最初に書いたが、今回は取得してきたアプリで、取得してきたデータをテーブルに突っ込んでいるので、以下のような感じ。ちなみに「dataSheet」というのは、データを突っ込んでいるkintone詳細画面上のテーブルの名前。

sample.js
// 行追加
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」を定義しておく。

sample.js
// 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がとれますよ、と。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2