新規投稿
フォローする

JSONを取得する際の並び順について

いつもお世話になっております。
RESTAPIのfieldsについて質問です。
JavaScriptにてRESTAPIを用いて検索結果を取得するスクリプトを
組んでいます。
クエリーに関して下記の通り指定してJSONの結果を受取って、HTMLを表示させて
EXCELに保存しようとしているのですが、項目の並び順が意図通りになりません。どうすれば意図通りの並び順になるのでしょうか?

var query = '更新日時 >= "' + kstartTime + '"and 更新日時 <= "' + kendTime + '" and 担当者 in("' + koperater + '") order by レコード番号 desc';
var field = 'fields[0]=' + encodeURIComponent('項目1') + '&fields[1]=' + encodeURIComponent('項目2') + '&fields[2]=' + encodeURIComponent('項目3')
+ '&fields[3]=' + encodeURIComponent('項目4')
var appUrl = kintoneURL + '?app=' + appNo + '&query=' + encodeURIComponent(query) + '&' +field;

並び順としてはfields[0]、fields[1]、fields[2]、fields[3]の順序として並び替えた状態のJSONが戻ってくると思っていたのですが、どうもバラバラの並び順の様です。
どの様に処理すれば意図通りの並び順になるでしょうか?

0

5件のコメント

Avatar
山下 竜

xsoladmさん、こんばんは。

fields[]では、(見た感じの予想で)元々大文字小文字・日本語を区別しつつアルファベット順に並ぶレスポンス・フィールド群から抽出するフィールドを絞るだけのようですので、APIでレコード取得するところまでで順序を制御するのは難しいように思います。取得したレコードからHTMLを形成する時等に明示的に入れ替えていくことは難しそうでしょうか?

0
Avatar
落合 雄一

xsoladmさん、cstapの落合です。
ご希望のものとは違うかもしれませんが、こんな感じでしょうか?
テキストエリア内の文字列をコピーして、テキストファイルに張り付け拡張子を.csvにして保存するとエクセルで見れるかと思います。

/*
* 一覧のカスタマイズビューにHTMLを指定
* <textarea id="test_area"></textarea>
*/
var myAppId = 247;
var myFields = ['項目1', '項目2', '項目3', '項目4'];
var kstartTime = '2014-05-01';
var kendTime = '2014-05-20';
var koperater = 'user-code';

(function() {
"use strict";

// 一覧ページ
kintone.events.on('app.record.index.show', function(event) {
var show = function(records) {
var area = document.getElementById("test_area");
var csv = "";

  for (var i = 0, len = records.length; i < len; i++) {
    var record = records[i];
    var values = new Array();
    for (var j = 0, columnLen = myFields.length; j < columnLen; j++) {
      values[j] = record[myFields[j]]['value'];
    }
    csv += values.join(',') + '\n';
  }
  area.innerHTML = csv;
};
getMyRecords(show);

});
})();

/* レコード取得 */
var getMyRecords = function(successCallback) {
var where = '更新日時 >= "' + kstartTime + '" and 更新日時 <= "' + kendTime + '" and 担当者 in("' + koperater + '")'
var orderBy = 'order by レコード番号 desc';
// データ取得
kintone.api('/k/v1/records', 'GET', {
app: myAppId,
query: generateQuery(where, orderBy),
fields: myFields
}, function(resp) {
successCallback(resp.records);
});
};

/* Query生成 */
var generateQuery = function(where, orderBy, limit, offset) {
var query = where;

if (orderBy) {
query += orderBy;
}

if (limit) {
query += orderBy;
}

if (offset) {
query += offset;
}

return query;
};

1
Avatar
xsoladm

山下様

ご回答ありがとうございます。
やはり順序通りに返すというモノではないということですね。HTMLを形成する際に明示的に切替えられればいいのですが、項目名等の順序を識別する識別子がないので、そこから考え直していかないとHTMLで判別することも厄介な状態なので質問した次第です。

0
Avatar
xsoladm

cstap/落合様

サンプルありがとうございます。頂いた内容を基に試してみます。

0
Avatar
xsoladm

問題の方は解決しました。一旦HTMLでIDの要素に番号を振った形で変数に格納して配列に振り直してから、並べ替えするというやり方で何とかなりました。
下記のような感じです。あまり美しくないやり方でしたが、実現したいことはできました。返されるJSONの並び順が指定できるとありがたいですね。

function fieldSorter(tbody) {
//HTML取得用
var t = tbody;
var separator = '\r\n';
//ワーク用
var tmp = new Array;
var workTemp = 9;
var machword = ['-0"', '-1"', '-2"', '-3"', '-4"', '-5"', '-6"', '-7"','-8"'];
var tagend = '</tr>';
var ot = '<table border="1" cellspacing="0" cellpadding="4" id="table1">' + separator;
var field = t.split(separator);

//HTML書替
for (i = 0; i < t.length - 2; i++) {

    //データ部
    if (field[i]) {
        for (j = 0; j < workTemp; j++) {
            if (field[i].indexOf("" + machword[j] + "") !== -1) {
                tmp[j] = field[i];
                switch (j) {
                    //最終列まで処理してから並替する。
                    //要素の順序0,4,2,6,8,7,5,1,3                        case 8:
                        var tmpot = tmp[0] + separator + tmp[4] + separator + tmp[2] + separator + tmp[6] + separator + tmp[8] + separator +tmp[7] + separator + tmp[5] + separator + tmp[1] + separator + tmp[3] + separator;
                        break;
                    default:
                        var tmpot = "";
                        break;
                }
                ot += tmpot;
            }
        }
    }
}
ot += '</table>'
return ot;
0
ログインしてコメントを残してください。