Функция окрашивания ячеек с "плавающим" количеством переменных
Хочу сделать через функцию заливку произвольным цветом произвольное количество ячеек и/или диапазонов. В функцию вводится цвет и сами диапазоны. Со цветом проблем нет, но как сделать "плавающие" количество диапазонов(Как например у базовых функций "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 шт):
Это довольно странный вопрос, т.к. код показывает не то, что задается.
Предположим, что добывать цвета мы будем итератором
/**
*
* @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