Скрипт для изменения цвета строки, когда ячейка меняет текст
У меня есть электронная таблица Google, где я храню список ошибок, и всякий раз, когда я исправляю ошибку, я меняю статус с "Не начато" на "Завершено". Я хочу написать скрипт для электронной таблицы Документов Google, чтобы при каждом изменении статуса на "Завершено" вся строка выделялась определенным цветом.
Я уже знаю, что в электронной таблице Google уже есть "изменить цвет текста", но эта функция изменяет только цвет ячейки и не меняет цвет всей строки.
Ответы
Ответ 1
//Sets the row color depending on the value in the "Status" column.
function setRowColors() {
var range = SpreadsheetApp.getActiveSheet().getDataRange();
var statusColumnOffset = getStatusColumnOffset();
for (var i = range.getRow(); i < range.getLastRow(); i++) {
rowRange = range.offset(i, 0, 1);
status = rowRange.offset(0, statusColumnOffset).getValue();
if (status == 'Completed') {
rowRange.setBackgroundColor("#99CC99");
} else if (status == 'In Progress') {
rowRange.setBackgroundColor("#FFDD88");
} else if (status == 'Not Started') {
rowRange.setBackgroundColor("#CC6666");
}
}
}
//Returns the offset value of the column titled "Status"
//(eg, if the 7th column is labeled "Status", this function returns 6)
function getStatusColumnOffset() {
lastColumn = SpreadsheetApp.getActiveSheet().getLastColumn();
var range = SpreadsheetApp.getActiveSheet().getRange(1,1,1,lastColumn);
for (var i = 0; i < range.getLastColumn(); i++) {
if (range.offset(0, i, 1, 1).getValue() == "Status") {
return i;
}
}
}
Ответ 2
Реализуйте это старый поток, но, увидев множество сценариев, подобных этому, я заметил, что вы можете сделать это, просто используя условное форматирование.
Предполагая, что "Состояние" - столбец D:
Выделите ячейки > щелкните правой кнопкой мыши > условное форматирование.
Выберите "Custom Formula Is" и установите формулу как
=RegExMatch($D2,"Complete")
или
=OR(RegExMatch($D2,"Complete"),RegExMatch($D2,"complete"))
Изменить (спасибо Фредерику Шёнину)
=RegExMatch($D2,"(?i)Complete")
затем установите диапазон для охвата всех строк, например. A2:Z10
. Это регистр нечувствителен, поэтому он будет соответствовать полному, Complete или CoMpLeTe.
Затем вы можете добавить другие правила для "Не начатых" и т.д. Очень важно значение $. Он обозначает абсолютную ссылку. Без него ячейка A2 будет смотреть на D2, но B2 будет смотреть на E2, так что вы получите несогласованное форматирование в любой строке.
Ответ 3
Я использовал GENEGC script, но я нашел его довольно медленным.
Это медленно, потому что он сканирует весь лист на каждом редактировании.
Итак, я написал для себя более быстрый и более чистый метод, и я хотел бы поделиться им.
function onEdit(e) {
if (e) {
var ss = e.source.getActiveSheet();
var r = e.source.getActiveRange();
// If you want to be specific
// do not work in first row
// do not work in other sheets except "MySheet"
if (r.getRow() != 1 && ss.getName() == "MySheet") {
// E.g. status column is 2nd (B)
status = ss.getRange(r.getRow(), 2).getValue();
// Specify the range with which You want to highlight
// with some reading of API you can easily modify the range selection properties
// (e.g. to automatically select all columns)
rowRange = ss.getRange(r.getRow(),1,1,19);
// This changes font color
if (status == 'YES') {
rowRange.setFontColor("#999999");
} else if (status == 'N/A') {
rowRange.setFontColor("#999999");
// DEFAULT
} else if (status == '') {
rowRange.setFontColor("#000000");
}
}
}
}
Ответ 4
user2532030 Ответ - правильный и самый простой ответ.
Я просто хочу добавить, что в случае, когда значение определяющей ячейки не подходит для соответствия RegEx, я нашел, что следующий синтаксис работает одинаково, только с численными значениями, отношениями et.c.
[Custom formula is]
=$B$2:$B = "Complete"
Range: A2:Z1000
Если столбец 2 любой строки (строка 2 в script, но ведущее значение $означает, что это может быть любая строка), текстовое значение равно "Завершить", сделайте X для диапазона всего листа (исключая строку заголовка (т.е. начиная с A2 вместо A1)).
Но, очевидно, этот метод позволяет также для числовых операций (хотя это не относится к задаче op), например:
=$B$2:$B > $C$2:$C
Итак, делайте что-нибудь, если значение col B в любой строке больше значения col C..
Последнее:
Скорее всего, это относится только ко мне, но я был достаточно глуп, чтобы многократно забывать, что пользовательская формула находится в раскрывающемся списке, оставляя его в тексте. Очевидно, что это не будет плавать...
Ответ 5
Я думаю, что проще (хотя без script), если столбец Status
равен ColumnS.
Выберите ColumnS и очистите от него форматирование. Выберите весь диапазон для форматирования и форматирование, Условное форматирование..., Форматировать ячейки, если... Custom formula is
и:
=and($S1<>"",search("Complete",$S1)>0)
с выбором заливки и Done.
Это не чувствительно к регистру (измените search
на find
для этого) и выделите строку, в которой ColumnS содержит символы Now complete
(хотя также Not yet complete
).