簡體   English   中英

將 JSON 填充並格式化為 Google Sheet

[英]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 開始。 之后,使用此代碼時有兩個問題:

  1. 標題被覆蓋並更改它們的順序(按字母順序排列) - 這不是交易破壞者,如果需要,可以圍繞此重新排序,但理想情況下,將值放入單元格時,它將查看列標題(與值相同) JSON 中的標頭)並在單元格中放置正確的值。 預期:電子表格應該是什么樣子實際:代碼運行時重新排序

  2. 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"
  • 您想使用 Google Apps 腳本來實現這一點。

改裝要點:

  • 在 JSON 對象中,不保證鍵的順序。 所以在你的情況下,我認為給出有序的標題值是合適的。
  • 通過將標頭值聲明為數組,我想提出以下流程。
    1. 聲明標題值。
    2. 創建一個用於放入電子表格的數組。
    3. 將創建的數組放入電子表格。

當以上幾點反映到你的腳本中時,它變成如下。

修改后的腳本:

請按如下方式修改您的腳本。

從:
 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);

筆記:

  • 使用此腳本時,請啟用 V8 運行時。

參考:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM