Как автоматически отформатировать данные для создания древовидной карты в Google Sheets? - PullRequest
0 голосов
/ 15 февраля 2019

Я хочу создать древовидную карту из динамических данных в электронных таблицах Google.До сих пор мне удалось получить таблицу в формате, который может использовать Excel, но я не знаю, как преобразовать эту таблицу в таблицу, которую лист Google может использовать для создания этой древовидной карты

Excel может использовать этоданные.Не Google лист.

Мои данные выглядят так:

Categories  Item    Value
__________  ______  _____
category_1  item_1  5
category_1  item_2  20
category_1  item_3  1
category_2  item_4  0
category_2  item_5  5
category_2  item_6  18
category_3  item_7  16
category_4  item_8  7
category_4  item_9  16

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

Item        Parent      Value
__________  __________  _____
Categories              88
category_1  Categories  26
item_1      category_1  5
item_2      category_1  20
item_3      category_1  1
category_2  Categories  23
item_4      category_2  0
item_5      category_2  5
item_6      category_2  18
category_3  Categories  16
item_7      category_3  16
category_4  Categories  23
item_8      category_4  7
item_9      category_4  16

Я не нашел способа сделать это еще и задавался вопросом, сталкивался ли кто-нибудь с той же проблемой.

1 Ответ

0 голосов
/ 15 февраля 2019

Вероятно, вы можете использовать эту простую функцию сценария в качестве примера:

function makeTree() {
  var srcRange = SpreadsheetApp.getActiveSheet().getRange('A2:C10'),
      tree = {'.Categories': 0}, key;

  // Fill tree object with source data
  srcRange.getValues().forEach(function(rowValues) {
    // Add row value to the root
    tree['.Categories'] += rowValues[2];
    // Add it to "Category" level
    key = 'Categories.' + rowValues[0];
    if (tree[key] == undefined) {
      tree[key] = rowValues[2];
    } else {
      tree[key] += rowValues[2];
    }
    // Add it to "Item" level too
    key = rowValues[0] + '.' + rowValues[1];
    if (tree[key] == undefined) {
      tree[key] = rowValues[2];
    } else {
      tree[key] += rowValues[2];
    }
  });

  // Format tree rows for output
  var values = [];
  for (key in tree) {
    var subKeys = key.split('.');
    values.push([subKeys[1], subKeys[0], tree[key]]);
  }

  // Fill target data rows 
  var targetRange = srcRange.offset(0, 4, values.length);
  targetRange.setValues(values);
}

Здесь мы собираем все данные в один объект JS, используя составные строковые ключи с разделителем точек.Готовый объект преобразуется в 2D-массив перед заполнением целевого диапазона.В результате мы имеем оба диапазона на одном листе:

enter image description here

...