Создание вложенного объекта JSON с помощью Google Sheets

1

Я пытаюсь научить себя некоторому 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 грязный, но его просто понять и научить себя.

  • 0
    Попробуйте написать код самостоятельно, а затем, если не сможете заставить его работать, найдите / исследуйте, что вы пытаетесь сделать, а затем, если вы не нашли, как это сделать, задайте вопрос. Если вы уже сделали это, включите минимальный воспроизводимый пример . Ссылка Как спросить .
  • 0
    Связанный: Создание объекта JSON из Google Sheets
Показать ещё 1 комментарий
Теги:
google-apps-script
google-sheets

1 ответ

0

Вы жестко закодировали кучу имен свойств в качестве переменных; это не очень хороший подход.

Вот как это можно сделать. Переменная 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
        }
      }
    }
  }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню