АФ
Долго не могу решить проблему мнимой асинхронности выполнения кода. Насколько я знаю, код всегда выполняется последовательно в один поток, это значит, что следующая строка кода исполняется после предыдущей. Но у меня есть пример, когда код как будто выполняется непоследовательно и последняя строка кода выполняется быстрее предыдущей. Я полагаю, что ошибка не в коде, а в том, что таблица не успевает использовать и пересчитать данные которые вносятся на первых строках кода, а следующие строки кода используют диапазон, в котором таблица должна сформировать список на основе введенных данных скриптом ранее.
Постараюсь объяснить на пальцах с примером:
Скрипт регистрирует время изменения статуса Старт и Стоп на листе 1. Когда ставим старт или стоп, в соседние справа ячейки скрипт вписывает время и юзера. Это работает корретно само по себе.
ar.offset(0,1).setValue(new Date)Но далее нужно сделать сортировку списка и строки Стоп поставить вниз списка, Старт в начало списка, а пустые посередине. Это делает формула создания массива:
ar.offset(0,2).setValue(e.user)
={filter(A2:D27;B2:B27="Старт");
filter(A2:D27;B2:B27="");
filter(A2:D27;B2:B27="Стоп")}
Она перестраивает массив, когда мы ставим статус. Далее скрипт копирует новый массив и вставляет на место старого. as.getRange('F2:I27').copyTo(as.getRange('A2'), { contentsOnly: true })
}
Так вот, код срабатывает быстрее, чем создается новый массив. И поэтому копируется массив без записи нового времени и юзера. Я не знаю, как обойти этот баг.Можно добавить пробежуточный код, который будет задерживать выполнение копирования, но это костыли. Также я пробовал использовать задежку sleep(1000) но это тоже не помогло. Может кто-то сталкивался с такой задачей?
https://docs.google.com/spreadsheets/d/1IbVOI9aEDv68W5Z5WNZKZxqGQHTKIHv2hEKa9QEAriI/edit?usp=sharing
