SetValues медленнее, чем setValue?
У меня есть документ Google с запущенным скриптом Google Apps Script, в который вносят свой вклад несколько человек. Существует onEditтриггер , который срабатывает , когда люди редактирования листа. Насколько я понимаю, если один человек редактирует лист, это запускает мою onEditфункцию триггера.
Если второй человек редактирует лист до того, как первая onEditзакончила обработку, то он останавливает первый экземпляр, а второй onEditзапускает, не закончив первый.
Чтобы избежать этого, я пытаюсь сделать свой код как можно более эффективным, исходя из теории, что если onEditпроцесс занимает меньше времени, вероятность его дублирования снижается. Чтобы добиться этого, я попытался свести к минимуму чтение / запись. Используя серию операторов регистратора, я отследил строки кода, которые отнимают много времени. Я заметил, что одна из моих setValues()строк запускается почти 6 секунд. Это большой массив, который отправляется обратно на лист после того, как я внес в него изменения.
Мои вопросы:
- Имеет ли
setValues()принимать вызов дольше , чемsetValue()? - Занимает ли
setValues()вызов небольшого массива меньше времени, чем вызовsetValues()большого массива?
Я знаю, что одна setValues()будет намного быстрее, чем 1000 setValue()команд.
Я предположил, что одна запись в лист займет примерно одинаковое количество времени независимо от размера. Есть ли способ минимизировать это время?
Ответы
Q1:
setValues()занимает больше времени, чемsetValue()?
A1: Нет. Об этом свидетельствует следующий экспериментальный результат.
В2:
setValues()вызов небольшого массива занимает меньше времени, чем вызовsetValues()большого массива?
A2: Да. Об этом свидетельствует следующий экспериментальный результат.
Q3: Я предположил, что одна запись на лист займет примерно одинаковое количество времени, независимо от размера. Есть ли способ минимизировать это время?
A3: Если вы хотите снизить затраты на добавление значений, как насчет использования Sheets API? Об этом вы можете увидеть на рисунке «А2».
Заметка:
Обоснование приведенных выше ответов - это эталон: чтение и запись электронной таблицы с использованием скрипта Google Apps .
Как комментарий @ TheMaster , я также думаю, что ваша проблема может быть решена с помощью LockService .
- Я думаю, что образец сценария LockService можно увидеть в stackoverflow. Ссылка