Вывести все значения из массива в Google Sheet
Мне необходимо выводить все значения из массива arrPool3 по порядку в заранее заданный диапазон ячеек (второй столбец массива arrResult) при соблюдении определённых условий (в первом столбце массива arrResult).
Часть кода:
for (var i = 0; i < arrResult.length; i++) {
if (sheet.getRange(arrResult[i][0]).getValue() == "AAA") {
for (var j = 0; j < arrPool3.length; j++) {
sheet.getRange(arrResult[i][1]).setValue(arrPool3);
}
}
}
arrResult - двумерный массив (1-ый столбец - текстовые значения, 2-ой столбец - изначально пустой, для вывода числовых значений)
arrPool3 - одномерный массив числовых значений
Пробовал разные варианты:
sheet.getRange(arrResult[i][1]).setValue(arrPool3);- выводит только первый элемент массива arrPool3 во все ячейкиsheet.getRange(arrResult[i][1]).setValues(arrPool3[j]);- не выводит ничегоsheet.getRange(arrResult[i][1]).setValues(arrPool3);- не выводит ничегоsheet.getRange(arrResult[i][1]).setValue(arrPool3[j]);- выводит только последний элемент массива arrPool3 во все ячейки
Как сделать так, чтобы во все нужные ячейки (которые подходят под условие) выводились все элементы массива arrPool3 по порядку?
Надеюсь на помощь. Заранее благодарю!
Ответы (1 шт):
ОК. Вам нужен итератор, чтобы не беспокоиться о порядке следующего индекса массива arrPool3.
Положим, что у нас есть такой итератор
const poolSimpleIterator_ = function* (pool) {
let i = 0;
while (true)
yield pool[i++];
}
Применим его для наших данных в основной функции
function myFunction() {
const sheet = SpreadsheetApp.getActiveSheet();
const arrResultRange = sheet.getRange('E5:F');
const arrPool3Range = sheet.getRange('C5:C6');
const arrPool3 = arrPool3Range.getValues()
.map(row => row[0]);
const arrPool3Iterator = poolSimpleIterator_(arrPool3);
const newData = arrResultRange.getValues()
.map(row => {
if (row[0] === 'AAA')
row[1] = arrPool3Iterator.next().value;
return row;
});
arrResultRange.setValues(newData);
}
Обратите внимание, что 3я строка "AAA" не заполнена. Чтобы исключить такие пробелы, мы должны построить "бесконечный итератор"
const poolInfinityIterator_ = function* (pool) {
let i = 0;
while (true) {
yield pool[i++];
if (i === pool.length) i = 0;
}
}
Если мы применим его в основной функции вместо poolSimpleIterator_, то получим заполняемый сколько угодно результат

