前提
GoogleAppsScriptでウェブサービスからAPIで情報を取得し、随時Googleスプレッドシートへ出力するアプリケーションを作っています。
本日こちらで質問させていただき、スプレッドシートへの出力は行えたのですが、考慮不足が判明したため、改めて質問させていただきます。
実現したいこと
下記の通りJSON形式で取得した階層化されたデータをGoogleスプレッドシートへproject_idごとに1行に出力したい。
考慮不足であった点は、取得したJSONの配列が階層化されているケースがあることです。
階層化されている情報もスプレッドシートへ出力したく、配列をフラット化する?という下記記事を参考に色々と試行しておりますが、うまく取得することができずどうしたものかと困っております。。。
参考にしているページhttps://codelife.cafe/entry/GAS-JSON-to-SpreadSheet
これを、、、
"data": [
{
"project_id": 1,
"project_name": "XXX",
"custom": [
{
"def_id": 10,
"def_value": "XXXXXX"
}
],
{
"project_id": 2,
"project_name": "ZZZ",
"custom": [
{
"def_id": 20,
"def_value": "ZZZZZZ"
}
],
こうしたい、、、
A B C D
1 1 XXX 10 XXXXXX
2 2 ZZZ 20 ZZZZZZ
3
発生している問題・エラーメッセージ
「ReferenceError: flattenObj is not defined(行 16」と表示され、処理が止まってしまいます。
該当のソースコード
GoogleAppsScript
1 const sheet_id = 'xxxxxx'; 2 const sheet_name = 'test'; 3 const sheet = SpreadsheetApp.openById(sheet_id).getSheetByName(sheet_name); 4 sheet.getRange("A2:T1000").clearContent(); 5 const response = UrlFetchApp.fetch("https://api.xxxxxx.com/v1.1/projects?limit=10", { 6 "method": "GET", 7 "headers": { 8 "content-type": "application/json", 9 "Api-Key": "xxxxxxx" 10 }, 11 }) 12 const json = JSON.parse(response); 13 14 // 配列内のObjectをフラット化 15 const flatJson = json.data.map((e) => flattenObj(e)); 16 17 // 1つ目の配列のkeyをヘッダーとして定義 18 const headers = Object.data(flatJson[0]); 19 20 // headers をループして生成した配列を body 配列にまとめる 21 const body = flatJson.map((row) => { 22 return headers.map((data) => row[data] || "");s 23}); 24 25 // headers と body を結合 26 const table = [headers].concat(body); 27 28 // setValues 29 sheet.getRange(1, 1, table.length, table[0].length).setValues(table); 30 31 // シートに出力したいデータだけを抜き出して、2次元配列を生成 32 const output = json.data.map(obj => [obj.project_id, obj.project_name, obj.custom.def_id, obj.custom.def_value]); 33 34 // getRange()で使用する値を設定 35 const startRow = sheet.getLastRow() + 1; 36 const rowLength = output.length; 37 const colLength = output[0].length; 38 39 // シートの指定した範囲に、outputを出力する 40 // getRange(開始行番号, 開始列番号, 行数, 列数) 41 sheet.getRange(startRow, 1, rowLength, colLength).setValues(output);
フラット化しての取得にこだわりがあるわけではありませんので、他に良い方法がありましたらどうかご教授の程、お願いいたします。

回答2件
あなたの回答
tips
プレビュー