46

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

Я уже знаю, что Google Spreadsheet уже «меняет цвет по тексту», но эта функция меняет цвет ячейки и не меняет цвет всей строки.

ответ

48
//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; 
    } 
    } 
} 
+11

Как вы сообщаете Документам Google о выполнении этой функции при изменении текста? – Kenci

+3

@Kenci: https://developers.google.com/apps-script/guide_events –

+5

@genegc Вы могли бы добавить комментарии к своему андерсе? Некоторым людям могут потребоваться некоторые рекомендации относительно того, что делать с кодом, который вы опубликовали. – gen

25

Я использовал сценарий 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"); 
      } 
     } 
    } 
} 
+1

Работал очень хорошо! –

40

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

Предполагая, "Статус" была колонка D:

Выделите ячейки> правой кнопкой мыши> условное форматирование. Выберите "Ваша формула" и установить формулу

=RegExMatch($D2,"Complete")

или

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

Edit (благодаря Фредерику Schöning)

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

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

+4

Примечание. Используя самую последнюю версию документов Google, ответ пользователя2532030 является самым легким ответом на использование. В моем случае я хотел выделить строку, основанную на ячейке, которая является «Y». Я выделил верхнюю строку, скорректированную по правому клику. Установите «Custom Formula Is» = = RegExMatch ($ G1, «Y»), range = 1: 1000. Это отсортировало весь лист. – HockeyJ

+0

Удобное решение. Thx :) –

+1

это должно быть отмечено как правильный ответ – kilianc

6

Ответ пользователя2532030 - правильный и самый простой ответ.

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

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

Если в колонке 2 из любой строки (строка 2 в сценарии, но ведущих $ средств, это может быть какой-либо строки) текстуально равно «Complete», сделать X для диапазона всей поверхности листа (за исключением (например, начиная с A2 вместо A1)).

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

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

Таким образом, делать вещи, если значение Col B в любой строке выше значения col C.

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

1

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

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

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

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

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

Смежные вопросы