Вывести все значения из массива в 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 - одномерный массив числовых значений

Пробовал разные варианты:

  1. sheet.getRange(arrResult[i][1]).setValue(arrPool3); - выводит только первый элемент массива arrPool3 во все ячейки

  2. sheet.getRange(arrResult[i][1]).setValues(arrPool3[j]); - не выводит ничего

  3. sheet.getRange(arrResult[i][1]).setValues(arrPool3); - не выводит ничего

  4. sheet.getRange(arrResult[i][1]).setValue(arrPool3[j]); - выводит только последний элемент массива arrPool3 во все ячейки

Как сделать так, чтобы во все нужные ячейки (которые подходят под условие) выводились все элементы массива arrPool3 по порядку?

Надеюсь на помощь. Заранее благодарю!


Ответы (1 шт):

Автор решения: contributorpw

ОК. Вам нужен итератор, чтобы не беспокоиться о порядке следующего индекса массива 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_, то получим заполняемый сколько угодно результат

введите сюда описание изображения

→ Ссылка