Я пытаюсь выделить строку в таблице на основе соответствующего ключевого слова. Однако мои попытки установить цвет фона моего диапазона ячеек не дали никаких цветов. Я использовал регистраторы внутри оператора if/else, и все они работали, поэтому я думаю, что я как-то делаю неправильно.
function statusHighlighter(){
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetName = ss.getActiveSheet();
var sheetValues = ss.getDataRange().getValues();
sheetValues.forEach(function(row, index) {
var acctStatus = row[7];
var highlightRange = sheetName.getRange(index+1, 1, 1, sheetName.getLastColumn());
if (acctStatus === "Kept"){
highlightRange.setBackgroundColor('##fffec4');
Logger.log(acctStatus + " " + index);
} else if (acctStatus === "Suspended"){
highlightRange.setBackground('##cf4a4a');
} else if (acctStatus === "Deleted"){
highlightRange.setBackground('##6c75ad');
}
});
}
В вашем коде есть одна проблема и несколько оптимизаций, которые я хотел бы предложить.
Шестнадцатеричные коды цветов должны содержать только один #
, но вы используете два ##
.
Вы многократно используете setBackground , но вместо этого вы можете создать массив с цветами внутри цикла forEach
, а затем использовать setBackgrounds , чтобы установить цвета за один раз. Взгляните на лучшие практики, чтобы понять, почему.
Поскольку вас интересует конкретный столбец, имеет смысл рассмотреть только один столбец вместо полного dataRange
. В следующем скрипте acctStatusVals
учитывает только столбец 8
. Я выбираю 8
, потому что в вашем коде вы используете индекс массива для 7
, который эквивалентен для столбца 8
. Будьте осторожны с этим. В моем коде 8
означает столбец H
. Отрегулируйте это в соответствии с вашими потребностями. Чтобы преобразовать 2D-массив в 1D, поскольку мы используем один столбец, вы можете использовать flat.
Я использую следующее выражение: Array(lastCol).fill('#6c75ad')
создать массив из lastCol
количества элементов (последний столбец с содержимым ) и заполнить одним и тем же значением, потому что цель состоит в том, чтобы окрасить всю строку одним и тем же значением цвета. .
Будьте осторожны с активным листом. Убедитесь, что вы выбрали правильный лист, прежде чем запускать этот код. Я бы посоветовал вам использовать ss.getSheetByName('Sheet1');
, но я оставлю это как комментарий, так как этот шаг не является обязательным.
function statusHighlighter(){
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheetName = ss.getActiveSheet();
// const sheetName = ss.getSheetByName('Sheet1'); // change to the name of your sheet
const lastRow = sheetName.getLastRow();
const lastCol = sheetName.getLastColumn();
const acctStatusVals = sheetName.getRange(1,8,lastRow).getValues().flat();
const colors = [];
acctStatusVals.forEach(acctStatus=>{
if (acctStatus === "Kept"){
colors.push(Array(lastCol).fill('#fffec4'));
} else if (acctStatus === "Suspended"){
colors.push(Array(lastCol).fill('#cf4a4a'));
} else if (acctStatus === "Deleted"){
colors.push(Array(lastCol).fill('#6c75ad'));
}
});
sheetName.getRange(1, 1, lastRow, lastCol).setBackgrounds(colors);
}
Лист, используемый для вышеуказанного скрипта:
Спасибо за этот ответ, было очень полезно увидеть лучшие практики кодирования в действии. Единственное изменение, которое я должен был сделать, это настроить lastRow на sheetName.getLastRow() - 1 и подтолкнуть sheetName.getRange(2, 1, lastRow, lastCol) для настройки строки заголовка. Еще раз спасибо за помощь!