Автоматическая раскраска электронных таблиц Google [закрыто]

Я ищу способ автоматического изменения цвета минимальной ячейки в строке в электронной таблице Google docs.

Итак, для таблицы типа

1 | 2 | 3
4 | 2 | 1
2 | 1 | 6

он будет окрашивать все ячейки с '1' в них.

2 ответов


в выпадающем меню Формат->Условное форматирование...

затем установите свои правила и свой цвет. Можно выбрать несколько ячеек и сделать то же самое.

Edit:

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


трюк состоит в том, чтобы нажать на триггер события onEdit и добавить некоторый интеллект

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

вот полный скрипт (проверено и работает):

function onEdit() {
  var s = SpreadsheetApp.getActiveSheet();
  var r = s.getActiveRange();
  var row = r.getRow();
  var cols = s.getDataRange().getNumColumns();

  // crate a range for the row using getRange(row, column, numRows, numColumns)
  var rowRange = s.getRange(row, 1, 1, cols);
  var rowValues = rowRange.getValues();

  // check all the values in the row
  var val = 999;
  for(var i = 0; i < cols; i++) {
    if(val > rowValues[0][i] && rowValues[0][i] !== "") {
      val = rowValues[0][i];
    }
  }
  for(var j = 0; j < cols; j++) {
    if(rowValues[0][j] === val) {
      s.getRange(row,(j + 1)).setFontColor("blue");
    } else {
      s.getRange(row,(j + 1)).setFontColor("black");
    }
  }
}

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

function onEdit()

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

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

получить номер строки:

var r = s.getActiveRange();
  var row = r.getRow();

здесь очень толковые. Активный диапазон-это редактируемая ячейка.

захватить количество столбцов:

var cols = s.getDataRange().getNumColumns();

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

Далее вам нужно построить диапазон данных содержит данные для рассматриваемой строки:

var rowRange = s.getRange(row, 1, 1, cols);

прочитайте комментарии в коде, чтобы узнать, какими должны быть значения.

затем мы кэшируем результаты для тестирования значений:

var rowRange = s.getRange(row, 1, 1, cols);

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

следующие две части, где происходит вся магия.

во-первых, мы делаем проход через все ячейки строки, чтобы найти минимальное значение.

  var val = 999;
  for(var i = 0; i < cols; i++) {
    if(val > rowValues[0][i] && rowValues[0][i] !== "") {
      val = rowValues[0][i];
    }
  }

Я установил потолок по умолчанию 999 Для простоты. это может быть изменение на более подходящее значение. Фокус в том, чтобы проверить значение против текущего минимума. Если он ниже, отметьте новое низкое значение.

вы смогли получить легкими путем отмечать клетку number с наименьшим значением и его явно, но я хотел охватить случаи, когда несколько ячеек имеют наименьшее значение.

обработка нескольких ячеек, содержащих минимум требует второго прохода:

for(var j = 0; j < cols; j++) {
  if(rowValues[0][j] === val) {
    s.getRange(row,(j + 1)).setFontColor("blue");
  } else {
    s.getRange(row,(j + 1)).setFontColor("black");
  }
}

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


это примерно подводит итог. Немного сложно привыкнуть к тому, как Google Apps Scripting имеет дело со ссылками на электронные таблицы и ячейки данных, но нет ничего, что не могут сделать документы.

Я ссылка в таблицу, которую я использовал для написания / тестирования этого кода. Не стесняйтесь попробовать.