Функция окрашивания ячеек с "плавающим" количеством переменных

Хочу сделать через функцию заливку произвольным цветом произвольное количество ячеек и/или диапазонов. В функцию вводится цвет и сами диапазоны. Со цветом проблем нет, но как сделать "плавающие" количество диапазонов(Как например у базовых функций "IFS" и "SWITCH")? Сам информацию не нашел, а вариант с кучей переменных не очень подходит и просто звучит.

// Текущая функция выглядит сейчас так: 

function zero(color, range1, range2, range3) {
 var sheet1 = sa.getActiveSpreadsheet().getSheetByName("List");
 var range0 = sheet1.getRangeList([`${range1}`, `${range2}`, `${range3}`]);
 range0.setBackground(`${color}`);}

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

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

Это довольно странный вопрос, т.к. код показывает не то, что задается.

Предположим, что добывать цвета мы будем итератором

/**
 *
 * @param {any[]} arr
 * @param {callback} extractor
 * @returns {@yields}
 */
const pickFromIterator_ = (arr, extractor) =>
  (function* () {
    let index = 0;
    while (true) {
      index = index >= arr.length ? 0 : index;
      yield extractor ? extractor(arr, index) : arr[index++];
    }
  })();

Обратите внимание, что мы можем переопределить порядок вывода значений с помощью extractor. Это понадобится для рандомного выбора.

Покраску всего сведем к перебору всех диапазонов

/**
 *
 * @param {string[]} colors
 * @param {string[]} rangeNames
 * @param {@yields} picker
 * @param {globalThis.SpreadsheetApp.Sheet} sheet
 */
function colorRanges_(
  colors,
  rangeNames,
  picker = pickFromIterator_(colors),
  sheet = SpreadsheetApp.getActiveSheet()
) {
  rangeNames.forEach((rangeName) =>
    sheet.getRange(rangeName).setBackground(picker.next().value)
  );
}

Чтобы запустить пример нужно реализовать вызов функции colorRanges_

/**
 * Runs the sample
 */
function run() {
  SpreadsheetApp.getActiveSheet().clearFormats();

  const colors = ['red', 'yellow', 'green'];

  const picker = pickFromIterator_(colors);
  colorRanges_(colors, ['A:A', 'C:C', 'D:D', 'E:E'], picker);

  const picker2 = pickFromIterator_(
    colors,
    (arr) => arr[Math.floor(Math.random() * arr.length)]
  );
  colorRanges_(colors, ['F:F', 'G:G', 'I:I'], picker2);

  // Continue with picker
  colorRanges_(colors, ['J:J', 'K:K', 'L:L', 'M:M'], picker);

  // Default
  colorRanges_(colors, ['N:N', 'O:O']);
}

Обратите внимание

  • следующие две колонки будут покрашены рандомно на основании значений randomExtractor
  • количество диапазонов не зависит от количества цветов задавать можно любое количество большее чем ничего.
  • После комментария // Continue with picker програма продолжает использовать текущий итератор, а не начинает новый как после // Default. введите сюда описание изображения

Таблица с кодом https://docs.google.com/spreadsheets/d/1VwM_FpwspSedrcacAdv1P73IwOHC45X15SBNftkt2TY/edit?usp=sharing

→ Ссылка