Парсинг данных в Google Sheets с объекта - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть тысячи строк данных в файле Google Sheets в столбце, который выглядит примерно так: [{"amountMax":49.99,"amountMin":49.99,"availability":"true","color":"Brown","currency":"USD","dateSeen":["2019-04-11T08:00:00Z"],"isSale":"false","offer":"Online only","sourceURLs":["https://www.walmart.com/ip/SadoTech-Model-CXR-Wireless-Doorbell-1-Remote-Button-2-Plugin-Receivers-Operating-500-feet-Range-50-Chimes-Batteries-Required-Receivers-Beige-Fixed-C/463989633"]}]

Я хотел бы иметь возможность вернуть максимальное значение, валюту, атрибуты цвета. Как я могу сделать это в Google Sheets. В идеале хотелось бы сделать что-то вроде возможности извлекать атрибуты данных, как обычно в javascript, как в этой ссылке здесь https://repl.it/@alexhoy / WetSlateblueDribbleware

Однако, похоже, это не так работать для меня при создании функции в script.google.com

Например, вот функция slugify, которая принимает входные данные (ячейку) и превращает их в slug / handle без необходимости зацикливания. В Google Sheets я могу затем вызвать = slugify (b2) и превратить это значение в форму слага

/**
* Converts value to slug
* @customfunction
*/
function slugify(value) {
  /*
   * Convert the the vs in a range of cells into slugs.
   * @customfunction
   */
  let slug = '';

  slug = value.substring(0, 100).toLowerCase();
  slug = slug.replace(/[^\w\s-]/g, '');
  slug = slug.replace(/\s+/g, '-');
  Logger.log(slug);

  return slug;
}

Я хочу сделать то же самое без циклического анализа данных объекта выше или объявления диапазона значений и что нет.

Любые предложения о том, как я могу сделать это простым способом, как показано выше, без необходимости объявления активной электронной таблицы, значений диапазона и циклов.

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

Следующий скрипт даст вам представление о том, как решить эту задачу.

Предполагается, что:

  • данные json, описанные в вашем вопросе, находятся в ячейке A2 .
  • максимальное значение будет вставлено в ячейку D2
  • валюта будет вставлено в ячейку E2
  • цвет будет вставлен в ячейку F2

Сценарий использует временные массивы для захвата значений и затем присваивает их 2-мерному массиву.

Если у вас много строк данных, вам потребуется создать al oop. Я предлагаю вам постепенно наращивать массивы и обновлять целевой диапазон только в конце l oop. Это даст вам наиболее эффективный результат.


function so6031098604() {

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet()
  var content = JSON.parse(sheet.getRange("A2").getValue());

  // temp arrar to capture the data
  var temparray = [];
  temparray.push(content[0]["amountMax"]);
  temparray.push(content[0]["currency"]);
  temparray.push(content[0]["color"]);

  // second array to accept the row data
  var arraydata =[];
  arraydata.push(temparray)

  // define the target range
  var targetrange = sheet.getRange(2, 4, 1, 3);
  // update with the arraydata
  targetrange.setValues(arraydata);

}
0 голосов
/ 07 марта 2020

Требуется пользовательская функция, которая будет возвращать определенные поля из массива JSON.

В следующем примере целевой ячейкой может быть отдельная ячейка или массив.

This Пример не использует формулу массива. Механизм использования формулы массива с пользовательской функцией может быть исследован здесь Пользовательская функция SHEETNAME не работает в Arrayformula .

Примечание: 30-секундная квота применяется к выполнению Пользовательская функция


/**
 * gets the MaxAmount, Current and Color from the data
 *
 * @param {cell reference or range} range The range to analyse.
 * @return amountMax,currency and  color
 * @customfunction
 */
function getJsonData(range) {

  //so6031098606
  // Test whether range is an array.
  if (range.map) {

  // if yes, then loop through the rows and build the row values
    var jsonLine = [];
    for (var i = 0; i < range.length; i++) {
      var jsonValues=[];
      var v = JSON.parse(range[i][0]);
      jsonValues.push(v.amountMax);
      jsonValues.push(v.currency);
      jsonValues.push(v.color);

      // aggregate the row values
      jsonLine.push(jsonValues); 
   } // end i

   return jsonLine;

 } else {

   // if no, then just return a single set of values
   var v = JSON.parse(range);
   var jsonValues = [];
   jsonValues.push(v.amountMax);
   jsonValues.push(v.currency);
   jsonValues.push(v.color);
   return [jsonValues];
 } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...