[英]Populating and formatting JSON into a Google Sheet
在此先感謝任何能夠幫助我的人。 幾天來我一直在努力使這項工作順利進行,只是對此知之甚少,無法使用示例來弄清楚。
我開發了一個在實時數據庫中下訂單的 Android 應用程序。 每個訂單都有自己的 ID,由應用程序生成。 當我運行代碼並根據列標題進入正確的列時,我希望每個訂單都顯示在一行中。 我發現這個例子似乎完全符合我的需要(相同的 JSON 結構),但是當我嘗試重新調整用途時不起作用。 這是我所擁有的:
function chunkArray(myArray, chunk_size){
var index = 0;
var arrayLength = myArray.length;
var tempArray = [];
for (index = 0; index < arrayLength; index += chunk_size) {
myChunk = myArray.slice(index, index+chunk_size);
// Do something if you want with the group
tempArray.push(myChunk);
}
return tempArray;
}
function flatten(arrayOfArrays){
return [].concat.apply([], arrayOfArrays);
}
function insertJSON(){
// this puts the keys in the correct place
var aOneName = "id";
var ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("orders");
var fileURL = "<-RT DB Link ->";
var res = UrlFetchApp.fetch(fileURL,{'muteHttpExceptions': true});
var content = res.getContentText();
var json = JSON.parse(content);
var rows = [Object.keys(json)]; // Retrieve entry column.
var toRows = rows[0].length;
var toRows = toRows + 1;
var rowsflate = flatten(rows);
var rowstocols = chunkArray(rowsflate, 1);
sheet.getRange("A2:A" + toRows).setValues(rowstocols); // sets column of IDs
sheet.getRange(1, 1).setValue(aOneName); // A1 name
var headers = json[rows[0][2]];
var getHeaders = [Object.keys(headers)];
sheet.getRange(1,2,getHeaders.length,getHeaders[0].length).setValues(getHeaders); // Put values to Spreadsheet.
content
var content = [];
var temp = [];
for (var i = 0; i < rows[0].length; i++) {
var temp2 = [Object.values(json[rows[0][i]])];// Retrieve values to be split.
Logger.log(temp2);
content.push(flatten(temp2));
}
var columncount1= rows[0].length;
var columncount2 = getHeaders[0].length;
sheet.getRange(2,2,columncount1,columncount2).setValues(content); // Put values to Spreadsheet.
}
該代碼用於提取 JSON 數據,並將每個訂單的鍵正確地放在 A 列中,從 A2 開始。 之后,使用此代碼時有兩個問題:
標題被覆蓋並更改它們的順序(按字母順序排列) - 這不是交易破壞者,如果需要,可以圍繞此重新排序,但理想情況下,將值放入單元格時,它將查看列標題(與值相同) JSON 中的標頭)並在單元格中放置正確的值。 預期:電子表格應該是什么樣子實際:代碼運行時重新排序
Object.values
拋出錯誤: TypeError: Cannot find function values in object function Object() { [native code for Object.Object, arity=1] }. (line 152, file "Code").
TypeError: Cannot find function values in object function Object() { [native code for Object.Object, arity=1] }. (line 152, file "Code").
我已將其替換為.keys
並嘗試使用.map
但隨后在sheet.getRange(2,2,columncount1,columncount2).setValues(content);
行中收到一條錯誤消息 : "The number of columns in the data does not match the number of columns in the range. The data has 1 but the range has 19. (line 161, file "Code")"
這是JSON
{
"12":{
"orderAddress":"address 1",
"orderDelivered":"No",
"orderDent":2,
"orderDish":0,
"orderEmail":"Not Provided",
"orderId":"12",
"orderLatLong":"Not Captured",
"orderLend":1,
"orderName":"Name 1",
"orderPaid":"No",
"orderPhone":"Phone 1",
"orderSans":0,
"orderSign":8,
"orderText":6,
"orderTint":0,
"orderTotal":17,
"orderTotalCost":200,
"orderTrain":0,
"orderTree":0
},
"13":{
"orderAddress":"address 2",
"orderDelivered":"No",
"orderDent":0,
"orderDish":1,
"orderEmail":"Not Provided",
"orderId":"13",
"orderLatLong":"Not Captured",
"orderLend":1,
"orderName":"Name 2",
"orderPaid":"Yes",
"orderPhone":"Phone 2",
"orderSans":0,
"orderSign":0,
"orderText":0,
"orderTint":0,
"orderTotal":27,
"orderTotalCost":40,
"orderTrain":0,
"orderTree":0
},
"-MMIu9hQrxlZNs91nl2M":{
"orderAddress":"address 3",
"orderDelivered":"Yes",
"orderDent":0,
"orderDish":0,
"orderEmail":"Not Provided",
"orderId":"-MMIu9hQrxlZNs91nl2M",
"orderLatLong":"Not Captured",
"orderLend":1,
"orderName":"Name 3",
"orderPaid":"Yes",
"orderPhone":"Phone 3",
"orderSans":0,
"orderSign":0,
"orderText":0,
"orderTint":0,
"orderTotal":1,
"orderTotalCost":12,
"orderTrain":0,
"orderTree":0
}
}
再次,對此的任何方向將不勝感激!
我相信你的目標如下。
json
檢索值並將解析后的值按照"id", "orderId", "orderName", "orderAddress", "orderPhone", "orderEmail", "orderLatLong", "orderDent", "orderLend", "orderTrain", "orderDish", "orderSans", "orderTint", "orderText", "orderSign", "orderTree", "orderTotal", "orderTotalCost", "orderPaid", "orderDelivered"
的標頭順序"id", "orderId", "orderName", "orderAddress", "orderPhone", "orderEmail", "orderLatLong", "orderDent", "orderLend", "orderTrain", "orderDish", "orderSans", "orderTint", "orderText", "orderSign", "orderTree", "orderTotal", "orderTotalCost", "orderPaid", "orderDelivered"
。當以上幾點反映到你的腳本中時,它變成如下。
請按如下方式修改您的腳本。
從: var rows = [Object.keys(json)]; // Retrieve entry column. var toRows = rows[0].length; var toRows = toRows + 1; var rowsflate = flatten(rows); var rowstocols = chunkArray(rowsflate, 1); sheet.getRange("A2:A" + toRows).setValues(rowstocols); // sets column of IDs sheet.getRange(1, 1).setValue(aOneName); // A1 name var headers = json[rows[0][2]]; var getHeaders = [Object.keys(headers)]; sheet.getRange(1,2,getHeaders.length,getHeaders[0].length).setValues(getHeaders); // Put values to Spreadsheet. content var content = []; var temp = []; for (var i = 0; i < rows[0].length; i++) { var temp2 = [Object.values(json[rows[0][i]])];// Retrieve values to be split. Logger.log(temp2); content.push(flatten(temp2)); } var columncount1= rows[0].length; var columncount2 = getHeaders[0].length; sheet.getRange(2,2,columncount1,columncount2).setValues(content); // Put values to Spreadsheet.
到:
// 1. Declare the header values. const header = ["id", "orderId", "orderName", "orderAddress", "orderPhone", "orderEmail", "orderLatLong", "orderDent", "orderLend", "orderTrain", "orderDish", "orderSans", "orderTint", "orderText", "orderSign", "orderTree", "orderTotal", "orderTotalCost", "orderPaid", "orderDelivered"]; // 2. Create an array for putting to Spreadsheet. const values = Object.entries(json).map(([k, v]) => { v.id = k; return header.map(h => v[h]); }); values.unshift(header); // When you want to add the header, please use this. // 3. Put the created array to Spreadsheet. sheet.getRange(1, 1, values.length, values[0].length).setValues(values);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.