Как сделать пользовательскую функцию, созданную в скрипте Google Apps, реагирующей на изменения фона ячейки в таблицах Google?

#google-apps-script #google-sheets

Вопрос:

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

   function color(input) {
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 
  var activeRange = SpreadsheetApp.getActiveRange();
  var formula = activeRange.getFormula();
  var address = formula.substr(7,2);

  var cell = ss.getRange(address); 
  var result = cell.getBackground(); 
  return resu<
}
 

Комментарии:

1. Для фиксации таких изменений следует использовать события onEdit или onChange.

2. Я не думаю, что изменения в фоновом режиме запускают триггеры onEdit или onChange

3. @Ismail я еще не пробовал onEdit или onChange, я думаю, он должен распознавать изменения в фоновом режиме, но я боюсь, что он может быть слишком жадным и запускать функцию при любом изменении или редактировании, внесенном в электронную таблицу, а не только из-за изменения цвета фона.

4. Событие (e) предоставляет вам информацию о том, какая ячейка или диапазон были изменены. Он также предоставляет вам информацию об измененном значении и предыдущем значении.

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

Ответ №1:

onEdit() не запускается из-за изменений фона, но, как выясняется, onChange есть, а тип изменения-ФОРМАТ

Вот копия объекта события:

 {"authMode":"FULL","changeType":"FORMAT","source":{},"triggerUid":"","user":{"email":"","nickname":""}}
 

Объект события onChange

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

Попробуйте это:

 function onMyChange(e) {
  if(e.changeType == 'FORMAT') {
    SpreadsheetApp.getActive().toast(SpreadsheetApp.getActiveRange().getA1Notation());
  }
}
 

Комментарии:

1. тх! Это может сработать, но мне нужно будет также проверить диапазон, и, похоже, он не является частью этого объекта события. Может быть, объединение триггеров может найти обходной путь? В противном случае я заставлю пользователей редактировать ячейку при изменении формата и использовать триггер onEdit(e), как предложил @Ismail в комментарии

2. Диапазон не является частью объекта события

3. Возможно, нет необходимости принуждать пользователей к редактированию. Возможно, вы можете просто получить текущий активный диапазон.

Ответ №2:

Вы должны попробовать это

 function onChange(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  console.log(ss.getCurrentCell().getA1Notation()   " onchange" );
}
 

Этот журнал будет доступен вам в разделе журналы выполнения триггеров.