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

У меня есть исходная ячейка с именем диапазона "источник".
У меня есть несколько целевых (несмежных) ячеек с именами диапазонов "цель1", "цель2", "цель3".

Если ячейка «источник» изменена, я хочу, чтобы ее значение было скопировано в 3 целевые ячейки.

Я спотыкаюсь о первое препятствие, потому что не могу понять, как проверить, редактирую ли я «исходную» ячейку.

Вся документация, похоже, посвящена именованию диапазонов, а не работе с ними.

Пока у меня...

function onEdit()
{
   var sh = SpreadsheetApp.getActiveSheet();
   var ss = SpreadsheetApp.getActiveSpreadsheet();
   var range = ss.getActiveRange();
   var C = range.getColumnIndex();
   var a = sh.getActiveCell();

   if( range == "LXbar1" )
   {
      SpreadsheetApp.getUi().alert('You are HERE!');
   }
}

исправлен код:

function onEdit(e)
{
   var ss = SpreadsheetApp.getActiveSpreadsheet();  
   // Active range
   var eventRange = e.range;
   // Active range address
   var eventRangeA1 = eventRange.getSheet().getName() + "!" + eventRange.getA1Notation();
   // Comparison range name
   var sourceRange = ss.getRangeByName("rLXbar1");
   // Comparison range address
   var sourceRangeA1 = sourceRange.getSheet().getName() + "!" + sourceRange.getA1Notation();

   if (eventRangeA1 === sourceRangeA1)
   {
      // Target range name 
      var targetRange = ss.getRangeByName("rLamp08");
      targetRange.setValue(sourceRangeA1.value);
   }  
}

person user305843    schedule 28.04.2017    source источник


Ответы (1)


Не используйте элементы Active в триггерах onEdit, используйте встроенный объект события это гарантирует, что он всегда будет использовать фактически выбранную ячейку, когда произойдет редактирование.

function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();  
  var eventRange = e.range;
  var sourceRange = ss.getRangeByName("source");
  var eventRangeA1 = eventRange.getSheet().getName() + "!" + eventRange.getA1Notation();
  var sourceRangeA1 = sourceRange.getSheet().getName() + "!" + sourceRange.getA1Notation();

  if (eventRangeA1 === sourceRangeA1) {
    SpreadsheetApp.getUi().alert("You are HERE!");
  } 
};
person Robin Gertenbach    schedule 28.04.2017
comment
О, это отлично, спасибо. Я ДУМАЮ, что понимаю это. Следуя тем же правилам, я пытаюсь скопировать значение, возвращаемое в первую из моих «целевых» ячеек. Однако последняя строка ничего не делает - даже не возвращает ошибку! (пересмотренный код) Есть идеи, что я делаю неправильно? - person user305843; 29.04.2017
comment
getFormula() просто возвращает строку. Вы можете просто сказать targetRange.setValue(e.value); - person Robin Gertenbach; 29.04.2017