使用Google表格创建嵌套的JSON对象

时间:2017-11-30 16:07:06

标签: javascript json google-apps-script google-sheets

我正在尝试自学一些AppScript / Javascript。作为练习,我想生成以下JSON对象

function doGet(){
  var result={}
  var rewardSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("CITY")
  var reward_data = rewardSheet.getRange("A1:B13").getValues();

  result = getJsonArrayFromData(reward_data);
  return ContentService.createTextOutput(JSON.stringify(result))
  .setMimeType(ContentService.MimeType.JSON)
}


function getJsonArrayFromData(data)
{
  var column_headers = data[0];
  var col_len = column_headers.length;
  var row = [];
  var reward_obj = [];
  var config_obj = {};

  var config_type = {};
  var config_data = [];
  var reward_type = {};
  var reward_data = [];
  var reward_name = {};
  var reward_data_2 = [];
  var currency_data = [];
  var curreny_obj = {};
  var rewardSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("CITY")
  var row_items = rewardSheet.getRange(1,1,data.length,1).getValues();
  //Logger.log(row_items);

  for(var i=0;i<data.length;i++){

    row = data [i];
    config_type ={};
    reward_type[config_type]={};
    reward_name[reward_type]={};

    //Logger.log(row);
    for(var r=0;r<row.length;r++)
    {
      config_type[row[r]] = row[r+1];
      reward_type[row[r]] = row[r+1];
      reward_name[row[r]] = row[r+1];

    }
    config_data.push(config_type,reward_type,reward_name);
    //reward_data.push(reward_name);


    reward_obj = config_data;
  } 
  Logger.log(reward_obj);


  return reward_obj;

}

我希望能够在Google表格中仅输入一些详细信息,例如“城市详情”,“MAJOR_CITY”和美元价值 - 1000。该脚本应该能够生成上述JSON。

所以我开始在一行中创建所有数组和对象的名称。在数组前面,有一个空白单元格,在对象前面有值。工作表看起来像这样

A              B 
config_type    City Details
config_data    
city_type      MAJOR_CITY
city_data
city_name      BIGFOOLA
monetary_data
currency_data
dollars        1000

我能够在一个对象中获取所有细节,但却努力将它们嵌套在一起。我该怎么做?

编辑:这就是我现在所拥有的

str.format

Ps:我知道JSON很乱,但它只是为了理解和自学。

1 个答案:

答案 0 :(得分:1)

您将一堆属性名称硬编码为变量;这不是一个好方法。

以下是人们如何做到这一点。变量output保存我们最后返回的对象,而currentObject指向将要填充的对象。在填充它时,我们要么有一个标量值data[i][1]要放入,要么我们没有,在这种情况下会创建一个新对象并成为新的currentObject。

function formJSON() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("CITY");
  var data = sheet.getDataRange().getValues();
  var currentObject = {};
  var output = [currentObject];                     // or just currentObject  
  for (var i = 0; i < data.length; i++) {
    if (data[i][1]) {
      currentObject[data[i][0]] = data[i][1];
    }
    else {
      var newObject = {};
      currentObject[data[i][0]] = [newObject];      // or just newObject 
      currentObject = newObject;
    }
  }
  Logger.log(JSON.stringify(output));
}

输出

[{"config_type":"City Details","config_data":[{"city_type":"MAJOR_CITY","city_data":[{"city_name":"BIGFOOLA","monetary_data":[{"currency_data":[{"dollars":1000}]}]}]}]}]

或以美化形式

[{
  "config_type": "City Details",
  "config_data": [{
    "city_type": "MAJOR_CITY",
    "city_data": [{
      "city_name": "BIGFOOLA",
      "monetary_data": [{
        "currency_data": [{
          "dollars": 1000
        }]
      }]
    }]
  }]
}]

顺便说一下,我不明白你为什么要把每个对象放在一个数组中。属性可以是另一个对象。删除注释行上的方括号

{
  "config_type": "City Details",
  "config_data": {
    "city_type": "MAJOR_CITY",
    "city_data": {
      "city_name": "BIGFOOLA",
      "monetary_data": {
        "currency_data": {
          "dollars": 1000
        }
      }
    }
  }
}