Условное форматирование ячеек электронной таблицы

Я пытаюсь создать скрипт Google Apps, который позволит мне быстро определить, нужны ли дальнейшие действия, изменив цвет ячейки. В настоящее время я выполняю процесс аудита, в ходе которого я проверяю 5% продукта на наличие ошибок. Если обнаружено слишком много ошибок, мне нужно просмотреть 100% продукта.

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

  • Если a1 меньше или равно 50 и b1 меньше четырех цветов, ячейка c1 зеленого цвета.
  • Если a1 меньше или равно 50, а b1 больше, то четырехцветная ячейка c1 красного цвета
  • Если a1 больше или равно 50, а b1 меньше 4% от a1, тогда ячейка c1 окрашивается в зеленый цвет.
  • Если a1 больше или равно 50, а b1 больше 4% от a1, то ячейка c1 окрашивается в красный цвет.

Любая помощь приветствуется!


function onEdit(e) { 
  var ss = e.source.getActiveSheet(); 
  var r = e.source.getActiveRange(); 
  if (r.getRow() != 1 && ss.getName() == "Entry Form") { 
    Error_Count = ss.getRange(r.getRow(),3).getValue(); 
    rowRange = ss.getRange(r.getRow(),1,1,3);

    if (Error_Count < 3.8) {
      rowRange.setBackgroundColor("#FF0000"); }
    else if (Error_Count == 'N/A') {
      rowRange.setBackgroundColor("#ffffff"); }
    else if (Error_Count > 3.9) {
      rowRange.setBackgroundColor("#ffffff");
    }

person user3010364    schedule 19.11.2013    source источник
comment
Я обновил свой ответ, чтобы лучше понять, куда вы должны двигаться с этим кодом. Я также добавил комментарии, чтобы вы могли получить представление о том, что происходит. Однако ваши столбцы A-C в вашей электронной таблице не имеют числовых значений... поэтому я понятия не имею, как вы планируете проводить сравнения.   -  person Chris Cirefice    schedule 21.11.2013


Ответы (1)


Ну, вы упомянули «будущее расширение», но получение «a1», «b1» и «c1» конкретно не очень расширяемо.

Мое предложение будет следующим:

  1. Use the Sheet class to get "a1:c100" (columns a-c with 100 rows). Or maybe use getLastRow() of the Sheet class, and then use getRange(1, 1, lastRow, 3) so that you have columns a-c with all rows that have data in them (best idea in my opinion).
    • Now you have your Range
  2. Получите значения этого диапазона с помощью функции getValues. Это возвращает матрицу.
  3. Поскольку ваши значения находятся в матрице, a1 по сути будет values[0][0]. b1 будет values[0][1], а c1 будет values[0][2].
  4. Вы можете легко перебирать каждую «строку» значений, например:

    for (var i = 0; i < values.length; i ++) {
    // do your comparisons for each row.
    // row[0] is "a_rowNumber", row[1] is "b_rowNumber", etc.
    var row = values[i];
    
  5. Теперь вы можете делать свои сравнения (которые чисто математические, думаю, я оставлю их вам)

  6. Если сравнение типа:

    if (row[0] > 50 && row[1] < 4)
    

    оценивается как true, вы можете снова использовать функцию getRange(), например:

    getRange(i + 1, 3)
    

    Помните, что i — это строка, а 3 — это столбец c: добавьте 1 к строке, потому что ваш массив начинается с индекса 0, но фактические номера строк в электронной таблице (используемые getRange()) начинаются с 1.

  7. Когда у вас есть этот диапазон (на данный момент это одна ячейка), который вы хотите раскрасить в столбце c, используйте Range.setBackgroundColor(). На самом деле есть много способов установить цвет фона, используя RGB, шестнадцатеричные значения цвета или простые значения цвета, такие как «красный». Выбирайте!

Изменить. Вот пример того, как вы можете получить доступ к нужным данным и как их использовать:

function onEdit(e) {
  // Get the variable "sheet" so that we can get more ranges and set colors later
  var sheet = e.source.getActiveSheet();
  // Get the edited cell so we can look at the current row
  var cell = e.source.getActiveRange();
  // Get the current row (which is the same row where the cell was edited)
  var editedRow = cell.getRow();

  if (cell.getRow() != 1 && sheet.getName() == "Entry Form") {
    // Get the actual values in that row (the ones we want to use, which are columns A-C)
    var rowValues = sheet.getRange(editedRow, 1, 1, 3).getValues();

    // Your first condition is met: get the current row, column 3 (current row, C), set background color
    if (rowValues[0] <= 50 && rowValues[1] < 4) sheet.getRange(editedRow, 3).setBackgroundColor("green");
    // Your second condition is met: get the current row, column 3 (current row, C), set background color
    else if (rowValues[0] <= 50 && rowValues[1] > 4) sheet.getRange(editedRow, 3).setBackgroundColor("green");
    // Your third condition is met: get the current row, column 3 (current row, C), set background color
    else if (rowValues[0] >= 50 && (rowValues[1] < .04 * rowValues[0])) sheet.getRange(editedRow, 3).setBackgroundColor("green");
    // Your fourth condition is met: get the current row, column 3 (current row, C), set background color
    else if (rowValues[0] >= 50 && (rowValues[1] >= .04 * rowValues[0])) sheet.getRange(editedRow, 3).setBackgroundColor("green");
  }
}
person Chris Cirefice    schedule 19.11.2013
comment
Так что я думаю, что это шаг в правильном направлении, но я думаю, что я недостаточно ясно выразился. Вот пример документа Google. не изменяется, и количество ошибок изменяется на основе записей, добавленных в b4-e. Я пытался манипулировать тем, что вы предложили, но безуспешно. Я ценю вашу помощь заранее. - person user3010364; 20.11.2013
comment
Если вы пытались использовать шаги, которые я вам дал, пожалуйста, опубликуйте код, чтобы я мог помочь вам найти ошибку. Logger и / или Execution Transcript из редактора сценариев также могут помочь :) - person Chris Cirefice; 20.11.2013
comment
Я добавил то, что у меня есть, но я продолжаю получать синтаксическую ошибку. ‹!-- язык: lang-none --› - person user3010364; 20.11.2013
comment
-function onEdit(e) { -if (e) { var ss = e.source.getActiveSheet(); -var r = e.source.getActiveRange(); -if (r.getRow() != 1 && ss.getName() == Форма ввода) { -Error_Count = ss.getRange(r.getRow(),38).getValue(); -rowRange = ss.getRange(r.getRow(),1,1,3); if (Error_Count ‹ 3.8) { -rowRange.setBackgroundColor(#FF0000); -} else if (Error_Count == 'N/A') { rowRange.setBackgroundColor(#ffffff); } else if (Error_Count › 3.9) { rowRange.setBackgroundColor(#ffffff); - person user3010364; 20.11.2013
comment
Лучше всего обновить свой вопрос с помощью кода. Не публикуйте что-то подобное в комментариях, потому что комментарии не форматируются как сообщения. Я немного посмотрю на это... - person Chris Cirefice; 20.11.2013
comment
@sergeinsas Спасибо, я понятия не имею, откуда я взял 5 и 6. Потеря зрения, я полагаю! - person Chris Cirefice; 21.11.2013
comment
Это так здорово, спасибо, Крис. Теперь это имеет гораздо больше смысла, и ваша помощь приветствуется! - person user3010364; 21.11.2013
comment
Я рад, что смог помочь :) - person Chris Cirefice; 22.11.2013