我正在尝试自学一些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很乱,但它只是为了理解和自学。
答案 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
}
}
}
}
}