Как обрабатываются несколько функций onEdit ()? - PullRequest
0 голосов
/ 06 декабря 2018

Если у меня есть лист с 20 отдельными сценариями onEdit (), возникнут ли какие-либо проблемы, если два уникальных редактора будут сделаны в одно и то же время разными пользователями?Более конкретно:

1) Какое временное разрешение для записи редактируется?Например, вероятность того, что два человека будут редактировать в одну и ту же миллисекунду, очень мала, но, возможно, в течение одной секунды не может быть невероятно невероятной.Если два человека редактируют в одну и ту же секунду, не сможет ли он распознать их как отдельные правки?Или он может четко распознавать каждое редактирование как уникальное событие независимо от того, насколько близко они произошли?

2) Если один сценарий onEdit () запущен и не завершает до того, как произойдет другое редактирование, произойдетэто вызывает ошибку во втором редактировании для правильной оценки?

3) У меня есть около 20 скриптов, работающих на листе с примерно 20 вкладками и около 7 пользователей на нем в любой момент времени.Есть ли какие-либо другие проблемы, которые вы предвидите, из-за которых некоторые скрипты onEdit () не будут работать?

Мой скрипт проверяет, было ли выполнено редактирование в столбце x на листе x, и, если это так, копирует его на следующий лист и удаляет строку с первого листа.Это в настоящее время терпит неудачу около 30% времени.Я не знаю почему.В прошлом этого не было.

Мой код выглядит следующим образом:

function onEdit(e){ 
  var edited_range = e.range;

  var edited_row = edited_range.getRow();

  var activeSheet = e.source.getActiveSheet(); 
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 

  var source_sheet = ss.getSheetByName("N.Arb Pitches"); 
  var target_sheet = ss.getSheetByName("N.Arb In Progress");
  var last_row = target_sheet.getLastRow(); 

  var range_values = target_sheet.getRange("A1:A").getValues(); 

  var range_length = range_values.filter(String).length + 1;

  var target_range = target_sheet.getRange(range_length,1); 


  if (activeSheet.getName() == "N.Arb Pitches") { 
        if (edited_range.getColumn() == 13) {
          if (edited_range.getValue().toLowerCase() == "yes") {
             target_sheet.insertRowAfter(last_row);  
             source_sheet.getRange(edited_row,1,1,12).copyTo(target_range); 
            source_sheet.deleteRow(edited_row)  }}}; 

}

В каждом проекте есть только 1 функция onEdit (e), и у меня так много проектовв моем листе.Каждый проект имеет функцию, подобную приведенной выше, но с измененными именами листов.

1 Ответ

0 голосов
/ 06 декабря 2018

Без кода для проверки, я предполагаю, что у вас есть несколько onEdit() методов в вашем проекте сценария приложения.

Возможно, у вас есть ряд *.gs файлов, определенных следующим образом:

\** onEdit() defined in, for example, script1.gs *\
function onEdit(e) {...}

И еще один

\** onEdit() defined in, for example, script2.gs *\
function onEdit(e) {...}

Если это так, то у вас есть проблема.Каждый раз, когда вы определяете метод с одним и тем же именем (в рамках одного и того же проекта сценария приложений), независимо от того, в каком файле сценария он находится, последнее определение переопределяет предшествующее.Таким образом, из ваших 20 onEdit() функций будет действовать только последняя определенная функция.


РЕДАКТИРОВАТЬ

Назначение нескольких проектов сценариев приложений для одной электронной таблицы со своими собственными onEdit()жизнеспособный.Однако, если лист активно используется несколькими сторонами, эти onEdit() методы, вероятно, вызовут проблемы параллелизма.Вы можете попробовать использовать LockService для устранения этих проблем.

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