SetValues ​​медленнее, чем setValue?

Aug 26 2020

У меня есть документ Google с запущенным скриптом Google Apps Script, в который вносят свой вклад несколько человек. Существует onEditтриггер , который срабатывает , когда люди редактирования листа. Насколько я понимаю, если один человек редактирует лист, это запускает мою onEditфункцию триггера.

Если второй человек редактирует лист до того, как первая onEditзакончила обработку, то он останавливает первый экземпляр, а второй onEditзапускает, не закончив первый.

Чтобы избежать этого, я пытаюсь сделать свой код как можно более эффективным, исходя из теории, что если onEditпроцесс занимает меньше времени, вероятность его дублирования снижается. Чтобы добиться этого, я попытался свести к минимуму чтение / запись. Используя серию операторов регистратора, я отследил строки кода, которые отнимают много времени. Я заметил, что одна из моих setValues()строк запускается почти 6 секунд. Это большой массив, который отправляется обратно на лист после того, как я внес в него изменения.

Мои вопросы:

  1. Имеет ли setValues()принимать вызов дольше , чем setValue()?
  2. Занимает ли setValues()вызов небольшого массива меньше времени, чем вызов setValues()большого массива?

Я знаю, что одна setValues()будет намного быстрее, чем 1000 setValue()команд.

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

Ответы

3 Tanaike Aug 27 2020 at 04:33

Q1: setValues()занимает больше времени, чем setValue()?

A1: Нет. Об этом свидетельствует следующий экспериментальный результат.

В2: setValues()вызов небольшого массива занимает меньше времени, чем вызов setValues()большого массива?

A2: Да. Об этом свидетельствует следующий экспериментальный результат.

Q3: Я предположил, что одна запись на лист займет примерно одинаковое количество времени, независимо от размера. Есть ли способ минимизировать это время?

A3: Если вы хотите снизить затраты на добавление значений, как насчет использования Sheets API? Об этом вы можете увидеть на рисунке «А2».

Заметка:

  • Обоснование приведенных выше ответов - это эталон: чтение и запись электронной таблицы с использованием скрипта Google Apps .

  • Как комментарий @ TheMaster , я также думаю, что ваша проблема может быть решена с помощью LockService .

    • Я думаю, что образец сценария LockService можно увидеть в stackoverflow. Ссылка