Я пытаюсь установить значение для каждой ячейки отдельно во время выполнения цикла.
for (var i = 5; i <= lastRow; i++) { // Start from row 5
var pos = sheet.getRange([i], 1); // 1 == column A, A=1,B=2,C=3 etc.
var posValue = (pos.isPartOfMerge() ? pos.getMergedRanges()[0].getCell(1, 1) : pos).getValue(); // get value of marged cell
var animalColor = sheet.getRange([i], 9); // 9 == column I
if (posValue == 'Cat') {
animalColor.setValue('brown');
} else if (posValue == 'Dog') {
animalColor.setValue('black');
} else if {
animalColor.setValue('none');
}
}
Я хочу пойти от этого:
К этому:
Я пытался написать дополнительные операторы IF, но это было глупо, а код стал тяжелее.
Какова логика желаемого результата? Я вижу, что вам не нужен один и тот же цвет для всех рядов животных. Но откуда берется настоящий порядок?
@VLAZ см. изображение i.stack.imgur.com/CmMiT.png с желаемым результатом. Я не могу получить такой результат, просто } else {
@Barmar Я бы хотел, чтобы скрипт считывал значение в объединенной ячейке (пример «Собака»), а затем сценарий рядом с объединенными ячейками устанавливал желаемые значения. Из-за цикла он устанавливает только одно значение для всех ячеек.
Последнее условие, вероятно, должно быть else if (posValue == 'Bird')
Но откуда берутся желаемые значения? Почему собака white-black-red-grey
, а кошка brown-black-white-gray
?
@Barmar Я хотел бы вручную установить значения в коде, как я сделал с одним цветом animalColor.setValue('brown');
Создайте массив цветов для каждого животного. Затем вы можете получить следующее значение из соответствующего массива животных.
const colors = {
Dog: {
colors: ['white', 'black', 'red', 'grey'],
index: 0
},
Cat: {
colors: ['brown', 'black', 'white', 'gray'],
index: 0
},
Bird: {
colors: ['yellow', 'red', 'blue', 'purple'],
index: 0
}
};
for (var i = 5; i <= lastRow; i++) { // Start from row 5
var pos = sheet.getRange([i], 1); // 1 == column A, A=1,B=2,C=3 etc.
var posValue = (pos.isPartOfMerge() ? pos.getMergedRanges()[0].getCell(1, 1) : pos).getValue(); // get value of marged cell
var animalColor = sheet.getRange([i], 9); // 9 == column I
if (posValue in colors) {
animalColor.setValue(colors[posValue].colors[colors[posValue].index++]);
}
}
Только отсутствует ,
после второго массива и опечатка в color[colors[posValue].index++]);
должна быть colors[colors[posValue].index++]);
Вы можете использовать методы includes
, map
и setValues
для получения желаемого результата. Вы можете использовать сценарий ниже в качестве руководства.
const colors = {
"Cat": ["brown", "black", "white", "gray"],
"Dog": ["white", "black", "red", "gray"],
"Bird": ["yellow", "red", "blue", "purple"]
};
function transformTable() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // Get the active sheet
var range = sheet.getRange("A1:A"); // Get the range of the data
var values = range.getValues().flat().filter(x => x); // Get the values of the data
var animalsInData = Object.keys(colors);
var output = [];
values.map(x => (animalsInData.includes(x))? colors[x].map(y=>output.push([y])) : output.push([""]));
sheet.getRange(1,3,output.length,1).setValues(output); // edit the range accordingly
}
Обратите внимание, что я добавил snake
в качестве теста, чтобы увидеть, будет ли скрипт работать, даже если за пределами объекта colors
есть дополнительное животное.
метод setValues
} else if {
неправильный синтаксис. Либо добавьте условие дляif
, либо просто добавьте} else {
, если оно не должно иметь условия.