2017-01-28 5 views
0

序文:私はJSの完全な初心者であり、何時間も私のソリューションをグーグルで試してみました。Googleスプレッドシート:JSON結果の解析

Googleスプレッド(スクリプトエディタ内)を使用して公開エンドポイントへのAPI呼び出しを行っています。ここに私の現在のコードは次のとおりです。

function getMaterials() { 
    var myUrl = "https://api.guildwars2.com/v2/account/materials?access_token=[my_access_token]"; 
    var jsonData = UrlFetchApp.fetch(myUrl); 
    var jsonString = jsonData.getContentText(); 
    return jsonString; 
} 

ここで返されているものの抜粋です:

[ 
    { 
    "id": 12134, 
    "category": 5, 
    "count": 14 
    }, 
    { 
    "id": 12238, 
    "category": 5, 
    "count": 0 
    }, 
    { 
    "id": 12147, 
    "category": 5, 
    "count": 6 
    }, 
    { 
    "id": 12142, 
    "category": 5, 
    "count": 12 
    }, 
    { 
    "id": 12135, 
    "category": 5, 
    "count": 0 
    }, 
    { 
    "id": 12246, 
    "category": 5, 
    "count": 1 
    } 
] 

ここで私はとの対話だ特定のAPIのドキュメントです:

https://wiki.guildwars2.com/wiki/API:2/account/materials

あります私の電話をろ過する本当の方法はありません。それを使うのは嬉しいです。

私は "id"値を照会しようとしていますが、同じ照会では "count"値だけを返します。私はさまざまなサイトから複数の方法を試しましたが、どこにもいられません。助けて?

答えて

1

私は私が必要なものをやった他のいくつかのJSコードを見つけてしまいました。

これは、データを列にフォーマットする関数を通じてAPIをフィードすることを可能にします。私はこのデータを他のシートに入れてメインシートに供給することができます。

https://gist.github.com/paulgambill/cacd19da95a1421d3164

0

私はそのエンドポイントのAPIドキュメントを見つけることができませんが、IDをキーとして使用するオブジェクトにデータを変換できると思います。使用方法によっては、受信したデータ量とメモリー使用量が減少するため、特定のキー(つまり少量のデータのみが必要な場合のみ)をAPIに照会する方がよい場合もあります。しかし、これがうまくいけば助けてくれるはずです!

var data = getMaterials(); 
 

 
// Map each object by ID 
 
function getMaterialIdMap(data){ 
 
    var materials = {}; 
 
    for(var i = 0; i < data.length; i++){ 
 
    var material = data[i]; 
 
    if(material.hasOwnProperty('id')){ // Ensure we only get objects with ids 
 
     materials[material.id] = material; 
 
    } 
 
    } 
 
    return materials 
 
} 
 

 
// Map just the count to id 
 
function getIdToCountMap(data){ 
 
    var materials = {}; 
 
    for(var i = 0; i < data.length; i++){ 
 
    var material = data[i]; 
 
    if(material.hasOwnProperty('id') && material.hasOwnProperty('count')){ // Ensure we only get objects with counts and ids 
 
     materials[material.id] = material.count; 
 
    } 
 
    } 
 
    return materials 
 
} 
 

 
// For the full object by id 
 
var materialMap = getMaterialIdMap(data); 
 

 
// For just the counts 
 
var materialCountMap = getIdToCountMap(data); 
 

 
// For use in the sheet =countFromId(12134) //14 
 
function countFromId (id){ 
 
    return materialCountMap[id]; 
 
} 
 

 
function getMaterials(){ 
 
    // Just a dummy data function for live snippet replace me with your version that performs the actual request and returns data as an array of objects. 
 
    return [ 
 
    { 
 
    "id": 12134, 
 
    "category": 5, 
 
    "count": 14 
 
    }, 
 
    { 
 
    "id": 12238, 
 
    "category": 5, 
 
    "count": 0 
 
    }, 
 
    { 
 
    "id": 12147, 
 
    "category": 5, 
 
    "count": 6 
 
    }, 
 
    { 
 
    "id": 12142, 
 
    "category": 5, 
 
    "count": 12 
 
    }, 
 
    { 
 
    "id": 12135, 
 
    "category": 5, 
 
    "count": 0 
 
    }, 
 
    { 
 
    "id": 12246, 
 
    "category": 5, 
 
    "count": 1 
 
    } 
 
] 
 

 
}var data = getMaterials(); 
 

 
// Map each object by ID 
 
function getMaterialIdMap(data){ 
 
    var materials = {}; 
 
    for(var i = 0; i < data.length; i++){ 
 
    var material = data[i]; 
 
    if(material.hasOwnProperty('id')){ // Ensure we only get objects with ids 
 
     materials[material.id] = material; 
 
    } 
 
    } 
 
    return materials 
 
} 
 

 
// Map just the count to id 
 
function getIdToCountMap(data){ 
 
    var materials = {}; 
 
    for(var i = 0; i < data.length; i++){ 
 
    var material = data[i]; 
 
    if(material.hasOwnProperty('id') && material.hasOwnProperty('count')){ // Ensure we only get objects with counts and ids 
 
     materials[material.id] = material.count; 
 
    } 
 
    } 
 
    return materials 
 
} 
 

 

 
var materialMap = getMaterialIdMap(data); 
 

 

 
// For just the counts 
 
var materialCountMap = getIdToCountMap(data); 
 

 
// For the full object by id 
 
function countFromId (id){ 
 
    return materialCountMap[id]; 
 
} 
 

 
function getMaterials(){ 
 
    // Just a dummy data function for live snippet 
 
    return [ 
 
    { 
 
    "id": 12134, 
 
    "category": 5, 
 
    "count": 14 
 
    }, 
 
    { 
 
    "id": 12238, 
 
    "category": 5, 
 
    "count": 0 
 
    }, 
 
    { 
 
    "id": 12147, 
 
    "category": 5, 
 
    "count": 6 
 
    }, 
 
    { 
 
    "id": 12142, 
 
    "category": 5, 
 
    "count": 12 
 
    }, 
 
    { 
 
    "id": 12135, 
 
    "category": 5, 
 
    "count": 0 
 
    }, 
 
    { 
 
    "id": 12246, 
 
    "category": 5, 
 
    "count": 1 
 
    } 
 
] 
 

 
}

+0

ありがとうBrian。私はオリジナルの投稿に特定のAPIとドキュメントを追加しました。あなたがここで少し示唆したことを試してみます。 – jmct

+0

あなたはとても歓迎です。それを追加していただきありがとうございます:)私は見てきましたが、特定のAPIエンドポイントでIDを指定できるとは思わないので、probをすべて取得してフィルタリングするだけで済みます。何か問題があれば私に知らせて、もう一度見てみましょう! – Brian

+0

さて、私はGoogleスプレッドシートのスクリプトエディタで上記のコードをプラグインしていましたが、IDと実際に電話をかける方法を混同しています。また、それを追加した後、私はもはや私のgetMaterials関数から返されたデータを取得することはできません。見て: "TypeError:プロパティを読み取ることができません"長さ "未定義から。 – jmct