Общая таблица с двумя экземплярами onEdit, удаляющая неправильную строку - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь создать формат управления потенциальными клиентами, используя Google Sheets & Apps Script.

Сценарий apps проверяет, изменилось ли значение в столбце M листа Propsect или Заинтересованный и в зависимости от значения, перемещая строку в соответствующий лист ( заинтересованный , отложен , потерян или забронирован )

Электронная таблица предоставлена ​​моей команде, которая будет вносить изменения, а также редактировать сразу нескольких пользователей.

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

Например: в листе Проспект , строки 2 и 3 имеют статус, измененный на Lost & Postponed одновременно. Теперь Lost запускается должным образом, однако экземпляр Postponed удаляет 4-ю строку (теперь 3-ю строку, так как строка 2 была удалена ранее).

Я попытался добавить lockservice в код, чтобы работал только один экземпляр, но это, похоже, не решает проблему, поскольку объект события все еще рассматривает необновленный номер строки. Даже попытался добавить flush() в начале и конце кода, но тоже не сработало.

Вы можете получить доступ к электронной таблице здесь .

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

function Master(e) {
  var lock = LockService.getScriptLock();
  var SS = e.source;
  var Sheet = e.source.getActiveSheet();
  var Range = e.range;
  if(Sheet.getName() == "Prospect" && Range.getColumn() == "13" || Sheet.getName() == "Interested" && Range.getColumn() == "13"){
    moveRows(SS,Sheet,Range);
  } 
lock.releaseLock();
}

function moveRows(SS,Sheet,Range) {
  var val1 = Sheet.getRange(Range.getRow(),1,1,10).getDisplayValues();
  val1 = String(val1).split(",");
  var tar_sheet = SpreadsheetApp.getActive().getSheetByName(Range.getValue());
  var row = tar_sheet.getRange(tar_sheet.getLastRow()+1,1,1,val1.length).setValues([val1]);
  Sheet.deleteRow(Range.getRow());
  }
}

Можно ли запустить вторую onEdit только после завершения первого? Я думаю, если это могло случиться, проблема была бы решена? Надеюсь, мне удалось правильно передать мой вопрос.

Ответы [ 2 ]

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

Проблема:

Объект события e, переданный в onEdit(e), не изменяется, когда два или более редактирования выполняются одновременно, и первое редактирование изменяет номер строки следующего редактирования, делая e.range.rowStart второго + редактирование ненадежным при время его исполнения.

Возможные решения:

  • Не удаляйте строки сразу. Отметьте их для удаления (сохраните строку диапазона в службе свойств) и удалите их позже (триггер времени), когда документ не используется.

  • В качестве альтернативы добавьте код охранников: Отметьте range.getValue()===e.value. Если они равны, продолжайте moveRows, в противном случае сохраняйте диапазон offset в диапазоне -1, пока они оба не станут равными.

Ссылки:

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

Полагаю, вам следует запускать только одну функцию, основанную на взаимодействии с пользователем, а затем внутри нее, которая выполняет условные операции.

Примерно так:

function onEdit(event_object) {
    var sheet = event_object.range.getSheet();
    var row = event_object.range.getRow();
    var column = event_object.range.getColumn();

    if (sheet.getName() == "Sheet1") {
        // perform operations when Sheet1 is edited
    } else if (sheet.getName() == "Sheet2") {
        // perform operations when Sheet2 is edited
    }
}

Ссылка:

https://developers.google.com/apps-script/reference/spreadsheet/range

https://developers.google.com/apps-script/guides/triggers/events#edit

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