Скрипт для изменения цвета строки, когда ячейка меняет текст - PullRequest
52 голосов
/ 13 сентября 2010

У меня есть электронная таблица Google, где я храню список ошибок, и всякий раз, когда я исправляю ошибку, я меняю статус с «Не начато» на «Завершено».Я хочу написать скрипт для электронной таблицы Документов Google, чтобы при каждом изменении статуса «Завершено» вся строка выделялась определенным цветом.

Я уже знаю, что в таблице Google уже есть «изменить цветtext ", но эта функция изменяет только цвет ячейки и не меняет цвет всей строки.

Ответы [ 5 ]

55 голосов
/ 05 октября 2010
//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;
    } 
  }
}
41 голосов
/ 10 апреля 2014

Понимаю, что это старый поток, но после просмотра множества подобных сценариев я заметил, что вы можете сделать это, просто используя условное форматирование.

Предполагая, что «Состояние» было столбцом D:

Выделите ячейки> щелкните правой кнопкой мыши> условное форматирование. Выберите «Custom Formula Is» и установите формулу как

=RegExMatch($D2,"Complete")

или

=OR(RegExMatch($D2,"Complete"),RegExMatch($D2,"complete"))

Редактировать (спасибо Фредерику Шёнингу)

=RegExMatch($D2,"(?i)Complete"), затем установите диапазон, чтобы охватить все строки, например, A2:Z10. Это не зависит от регистра, поэтому будет соответствовать complete, Complete или CoMpLeTe.

Затем вы можете добавить другие правила для "Не начато" и т. Д. $ Очень важен. Это обозначает абсолютную ссылку. Без этого ячейка A2 будет смотреть на D2, а B2 будет смотреть на E2, так что вы получите непоследовательное форматирование в любой строке.

28 голосов
/ 06 декабря 2012

Я использовал скрипт GENEGC, но нашел его довольно медленным.

Это медленно, потому что сканирует весь лист при каждом редактировании.

Так что я написал способ быстрее и чище для себя и хотел поделиться им.

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");
            }   
        }
    }
}
7 голосов
/ 12 ноября 2014

user2532030 - правильный и самый простой ответ.

Я просто хочу добавить, что в случае, когда значение определяющей ячейки не подходит для соответствия RegEx, я обнаружил, что следующий синтаксис работает так же, только с числовыми значениями, отношения и т.д. :

[Custom formula is]
=$B$2:$B = "Complete"
Range: A2:Z1000

Если столбец 2 любой строки (строка 2 в сценарии, но начальная $ означает, что это может быть любая строка) в текстовом формате равен «Завершено», выполните X для диапазона всего листа (исключая строку заголовка (т.е. начиная с А2 вместо А1)).

Но, очевидно, этот метод допускает также числовые операции (даже если это не относится к вопросу оп), например:

=$B$2:$B > $C$2:$C

Итак, делайте вещи, если значение col B в какой-либо строке выше значения col C.

И последнее: Скорее всего, это относится только ко мне, но я был настолько глуп, что неоднократно забывал выбрать В выпадающем списке пользовательская формула , а в Текст содержит . Очевидно, это не будет плавать ...

4 голосов
/ 06 июня 2017

Я думаю, что проще (хотя и без сценария), предполагая, что столбец Status равен ColumnS.

Выберите ColumnS и удалите форматирование из него.Выберите весь диапазон для форматирования и выберите Формат, Условное форматирование ..., Форматировать ячейки, если ... Custom formula is и:

=and($S1<>"",search("Complete",$S1)>0)

с выбранной заливкой и Готово .

Это не чувствительно к регистру (измените search на find для этого) и выделит строку, где ColumnS содержит подобные Now complete (хотя также Not yet complete).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...