Я написал очень простой код в своем файле Google Таблиц. Это цель:
Проблема в том, что кажется, что большую часть времени он даже не запускает скрипт после того, как я сказал ему это сделать. Забавно то, что иногда это срабатывает, очень медленно, но работает вроде пары минут. И после он снова перестанет работать.
Не могли бы вы сказать мне, что мне здесь не хватает?
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));
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы видите сообщение «Подготовка к выполнению» в редакторе скриптов приложений, вы можете перезагрузить окно браузера и снова запустить функцию. Программа, скорее всего, уйдет.
Очевидно, это не решает проблему. На данный момент в разделе «Executions» я вижу, что это «Running», но делает это бесконечно. Более того, если я попытаюсь вставить любую точку останова для отладки, она никогда не достигнет ее, даже если я вставлю ее во вторую строку кода ... :(
Вы видите сообщение, потому что ваш скрипт работает слишком долго. Вы, вероятно, пытались вручную отменить его выполнение, но сервер все еще работает для вас на нескольких экземплярах. В какой-то момент становится невозможным запуск любого скрипта, вы можете только ждать, иногда несколько часов. Я знаю, что это кажется нелогичным из-за 6-минутного ограничения, но я знаю это по опыту.
Как было упомянуто Амитом Агарвалом, для устранения сообщения об ошибке, упомянутого в вопросе, обновите вкладку веб-браузера.
Что касается кода,
На
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» вместо значения ячейки?
Это имеет значение. Что касается второго условия, то вы правы.
Думаю, я решил это. Когда Серж инсас говорил, что мой скрипт работает в фоновом режиме, я обнаружил это в разделе «Выполнение», где вы также можете их прервать. После того, как я обнаружил это, я продолжил тестирование и увидел, что циклу while требуется почти 2 секунды для проверки условия каждый раз, что делает сценарий невероятно длинным. Так что вместо:
while(DynamicSheet.getRange(i,3).getValues() != Week_1)... Я создал переменную, объявленную ранее, например:
var WeekLOOP = DynamicSheet.getRange(i,3).getValues();
while(WeekLOOP != Week_1) { --- }... и теперь скрипту требуется несколько миллисекунд для выполнения условия. У меня недостаточно технических знаний, чтобы сказать, была ли это единственной проблемой, но, по-видимому, это то, что решило мою проблему. Спасибо всем за поддержку! Вернусь, если мне понадобится дополнительная помощь :)
Возможный дубликат Таймаут сценария приложения Google ~ 5 минут?