Я пытаюсь научить себя некоторому AppScript/Javascript. В качестве упражнения я хочу сгенерировать следующий объект JSON
[
{
"config_type": "City Details",
"config_data": [
{
"city_type": "MAJOR_CITY",
"city_data": [
{
"city_name": "BIGFOOLA",
"monetary_data": [
{
"currency_data": [
{
"dollars": 1000
}
]
}
]
}
]
}
]
}
]
Я хочу, чтобы иметь возможность вводить только несколько деталей, таких как "Сведения о городе", "MAJOR_CITY" и значение доллара - 1000 в Листе Google. Сценарий должен иметь возможность генерировать вышеупомянутый JSON.
Поэтому я начал с создания имен всех массивов и объектов в одной строке. Перед массивами была пустая ячейка, а перед объектом - значение. Лист выглядит так
A B config_type City Details config_data city_type MAJOR_CITY city_data city_name BIGFOOLA monetary_data currency_data dollars 1000
Я могу получить все детали в одном объекте, но изо всех сил пытаюсь вложить их друг в друга. Как мне это сделать?
Изменение: вот что я сейчас
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;
}
Ps: Я знаю, что JSON грязный, но его просто понять и научить себя.
Вы жестко закодировали кучу имен свойств в качестве переменных; это не очень хороший подход.
Вот как это можно сделать. Переменная output
имеет объект мы вернемся в конце концов, в то время как currentObject
указывает на объект, который должен быть заполнен следующим. Когда дело доходит до его заполнения, мы либо имеем data[i][1]
скалярного значения 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
}
}
}
}
}