Сравнение ячейки с именованным диапазоном для условного форматирования - PullRequest
1 голос
/ 29 мая 2019

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

Я создал листы с именами каждого из датчиков (например, «32022»), и каждый из этих листов представляет собой матрицу из 26 столбцов даты, все часы с 00:00 до 23:00 и Функция WEEKDAY () для извлечения дня недели из даты.

На отдельном листе («Ежедневное использование») я вручную создал 10 различных матриц среднесуточного использования по часам для каждого датчика, причем в столбце A указан день недели (по названию), а в следующих 24 столбцах все часы дня Каждая из этих матриц была преобразована в именованный диапазон, называемый "mediumusage_32022".

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

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

  var currentsheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("32033");
  var usagerange = SpreadsheetApp.getActiveSpreadsheet().getRangeByName('averageusage_32033');

  //how many rows there are in the sheet
  var firstcolumn = currentsheet.getRange("A1:A").getValues();
  var bottomrow = firstcolumn.filter(String).length; 

  //loop through every day, check day of week, iterate through each hour, compare cell to "averageusage" range

  for (var i = 2; i < bottomrow; i++){
    var day = currentsheet.getRange(i,26).getValue;
    for (var j = 2; j < 26; j++){
      if (currentsheet.getRange(i,j).getValue() > usagerange.getRange(day,j).getValue()){
        currentsheet.getRange(i,j).setBackground("red");
        }
     }
   }  

Я получаю сообщение об ошибке Cannot find function getRange in object Range. Я предполагаю, что это потому, что я не могу ссылаться на именованный диапазон, как на обычном листе.

1 Ответ

1 голос
/ 30 мая 2019

Поскольку метод getRangeByName(name) возвращает Range вместо NamedRange, необходимо удалить оба аргумента и метод getRange() из аргумента, записанного в usagerange (обратите внимание, что day и j будут быть на основе 0 для значений Array). Кроме того, не забудьте записать значения в переменную вне цикла, чтобы уменьшить количество вызовов службы:

var usageVals = usagerange.getValues();
//...loop
if(currentsheet.getRange(i,j).getValue() > usageVals[day-1][j-1]) {
  //do something;
}
//...loop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...