Вызов функции onEdit внутри устанавливаемого триггера onEdit. Будет ли это ошибкой для пользователей, которые не могут редактировать другую вкладку в электронной таблице? - PullRequest
0 голосов
/ 11 января 2019

Справочная информация: Я пытаюсь разработать Google Sheet, где пользователь вводит некоторые параметры процесса, а затем запускает макрос, который:

1) Копирует данные в таблицу основных данных на другой вкладке / листе в файле Google Sheets.

2) Копирует данные на другую вкладку / лист в формате, чтобы подать некоторые графики для отслеживания последних данных.

3) Очищает ячейки ввода данных.

Примечание. Все вкладки / листы в файле защищены только мной (владельцем), который может редактировать, кроме ячеек, требующих ввода данных пользователем.

Что у меня так далеко: Макрос работал для меня (владельца) безупречно, но другие пользователи получали сообщение об ошибке защиты. Я использовал функцию onEdit в качестве макроса, и она была бы вызвана введением 'GO' в целевую ячейку. Это вызвало бы пользовательскую функцию Transfer_Data (). Я прочитал больше об установленных триггерах, обнаружил, что установленный триггер будет работать под моими разрешениями, и решил попробовать это. Однако установленный триггер был настроен для запуска onEdit, который, в свою очередь, запускает встроенную в лист функцию onEdit. Это означает, что функция onEdit активируется дважды, один раз как я (владелец) и один раз как пользователь, выполняющий редактирование. Инициированная пользователем функция onEdit в электронной таблице выдаст ошибку, но та, которая инициирована установленным триггером, должна выполнить код, как и предполагалось. Как мне разорвать порочный круг непрерывного вызова функции onEdit дважды, когда два разных пользователя редактируют каждую электронную таблицу?

function onEdit(e){
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('E16').setValue('BEBUG0');
  var editedRange = e.range;
 var editedRow = editedRange.getRow();
 var editedColumn = editedRange.getColumn();
 var editedCell = e.range.getA1Notation();
 var editedValue = e.range.getValue();

  if (editedCell == 'E15'){
    spreadsheet.getRange('E16').setValue('BEBUG1');
    if(editedValue == 'GO' || editedValue == 'Go' || editedValue == 'go' || 
editedValue == 'gO'){ 
      spreadsheet.getRange('E16').setValue('BEBUG2');
  Transfer_Data(); 
  }
  }
  else{
    spreadsheet.getRange('E16').setValue('YELLOW BOX NOT EDITED');
  }
}

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

1 Ответ

0 голосов
/ 11 января 2019

Как мне разорвать порочный круг непрерывного вызова функции onEdit дважды, когда два разных пользователя редактируют каждую электронную таблицу?

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

замена

function onEdit(e){

чем-то вроде

function installableOnEdit(e){

Относящиеся

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...