Несколько / повторяющиеся строки по уникальному ключу

В Google Sheets, используя скрипт приложений, у меня есть 3 листа, на которых я хочу взять ключи с листа 1 и дублировать строки с листа 2 против них, чтобы для каждого уникального ключа заполнялось каждое значение из листа 2. См. Лист 3 в качестве примера выходных данных. Обратите внимание, как на листе 1 ключи появляются только один раз, но мне нужно, чтобы ключи дублировались, чтобы соответствовать количеству строк из листа 2.

Любые идеи?

Лист 1: содержит уникальные ключи

Лист 2: содержит значения, которые я хотел умножить / продублировать.

Лист 3: содержит желаемый результат.

лист 1

лист 2

лист 3


person Bava    schedule 11.03.2019    source источник
comment
Покажи пока свой код.   -  person TheMaster    schedule 11.03.2019


Ответы (2)


Для 2 столбцов из Sheet2 используйте это -

function test() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s1 = ss.getSheetByName('Sheet1');
  var s2 = ss.getSheetByName('Sheet2');
  var s3 = ss.getSheetByName('Sheet3');

  // read Key column, [ [value], [value], [value]... ]
  var v1 = s1.getRange(2, 1, s1.getLastRow() - 1, 1).getValues();
  // flatten array of arrays into array, [value, value...]
  v1 = v1.map(function(el) {
    return el[0];
  });
  // read 2 columns, [ [value1, value2], [value1, value2], [value1, value2]... ]
  var v2 = s2.getRange(2, 1, s2.getLastRow() - 1, 2).getValues();

  // hold rows to insert, will become [row, row]
  var result = [];

  v1.forEach(function(k) {
    v2.forEach(function(v) {
      // create row as [k, v1, v2]
      // change needed here if Sheet3 row has to be combo of Sheet2 cols
      result.push([k].concat(v));
    });
  });

  // get range of required length and insert values into sheet
  // 2, which row to start, 1, which col to start, result.length, how many rows, 2, how many cols
  s3.getRange(2, 1, result.length, 3).setValues(result);
}
person ra89fi    schedule 13.03.2019
comment
Идеально! Я слишком много думал об этом. Гораздо проще, как вы это сделали. - person Bava; 13.03.2019

Вы можете прочитать столбцы «Ключ» и «Значения» и использовать их для создания строк с возможностью записи для Sheet3. В приведенном ниже коде показан простой способ сделать это внутри test функции, которую вы можете скопировать / вставить и запустить.

function test() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s1 = ss.getSheetByName('Sheet1');
  var s2 = ss.getSheetByName('Sheet2');
  var s3 = ss.getSheetByName('Sheet3');

  // read Key column, [ [value], [value], [value]... ]
  var v1 = s1.getRange(2, 1, s1.getLastRow() - 1, 1).getValues();
  // flatten array of arrays into array, [value, value...]
  v1 = v1.map(function(el) {
    return el[0];
  });
  // read Values column, [ [value], [value], [value]... ]
  var v2 = s2.getRange(2, 1, s2.getLastRow() - 1, 1).getValues();
  // flatten array of arrays into array, [value, value...]
  v2 = v2.map(function(el) {
    return el[0];
  });

  // hold rows to insert, will become [row, row]
  var result = [];

  v1.forEach(function(k) {
    v2.forEach(function(v) {
      // create row as [k, v]
      result.push([k, v]);
    });
  });

  // get range of required length and insert values into sheet
  // 2, which row to start, 1, which col to start, result.length, how many rows, 2, how many cols
  s3.getRange(2, 1, result.length, 2).setValues(result);
}

См. this для map, это для forEach, this для SpreadsheetApp и это для sheet.

person ra89fi    schedule 11.03.2019
comment
Блестяще! Это именно то, что я хотел! Спасибо. - person Bava; 12.03.2019
comment
Я работаю над расширением предоставленного вами кода, чтобы включить дополнительные столбцы из листа 2. Например, я хочу включить столбцы 1 и 2 из листа 2, а не только столбец 1. Однако я считаю, что это изменение не так интуитивно понятно, как Я ожидал. Я добавил приведенный ниже код, а затем расширил s3.gerRange до 3 столбцов. Однако это дублирует результаты. // чтение столбца значений, [[значение], [значение], [значение] ...] var v3 = s2.getRange (2, 1, s2.getLastRow () - 1, 3) .getValues ​​(); // объединить массив массивов в массив, [значение, значение ...] v3 = v3.map (function (el) {return el [1];}); - person Bava; 13.03.2019
comment
@bava Не задавайте больше вопросов в комментариях. Если достаточные исследования и эксперименты не помогли решить возникшую у вас проблему, задайте новый, конкретный вопрос, в котором можно должным образом передать ваш тяжелый труд. Когда вы задаете вопрос в комментариях, всегда создается впечатление, что вы сами не очень старались (даже если и пытались). - person tehhowch; 13.03.2019