#google-apps-script #google-sheets
#google-apps-script #google-sheets
Вопрос:
В Google Sheets, используя Apps Script, у меня есть 3 листа, на которых я хочу взять ключи с листа 1 и скопировать на них строки с листа 2, чтобы для каждого уникального ключа заполнялось каждое значение с листа 2. Смотрите лист 3 в качестве примера вывода. Обратите внимание, что на листе 1 ключи отображаются только один раз, но мне нужно, чтобы ключи дублировались, чтобы соответствовать количеству строк на листе 2.
Есть идеи?
Лист 1: Содержит уникальные ключи
Лист 2: Содержит значения, которые я хотел умножить / дублировать
Лист 3: Содержит желаемый результат.
лист 1
лист 2
лист 3
Комментарии:
1. Покажите свой код на данный момент.
Ответ №1:
Вы можете прочитать столбцы «Ключ» и «Значения» и использовать значения для создания строк, доступных для записи, для листа 3. Приведенный ниже код демонстрирует простой подход к выполнению этого внутри 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);
}
Смотрите это для map
, это для forEach
, это для SpreadsheetApp
и это для sheet
.
Комментарии:
1. Блестяще! Это именно то, чего я хотел! Спасибо.
2. Я работаю над расширением предоставленного вами кода, чтобы включить дополнительные столбцы из листа 2. Например, я хочу включить столбцы 1 и 2 из листа 2, а не только столбец 1. Однако я нахожу, что это изменение не такое интуитивное, как я ожидал. Я добавил приведенный ниже код, затем расширил s3.gerRange до 3 столбцов. Однако это дублирует результаты. // прочитать столбец значений, [ [значение], [value], [value]… ] var v3 = s2.getRange(2, 1, s2.getLastRow() — 1, 3).getValues(); // сведите массив массивов в массив, [значение, value…] v3 = v3.map(функция(el) { возвращает el[1]; });
3. @bava Не задавайте больше вопросов в комментариях. Если достаточные исследования и эксперименты не решают возникшую у вас проблему, задайте новый конкретный вопрос, в котором можно должным образом передать вашу тяжелую работу. Задавая вопросы в комментариях, всегда создается впечатление, что вы сами не очень старались (даже если вы это делали).
Ответ №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);
}
Комментарии:
1. Идеально! Я слишком много думал об этом. То, как вы это сделали, намного проще.