Apps Script крайне медленно или бесконечно "готовится к выполнению ..." - PullRequest
0 голосов
/ 05 декабря 2018

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

  1. Сохранить некоторые значения ячеек из StaticSheet (все Copyxxx), которые необходимо скопировать в DynamicSheet.
  2. Получить значение одной конкретной ячейки, вставленной пользователемвручную.
  3. Войдите в цикл «Время», полезный только для увеличения индикатора и получения номера строки, в которую я хочу скопировать ранее сохраненные значения.
  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));
}

Ответы [ 3 ]

0 голосов
/ 05 декабря 2018

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

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

Вкл.

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

и

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

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

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

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

0 голосов
/ 13 декабря 2018

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

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

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

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

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

0 голосов
/ 05 декабря 2018

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

...