function onEdit(e) тормозит

Если быстро вбивать новые значения в ячейки или копипастить сразу в несколько ячеек (построчно), function onEdit(e) не успевает отрабатывать. Отрабатывает только один раз, остальных правок как будто нет.


function onEdit(e) {
  var sheet = e.source.getActiveSheet();
  var idCol = e.range.getColumn();
  var idRow = e.range.getRow();
  var sheet_name = e.source.getActiveSheet().getName();
  var time_stamp = sheet.getRange(idRow, 2).getDisplayValue();

  if ( idRow > 2 && idCol > 2 && ( sheet_name =='Заказы' || sheet_name =='Оферты' ) ) //проверяем чтобы не было сработки при правке строкстолбцов заголовков

  {
    sheet.getRange(idRow, 1).setValue( get_Date() );
    if ( sheet_name =='Оферты' && time_stamp == "") { // проверяем чтобы таймштамп был пустой в данной строке

      time_stamp = get_time_stamp(); //получаем таймштамп
      sheet.getRange(idRow, 2).setValue( time_stamp ); //устанавливаем в ячейку таймштамп
      Logger.log("Таймштамп присвоен: " + time_stamp); 
    } else { 
      Logger.log("Таймштамп уже есть: "+ time_stamp); 
    }
  }   
}



// Returns "YYYY.MM.DD-HH:mm:ss"-formatted date.
function get_Date() 
{
  var today = new Date();
  today.setDate(today.getDate());
  return Utilities.formatDate(today, 'GMT+03:00', 'yy.MM.dd-HH:mm:ss');
}




// Returns "yyyyMMddHHmmssSS" formatted timestamp.
function get_time_stamp() 
{
  var today = new Date();
  today.setDate(today.getDate());
  return Utilities.formatDate(today, 'GMT+03:00', 'yyyyMMddHHmmssSS');
}

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

Ума не приложу – Как это победить?


Ответы (1 шт):

Автор решения: contributorpw

Вариантов может быть несколько. Я использую LockService как простую реализацию.

Переименуйте свое onEdit(e), в myTask(e), тогда

всё, что после события должно вызываться из функции

/**
 *
 * @param {<Дженерик>} e
 */
function afterEvent_(e) {
  try {
    var lock = LockService.getScriptLock();
    if (lock.tryLock(0)) {
      myTask(e);
      lock.releaseLock();
    }
  } catch (error) {
    e.source.toast(error, 'error', 0);
  }
}

Привяжем триггеры

/**
 * If you need track EDIT event
 * @param {GoogleAppsScript.Events.SheetsOnEdit} e
 */
function onEdit(e) {
  afterEvent_(e);
}

Полноценный пример snippets/spreadsheet-autoincrement. Он не совсем по вашей теме, но afterEvent_ можете даже не менять, оставить как есть. Работает без тормозов на более чем 100K строк.

→ Ссылка