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 шт):
Вариантов может быть несколько. Я использую 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 строк.