Size: a a a

Чат | Google Таблицы и скрипты

2022 February 08

АФ

Артем Файзулов... in Чат | Google Таблицы и скрипты
Привет, чат!
Долго не могу решить проблему мнимой асинхронности выполнения кода. Насколько я знаю, код всегда выполняется последовательно в один поток, это значит, что следующая строка кода исполняется после предыдущей. Но у меня есть пример, когда код как будто выполняется непоследовательно и последняя строка кода выполняется быстрее предыдущей. Я полагаю, что ошибка не в коде, а в том, что таблица не успевает использовать и пересчитать данные которые вносятся на первых строках кода, а следующие строки кода используют диапазон, в котором таблица должна сформировать список на основе введенных данных скриптом ранее.

Постараюсь объяснить на пальцах с примером:
Скрипт регистрирует время изменения статуса Старт и Стоп на листе 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
источник

v

volond in Чат | Google Таблицы и скрипты
А зачем Вам эта формула
var range=sheet.getRange("A2:D27")
var values=range.getValues()
var newValues=[...values.filter(e=>e[1]="Старт"],...values.filter(e=>!e[1]),...values.filter(e=>e[1]="Стоп"]
sheet.getRange(2, newValues.length,newValues[0].length).setValues(newValues)
источник

АФ

Артем Файзулов... in Чат | Google Таблицы и скрипты
на мой взгляд формулы выполняются быстрее, чем скрипты. поэтому я часто комбинирую скрипты и формулы, чтобы скрипт выполнял простые задачи типа копи паст, а всю транформацию выполняю формулами в таблице. Ну и массивы бывают очень большие, что для скрипта тяжело, а формулы почти все переваривают мгновенно.

и тут у меня уже спортивный интерес, я эту проблему вижу уже не в первом проекте и раньше я обходил ее костылями. а сейчас хочу разобрать по косточкам, почему она возникает, и как ее решить профессионально, понимая суть процесса. Я до конца не понимаю суть процесса.

Скрипт вроде отрабатывает - происходит сортировка и копируется уже новый массив, но почему-то не успевает проставится время и юзер. Я не могу понять почему.
источник

v

volond in Чат | Google Таблицы и скрипты
Возможно на 27 строчках формулы быстрее
На 27000 и брать и писать через API
Я бы поспорил
источник

v

volond in Чат | Google Таблицы и скрипты
sleep не надо
надо
spreadsheetapp.flush()
источник

АФ

Артем Файзулов... in Чат | Google Таблицы и скрипты
я знаю, что в скриптах Вы Бог) я попроще и только учусь. Поэтому мне важно понять процесс и физический смыл, а не получить частное решение задачи. Я очень много читал документацию прежде, чем написать сюда и искал статьи в инете. но не нашел ответ. короче я работаю над пониманием вопроса, а не ищу просто решение.
источник

АФ

Артем Файзулов... in Чат | Google Таблицы и скрипты
спасибо, я посмотрю документацию
источник

u

un_excel_bot 😈 in Чат | Google Таблицы и скрипты
Артем Файзулов (6) изменил репутацию volond (1197)
источник

v

volond in Чат | Google Таблицы и скрипты
источник

АЕ

Андрей Евко... in Чат | Google Таблицы и скрипты
Друзья привет!
Есть отличный инструмент Собиратор 4.0. Но очень не хватает возможности дополнять таблицу записями на основе временной метки.
То есть скрипт находит последнюю временную метку  в таблице, куда копирует.
Ищет эту временную метку в таблице, откуда копирует.
Переносит записи начиная с 1й свежей временной метки

Есть ли такой скрипт в доступе, может в виде инструмента? или апдейт планируется к Собиратору.
источник

АФ

Артем Файзулов... in Чат | Google Таблицы и скрипты
урааааа! пипец, это работает! Спасибо! Я не знал об этом методе и не находил его в гугле по описанию моей проблемы. Круто)
источник

u

un_excel_bot 😈 in Чат | Google Таблицы и скрипты
Артем Файзулов (6) изменил репутацию volond (1198)
источник

v

volond in Чат | Google Таблицы и скрипты
Фильтр есть в собираторе
Чего его не применяете
источник

АЕ

Андрей Евко... in Чат | Google Таблицы и скрипты
Разобрать временную метку на дату и время
Найти наибольшую в таблице, куда копируем
Применить фильтр Больше чем найденная дата.
Такого плана?
источник

VP

Vitaliy P. in Чат | Google Таблицы и скрипты
У вас ложное представление о скоростях работы
источник

АФ

Артем Файзулов... in Чат | Google Таблицы и скрипты
наверное мы говорим о разных кейсах. В моих проектах когда я циклом формировал списки, я видел, как скрипт построчно его формирует и это занимало десятки секунд, а формула делала это мгновенно. Конечно, у меня мало опыта, поэтому я не спорю с Вашим тезистом.
источник

РИ

Роман Игнатов... in Чат | Google Таблицы и скрипты
Это неправильное применение скриптов, всего лишь. Нельзя вставлять данные построчно.
источник

VP

Vitaliy P. in Чат | Google Таблицы и скрипты
Вы видели построчную вставку. Если бы скрипт собирал массив значений и вставлял одним setValues() всё было бы куда быстрее
источник

АФ

Артем Файзулов... in Чат | Google Таблицы и скрипты
я понимаю, тут я сталкивался с тем, что для setValues() нужно указывать полный диапазон, куда вставлять данные. Например 513 строк и 118 столбцов. И эти параметры могут меняться.  Я пробовал вставлять построчно - это долго. И в итоге пришел к copyTo и там можно указать только одну ячейку) Я наверное просто не знаю пока, как можно легко посчитать число столбцов и строк в виртуальном диапазоне, который сформировался с помощью скрипта.
источник

VP

Vitaliy P. in Чат | Google Таблицы и скрипты
Вы в своих образовательных потугах больше экспериментируйте в песочнице, а не делайте странных выводов и не ищите ложных богов)
источник