Скрипт приложений Google Apps работает очень медленно или бесконечно "Подготовка к выполнению ..."

Я написал очень простой код в своем файле Google Таблиц. Это цель:

  1. Сохраните некоторые значения ячеек из StaticSheet (все Copyxxx), которые необходимо скопировать в DynamicSheet.
  2. Получить значение одной конкретной ячейки, вставленной пользователем вручную.
  3. Введите цикл While, который полезен только для увеличения индикатора и получения номера строки, в которую я хочу скопировать ранее сохраненные значения.
  4. Скопируйте эти значения в эту строку, но в разные столбцы.

Проблема в том, что кажется, что большую часть времени он даже не запускает скрипт после того, как я сказал ему это сделать. Забавно то, что иногда это срабатывает, очень медленно, но работает вроде пары минут. И после он снова перестанет работать.

Не могли бы вы сказать мне, что мне здесь не хватает?

function Copy_Static_on_Dynamic() {
  var app = SpreadsheetApp;
  var ss = app.openById("xxxxyy--------yyzzzz")
  var StaticSheet = ss.getSheetByName("DEAT Price");
  var DynamicSheet = ss.getSheetByName("DEAT Price + TEST");
  var CopySKU = StaticSheet.getRange(5,1,40);
  var CopyPrices = StaticSheet.getRange(5,3,40,4);
  var CopyUsage = StaticSheet.getRange(5,8,40);
  var Week_1 = StaticSheet.getRange(2,4).getValues();
  var i = 1;
  Logger.clear();
  while(DynamicSheet.getRange(i,3).getValues() != Week_1)
  {
   Logger.log(i);
    i+=1;
  }
  CopySKU.copyTo(DynamicSheet.getRange(i,4,40));
  CopyPrices.copyTo(DynamicSheet.getRange(i,6,40,4));
  CopyUsage.copyTo(DynamicSheet.getRange(i,11,40));
}

Возможный дубликат Таймаут сценария приложения Google ~ 5 минут?

TheMaster 05.12.2018 13:10
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
1
4 895
3

Ответы 3

Если вы видите сообщение «Подготовка к выполнению» в редакторе скриптов приложений, вы можете перезагрузить окно браузера и снова запустить функцию. Программа, скорее всего, уйдет.

Очевидно, это не решает проблему. На данный момент в разделе «Executions» я вижу, что это «Running», но делает это бесконечно. Более того, если я попытаюсь вставить любую точку останова для отладки, она никогда не достигнет ее, даже если я вставлю ее во вторую строку кода ... :(

Andrea 05.12.2018 14:50

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

Serge insas 05.12.2018 18:57

Как было упомянуто Амитом Агарвалом, для устранения сообщения об ошибке, упомянутого в вопросе, обновите вкладку веб-браузера.

Что касается кода,

На

var Week_1 = StaticSheet.getRange(2,4).getValues();

и

DynamicSheet.getRange(i,3).getValues()

вместо getValues ​​вы должны использовать getValue, потому что ваш код относится к ячейкам с одной ячейкой, иначе вы получите 2D-массивы вместо скалярных значений.

while следует использовать очень осторожно, чтобы функции не работали бесконечно. Вы можете добавить некоторые «меры предосторожности», например, следующие

var max_iterations = 100 // Edit this while(DynamicSheet.getRange(i,3).getValue() != Week_1 && i <= max_iterations) {

Клянусь, до вчерашнего дня было getValue, я просто изменил, потому что обнаружил в Интернете, что getValues ​​было для строки, а getValue для даты. Это была просто попытка, я действительно не знаю, имеет ли это значение. По второму условию должен ли я просто проверять значение переменной «i» вместо значения ячейки?

Andrea 05.12.2018 17:39

Это имеет значение. Что касается второго условия, то вы правы.

Rubén 05.12.2018 17:47

Думаю, я решил это. Когда Серж инсас говорил, что мой скрипт работает в фоновом режиме, я обнаружил это в разделе «Выполнение», где вы также можете их прервать. После того, как я обнаружил это, я продолжил тестирование и увидел, что циклу while требуется почти 2 секунды для проверки условия каждый раз, что делает сценарий невероятно длинным. Так что вместо:

while(DynamicSheet.getRange(i,3).getValues() != Week_1)

... Я создал переменную, объявленную ранее, например:

var WeekLOOP = DynamicSheet.getRange(i,3).getValues();
while(WeekLOOP != Week_1) { --- }

... и теперь скрипту требуется несколько миллисекунд для выполнения условия. У меня недостаточно технических знаний, чтобы сказать, была ли это единственной проблемой, но, по-видимому, это то, что решило мою проблему. Спасибо всем за поддержку! Вернусь, если мне понадобится дополнительная помощь :)

Другие вопросы по теме