Новые пользовательские функции Google Таблиц иногда отображают "Загрузка..." на неопределенный срок
КОНКРЕТНЫЕ ДЛЯ: "NEW" листы google.
Это известная проблема как указано google в новых листах.
Проблемы. Если вы пишете сложные пользовательские функции * в google-apps- script для листов google, вы будете иногда запускаться в ячейки, которые отображают красную коробку ошибок вокруг ячейки с текстом "Loading..."
Google предложил:
Если это произойдет, попробуйте перезагрузить страницу или переименовать функцию и изменить все ссылки на новое имя.
Однако для других разработчиков, испытывающих эту проблему (и которые не могут избежать ошибки "загрузка..." ), я написал свои выводы в ответе ниже о том, как последовательно проходить это (с ограничениями).
* Мы рассматриваем этот вопрос как канонический ответ для неопределенной страницы "Ошибка... Загрузка данных" в Google Sheet. Он не ограничивается сложными или медленными функциями.
Ответы
Ответ 1
У меня также была проблема с бесконечной загрузкой со следующей функцией.
// check if an item can be checked off
function checkedOff( need, have ) {
var retStr = "nope";
if( have >= need ){
retStr = "yep";
}
return retStr;
};
Оказывается, у вас не должно быть конечного ";". Удаление точки с запятой решило проблему.
// check if an item can be checked off
function checkedOff( need, have ) {
var retStr = "nope";
if( have >= need ){
retStr = "yep";
}
return retStr;
}
Это выполняется, как и следовало ожидать.
Ответ 2
FWIW, я просто столкнулся с этим, и виновник оказался тем тегом getRange()
, который вытащил несколько тысяч строк в массив. Периодически он зависает над сообщением "Загрузка...".
Я работал над этим, помещая этот диапазон в кеш документа. Это немного клочья, потому что в кеше хранятся строки, а не массивы, но вы можете принудительно вернуть его в массив с помощью .split(',')
, когда вам нужно получить доступ к массиву.
(В моем случае это один массив. Вероятно, это способ сделать это с использованием двойного массива, либо путем отправки каждой строки или столбца в свой собственный кеш, либо чтения значения кэша назад по N элементов за раз, каждый N становясь его собственным массивом.)
Здесь соответствующий бит из моего кода:
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("mySheet"); //search the "mySheet" sheet
// is the big list already in the cache?
var cache = CacheService.getDocumentCache();
var cached = cache.get("columnValues");
if (cached != null) {
var columnValues = cached.split(','); // take the cached string and make it an array
} else { // it not in the cache, so put it there
var column = 1; // the column with your index
var columnValues = sheet.getRange(2, column, sheet.getLastRow()).getValues(); // first row is header
cache.put("columnValues",columnValues,60000); // this forces the array into a string as if you used .join() on it
}
Это определенно ошибка в приложениях Script - getRange() не следует висеть без тайм-аута или сообщения об ошибке. Но, по крайней мере, обходной путь. Здесь ошибка, которую я открыл против нее, где я также поместил полный код .gs с моего листа.
Ответ 3
Одна причина: Разрешения, требующие авторизации.
Что касается {этой проблемы, лучше сформулировать результат ячейки пользовательской функции, отображающей отвратительно-неопределенное сообщение "Загрузка... Ошибка: загрузка данных...", действительно в том случае, когда все экземпляры тот же/аналогичный пользовательский вызов функции, отображающий эту ошибку, заключается в том, что для Google Таблиц требуются разрешения для запуска script (часто дополнительно: значение в прошлом им не нужно), поэтому вместо {действуя соответствующим образом: затем запрашивая пользователя для этих прав, иначе возвращающих эту ошибку}, Листы вместо этого зависают с этой отвратительно неопределенной ошибкой.
Дополнительные разрешения могут потребоваться от 1 или более:
- Сценарии приложений Google с тех пор переписывают структуру разрешений - как эта проблема теперь только что со мной произошла, по моей внутренней заметке O80U3Z.
- Ваш код или какая-то библиотека, которую он использует, вносил изменения, требующие большего доступа... но в этом случае у вас гораздо больше шансов угадать причину этой отвратительно-смутной ошибки, поэтому, надеюсь, здесь не будет читаться.
Чтобы исправить, я явно выполнил мой код электронной таблицы GAS обоими: нажав одну из моих пользовательских функций меню, а в редакторе script запустил одну из моих пользовательских функций JS, в частности, "onOpen()), поскольку это наиболее всесторонним. Первый способствовал мне действительно новым разрешениям через всплывающее окно" Требуется авторизация "
Приложение "MM6ZBT (MM6Z83 script)" требует авторизации для запуска. Хотя onOpen() также делал это в случаях, когда GAS пересматривает свои разрешения, поскольку мы использовали этот лист. Затем, когда я все еще получал эту ошибку "Loading...", я перезагрузил веб-страницу (так что на листе) и, по крайней мере, для этих случаев этой отвратительно неопределенной ошибки, она исчезла, и вычисления отлично работали:-)
Ответ 4
У меня также была проблема, которую вы объяснили. Кажется, что это может быть вызвано более чем одним способом.
В итоге я обнаружил, что моя пользовательская функция отображала эту ошибку, потому что она полагалась на данные из вызова =IMPORTRANGE()
, и этот вызов терпел неудачу.
В итоге я обнаружил, что вызов =IMPORTRANGE()
завершился неудачей, потому что я забыл обновить URL-адрес, который он импортировал, когда я загрузил новую версию этого импортированного листа. Похоже, что попытка IMPORTRANGE из поврежденного файла может вызвать бесконечную ошибку "Загрузка...".
Ответ 5
Важный совет. Создайте несколько копий всей электронной таблицы во время экспериментов. У меня было 3 таблицы Google, которые были повреждены и были полностью недоступны (застряли в цикле обновления). Это произошло, когда я экспериментировал с пользовательскими функциями, поэтому ВЫ БЫЛИ ПРЕДУПРЕЖДЕНЫ!
Вам нужно попробовать один или несколько способов устранения этой проблемы:
-
Как было предложено google, попробуйте перезагрузить электронную таблицу или переименовать функцию или изменить параметры в ячейке, чтобы узнать, устраняет ли это проблему.
-
Оборудуйте ВСЕ свои пользовательские функции в блоке try-catch. Это поможет обнаружить проблемы с кодом, которые вы, возможно, не тестировали должным образом. Например:
попробовать {
// методы
} Задвижка (ех) {
return "Exception:" + ex;
}
-
Вернитесь к старым листам и проверьте свои функции и проверьте наличие каких-либо других типов ошибок, таких как бесконечный цикл или неверные данные формат. Если функция не работает на старых листах, она не будет работать на новых листах, и ее будет сложнее отлаживать.
-
Убедитесь, что NONE ваших параметров ссылается, может рассчитывать или когда-либо содержать число, превышающее 1 миллион (1000000). Не знаю, почему, но используя число больше миллиона, поскольку любой параметр приведет к тому, что ваша функция не сработает. Если вам нужно, попросите ввести уменьшенный размер (возможно, разделите на 1000 или попросите M вместо mm).
-
Проверьте числовые или с плавающей запятой, где числа могут превышать нормальный набор значимых цифр. Новые листы кажутся немного глючными с цифрами, поэтому, если вы ожидаете очень больших или очень сложных чисел, ваши функции могут не работать.
Наконец, если ни одно из вышеперечисленных действий не работает, переключитесь на старые листы google и продолжайте работать.
Если вы обнаружите какие-либо другие ограничения или причины, по которым функции не выполняются, напишите их ниже для меня и других пользователей, которые являются тяжелыми пользователями g-листа!
Ответ 6
Дополнения
У меня было два надстройки, и никакая функция не загружалась.
Я удалил их, и все хорошо!
Ответ 7
Я не могу добавить комментарий, но мне захотелось услышать, что у меня также была эта проблема сегодня, через 2 года успешного запуска листа, и я нашел этот поток на основе поиска ответов. Я использовал приведенное выше решение для переименования функции и заменил имя, где это необходимо, на листе. Это было легко для меня, так как у меня только один экземпляр функции, вызываемой на листе. Но, как только я переименовал/заменил, лист снова начал работать.
Ответ 8
Для меня переименование пользовательской функции решило проблему. На данный момент по крайней мере.
Ответ 9
Просто чтобы добавить в Azmo ответ...
Я фактически удалил все конечные точки с запятой из кода:
// check if an item can be checked off
function checkedOff( need, have ) {
var retStr = "nope"
if( have >= need ){
retStr = "yep"
}
return retStr
}
И обнаружил, что при выполнении этого в большом диапазоне вы также можете максимально увеличить допустимое количество обращений к API.
Чтобы обойти это, я добавил проверку IF THEN
в свой вызов скрипта.
Так что вместо:
=checkedOff(H10,H11)
Используйте что-то вроде этого, чтобы проверить заполненное поле перед выполнением:
=if(H17<>"-",checkedOff(H10,H11),0)
Ответ 10
Я столкнулся с похожей проблемой с importrange из другой таблицы.
На самом деле в электронной таблице вы должны получить что-то вроде "Разрешения на доступ" к электронной таблице, к которой вы подходите с помощью importrange. Но она застряла навсегда, и все советы, такие как очистка кэша и т.д., Не сработали.
В конце концов я продублировал электронную таблицу, и в этой новой электронной таблице он запросил разрешение, и теперь все работает нормально.
Так что это может помочь дублировать вашу таблицу.
Ответ 11
Я столкнулся с похожей проблемой с importrange из другой таблицы.
На самом деле в электронной таблице вы должны получить что-то вроде "Разрешения на доступ" к электронной таблице, к которой вы подходите с помощью importrange. Но она застряла навсегда, и все советы, такие как очистка кэша и т.д., Не сработали.
В конце концов я продублировал электронную таблицу, и в этой новой электронной таблице он запросил разрешение, и теперь все работает нормально.
Так что это может помочь дублировать вашу таблицу
Это была проблема со мной.
По какой-то причине лист не связывал листы, потому что у него не было разрешения.
Копирование на новый лист позволило получить разрешение, и это сработало.
Ответ 12
Мой скрипт приложения, извлекающий данные из моей базы данных MSSQL, просто отлично отображался в GoogleSheets на моем ноутбуке, но затем не отображался в приложении Android GS.
По этой ветке похоже, что есть ряд проблем, которые могут это вызвать, но ответ @DestinyArchitect выше: "Разрешения казались самым простым решением".
Во время тестирования скрипта моего приложения для этого файла GoogleSheet отключен общий доступ. После того, как я переместил его в папку своей команды, где у нас по умолчанию включен общий доступ с несколькими членами команды, данные MSSQL показывались прямо на GoogleSheet в моем приложении Android GS.
Легко исправить, на этот раз...
Ответ 13
У меня также была ошибка "загрузка данных...", но ни одно из описанных здесь исправлений не помогло мне. Это, кажется, не было вызвано проблемами, описанными здесь. В моем случае я сузил проблему до конкретной операции с плавающей запятой (мне кажется, что это настоящая ошибка в Google Sheets) и задокументировал один из возможных способов решения этой проблемы:
Google Sheets/Apps "Ошибка загрузки данных": есть ли лучший обходной путь?
Подводя итог (по просьбе комментатора Стива), если ячейка с
= myfunction(B10)
сгенерировал ошибку "загрузка данных", тогда для меня это можно исправить, обернув аргумент в функцию "value()":
= myfunction(value(B10))
который преобразует число в ячейке B10 (которое выглядело как нормальное число, но каким-то образом вызывало проблемы) в нормальное число, которое работает нормально.