Я хочу написать скрипт приложения Google для создания многоуровневого JSON

У меня есть такая таблица:

странагодfx_rate
ЕС20211
ЕС20221
ЮВ20219,98
ЮВ202210.01

И я хочу преобразовать его во вложенный JSON (может быть, не то имя).

У меня есть этот код:

function toJson(data,indexer){
  var cols = data[0];
  var index = cols.indexOf(indexer);
  var jsonData = {};
  for (i = 1; i < data.length; i++) {
    if (!jsonData.hasOwnProperty(data[i][index])) {
      jsonData[data[i][index]] = [];
    }
    var jsonCandidate = {};
    for (j = 0; j < cols.length; j++) {
      if (data[i][j] instanceof Date){
        jsonCandidate[cols[j]] = Utilities.formatDate(data[i][j], 'Europe/Madrid', 'yyyy-MM-dd');
      }else{
        jsonCandidate[cols[j]] = data[i][j];
      }
    }
    jsonData[data[i][index]].push(jsonCandidate);
  }
  return jsonData;
}

где data — таблица выше, а indexer — ключ 1-го уровня json. Если я использую страну в качестве индексатора, я получаю что-то вроде этого:

{"ES = "[{year=2022.0,eur=1.0,"country=ES"},{year=2021.0,eur=1.0,"country=ES"},],"SE = "[{year=2021.0,eur=9.98,"country=SE"},{year=2022.0,eur=10.01,"country=SE"}}

Результат, который я хочу получить:

{"ES = "["year = "["2021 = " {eur=1.0,"country=ES"},"2022 = " {eur=1.0,"country=ES"}]],"SE = "["year = "["2021 = "{eur=9.98,"country=SE"},{eur=10.01,"country=SE"}]]}

Причина, по которой я хочу, состоит в том, чтобы иметь возможность вызывать значение, которое я хочу, на основе динамических полей, таких как страна и год, поэтому я могу сделать что-то вроде jsonData[country][year]['eur'] и получить желаемую ставку валюты для каждое значение.

Лучшее, что я могу придумать, это этот код:

function toJson3(data,indexer1,indexer2){
  var cols = data[0];
  var index1 = cols.indexOf(indexer1);
  var index2 = cols.indexOf(indexer2);
  var jsonData = {};
  for (i = 1; i < data.length; i++) {
      if (!jsonData.hasOwnProperty(data[i][index1])) {
          jsonData[data[i][index1]] = {}; 
          jsonData[data[i][index1]][data[i][index2]] = [];
    }
    var jsonCandidate = {};
    for (j = 0; j < cols.length; j++) {
        if (data[i][j] instanceof Date){
            jsonCandidate[cols[j]] = Utilities.formatDate(data[i][j], 'Europe/Madrid', 'yyyy-MM-dd');
        }else{
            jsonCandidate[cols[j]] = data[i][j];
      }
    }
    jsonData[data[i][index1]][data[i][index2]].push(jsonCandidate);
  }
  return jsonData;
}

Но это не говорит о том, что невозможно прочитать свойство "push" неопределенного.

Заранее спасибо за помощь

Я не думаю, что вы можете использовать именованные индексы в javascript, поэтому «год» = [] не будет работать. Вместо этого используйте объект

TheWizEd 21.03.2022 20:03
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
1
36
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш JSON выглядит не очень хорошо. Вероятно, вы хотите что-то вроде этого:

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getDataRange();
  var [header, ...data] = range.getValues();
  var obj = {};

  while (data.length) {
    var [country, year, rate] = data.shift();
    try {
      obj[country][year] = {'eur': rate, 'country': country};
    } catch(e) {
      var y = {};
      y[year] = {'eur': rate, 'country': country};
      obj[country] = y;
    }
  }

  console.info(obj);
  console.info(obj['ES']['2021'].eur);
  console.info(obj['SE']['2022'].eur);
}

Простыня:

Выход:

{ ES: 
   { '2021': { eur: 1, country: 'ES' },
     '2022': { eur: 1, country: 'ES' } },
  SE: 
   { '2021': { eur: 9.98, country: 'SE' },
     '2022': { eur: 10.01, country: 'SE' } } 
}

1

10.01

И, вероятно, вам вообще не нужно свойство «страна».

Спасибо большое! Это то, что я искал, работает как шарм, и я не могу в это поверить :'D

andres 22.03.2022 00:40

Я рад, если это работает. Было бы здорово, если бы вы приняли мой ответ.

Yuri Khristich 22.03.2022 00:44

Принято: D не знал этого, я здесь совсем новичок.

andres 22.03.2022 15:44

Другие вопросы по теме