Новые пользовательские функции Google Sheets иногда отображают "Загрузка..." бесконечно
ОСОБЕННО ДЛЯ: "НОВЫХ" только в Google листах.
Это известная проблема, выделенная Google на новых листах.
Проблемы: если вы пишете сложные * пользовательские функции в google-apps-script для листов google, вы иногда будете сталкиваться с ячейками, которые отображают красное поле с ошибкой вокруг ячейки с текстом "Загрузка..."
Google предложил:
Если это происходит, попробуйте перезагрузить страницу или переименовать функцию и изменить все ссылки на новое имя.
Однако для других разработчиков, испытывающих эту проблему (и которые не могут избежать ошибки "загрузка..."), я написал свои выводы в ответе ниже о том, как последовательно преодолеть эту проблему (с ограничениями).
* Мы рассматриваем этот вопрос как канонический ответ на неопределенную проблему "Ошибка... Загрузка данных" в Google Sheet. Это не ограничено сложными или медленными функциями.
18 ответов
Важный совет: создавайте несколько копий всей таблицы в процессе эксперимента. У меня 3 таблицы Google повреждены и полностью недоступны (застряли в цикле обновления). Это произошло, когда я экспериментировал с пользовательскими функциями, так что вы были предупреждены!
Вы можете попробовать один или несколько из следующих способов, чтобы решить эту проблему:
В соответствии с предложением Google попробуйте перезагрузить электронную таблицу или переименовать функцию или изменить параметры в ячейке, чтобы убедиться, что это решит проблему.
Окружите ВСЕ ваши пользовательские функции блоком try-catch. Это поможет обнаружить проблемы с кодом, которые вы, возможно, не протестировали должным образом. Например:
try {// методы}catch(ex){ return "Exception:"+ex; }
Вернитесь к старым листам и протестируйте свои функции и проверьте на наличие любых других типов ошибок, таких как бесконечный цикл или неверный формат данных. Если функция не работает на старых листах, она не будет работать на новых листах, и ее будет сложнее отлаживать.
Убедитесь, что ни один из ваших параметров не относится, не может ожидать или будет содержать число больше 1 миллиона (1000000). Не знаю почему, но использование числа больше миллиона в качестве любого параметра приведет к сбою функции. Если вам нужно, попросите уменьшить размер входных данных (возможно, разделите их на 1000 или попросите M вместо мм).
Проверьте для числовых или с плавающей запятой, где числа могут превышать нормальный набор значащих цифр. Новые таблицы кажутся немного затруднительными с числами, поэтому, если вы ожидаете очень большие или очень сложные числа, ваши функции могут не работать.
Наконец, если ничего из вышеперечисленного не работает, переключитесь на старые листы Google и продолжайте работать. Если вы обнаружите какие-либо другие ограничения или причины, по которым функции не будут выполняться, напишите их ниже для меня и других пользователей, которые являются активными пользователями g-sheet!
У меня также была проблема бесконечной загрузки со следующей функцией.
// 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;
}
Это работает, как и следовало ожидать.
FWIW, я просто столкнулся с этим, и виновник оказался getRange()
вызов, который вытащил несколько тысяч строк в массив. Периодически это зависало бы на сообщении "Загрузка...".
Я решил эту проблему, поместив этот диапазон в кэш документов. Это немного глупо, потому что кеш хранит только строки, а не массивы, но вы можете принудительно вернуть его обратно в массив, используя .split(',')
когда вам нужно получить доступ к массиву.
(В моем случае это один массив. Вероятно, есть способ сделать это, используя двойной массив, либо отправляя каждую строку или столбец в свой кеш, либо считывая значение кеша из 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's 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
}
Это определенно ошибка в скрипте приложений - getRange() не должна зависать без таймаута или сообщения об ошибке. Но по крайней мере есть обходной путь. Вот ошибка, которую я открыл против этого, где я также поместил полный code.gs из моего листа.
Одна из причин: разрешения требуют авторизации.
Что касается {этой проблемы, лучше сформулировать результат (ы) в ячейке пользовательской функции, отображающей отвратительно неопределенное сообщение "Загрузка... Ошибка: загрузка данных..."}, действительно в случае, когда все экземпляры одинаковы / аналогичный вызов пользовательской функции, отображающий эту ошибку, заключается в том, что Google Sheets нужны разрешения для запуска сценария (часто дополнительно: это означало, что в прошлом они не требовались), поэтому вместо того, чтобы {действовать соответствующим образом: затем запрашивать у пользователя эти разрешения, в противном случае возвращая эту ошибку}, Sheets вместо этого зависает с этой отвратительно неопределенной ошибкой.
Дополнительные разрешения могут потребоваться от 1 или более:
- С тех пор Сценарии Google App переписали свою структуру разрешений - как эта проблема сейчас случилась со мной, согласно моей внутренней заметке O80U3Z.
- Ваш код или какая-то библиотека, которую он использует, внесли изменения, чтобы потребовать большего доступа... но в этом случае у вас гораздо больше шансов угадать причину этой отвратительно-неопределенной ошибки, так что, надеюсь, здесь не будут читать.
Чтобы исправить это, я явно запустил свой код электронной таблицы GAS, щелкнув одну из моих пользовательских функций меню и в "редакторе сценариев" запустив одну из моих пользовательских функций JS, в частности, "onOpen()", поскольку она наиболее полная. Первый выдвинул меня за действительно новые разрешения через всплывающее окно "Требуется авторизация"
Для запуска приложения "MM6ZBT(скрипт MM6Z83)" требуется авторизация. ', Хотя onOpen() также делала это в случаях, когда GAS пересматривал свои разрешения, так как мы использовали этот лист. Затем, когда я все еще получал эту ошибку "Загрузка...", я перезагружал веб-страницу (так что лист), и, по крайней мере, для этих случаев этой отвратительно неопределенной ошибки, она исчезла, и вычисления работали нормально:)
TL;DR - Попробуйте продублировать вкладку листа и удалить старую
Сегодня я боролся с этой проблемой и попробовал некоторые из упомянутых подходов. По разным причинам переименовать функцию у меня было невозможно.
Было очень ясно, что если бы я вызвал свою функцию вот так в ячейке X25:
=myFunction("a", 1, "b", 2, "c", 3)
Ячейка застряла бы "Загрузка...", а при небольшом изменении параметра (например, преобразовании числа в строку) ячейка будет оценивать нормально.
=myFunction("a", "" & 1, "b", 2, "c", 3)
Простое копирование кода в другую ячейку (например, X24) и выполнение его там, казалось, обошли проблему. Как только я вернул его к исходным параметрам или ячейке, он снова застрял "Загрузка...". Так что я бы предположил, что это какое-то кеширование "Cell ID", функции и параметров, которое сводит с ума на стороне Google.
Моим достаточно хорошим решением было просто продублировать вкладку "Лист", удалить старую и, наконец, переименовать новую в исходное имя. Это решило проблему для меня.
Проблема в том, что когда ячейка формулы пользовательской функции начинает показыватьLoading...
пользовательская функция вообще не вызывается . Таким образом, код в проекте скрипта не вступает в игру. Даже самые простые пользовательские функции иногда страдают от этой проблемы.
Проблема обычно исчезает, если вы очистите ячейку с формулой и отмените или немного отредактируете параметры пользовательской функции, чтобы вызвать ее переоценку. Но это не решает проблему. Google много лет тянул с решением основной причины.
Чтобы привлечь внимание Google к проблеме, отметьте ее звездочкой 233124478 в системе отслеживания проблем. Щелкните значок звездочки ☆ в верхнем левом углу, чтобы проголосовать за решение проблемы и получить уведомление об изменении статуса. Пожалуйста, не публикуйте ответ «я тоже» или «+1», а просто нажмите на значок звездочки. Google отдает приоритет проблемам с наибольшим количеством звезд.
У меня также была ошибка "загрузка данных...", но ни одно из описанных здесь исправлений не помогло мне. Это, кажется, не было вызвано проблемами, описанными здесь. В моем случае я сузил проблему до конкретной операции с плавающей запятой (мне кажется, что это настоящая ошибка в Google Sheets) и задокументировал один из возможных способов решения этой проблемы:
Google Sheets / Apps "Ошибка загрузки данных": есть ли лучший обходной путь?
Подводя итог (по просьбе комментатора Стива), если ячейка с
= myfunction(B10)
сгенерировал ошибку "загрузка данных", тогда для меня это можно исправить, обернув аргумент в функцию "value()":
= myfunction(value(B10))
который преобразует число в ячейке B10 (которое выглядело как нормальное число, но каким-то образом вызывало проблемы) в нормальное число, которое работает нормально.
Обновление 2022
Похоже, эта ошибка все еще происходит. Я пробовал ВСЕ решения, упомянутые здесь, но ни одно из них не сработало.
Что сработало, так это начать с чистого листа. Я воссоздал файл, скопировал и вставил свои данные, повторно применил предпочтительный стиль и формат, и, о чудо, лист, наконец, смог извлечь данные, используя мои пользовательские функции.
Это определенно ошибка со стороны Google, и это тем более раздражает, потому что они удалили кнопку «Сообщить о проблеме» из раздела «Помощь».
Не берите в голову
Более новый лист тоже перестал работать. Это так раздражает..
У меня также была проблема, которую вы объяснили. Кажется, что это может быть вызвано несколькими способами.
Я обнаружил, что моя пользовательская функция отображает эту ошибку, потому что она опирается на данные из =IMPORTRANGE()
звонок, и этот звонок не удался.
В конце концов я обнаружил, что =IMPORTRANGE()
вызов не удался, потому что я забыл обновить URL, с которого он импортировал, когда я загрузил новую версию этого импортированного листа. Кажется, что попытка IMPORTRANGE из загруженного файла может вызвать бесконечную ошибку "Загрузка...".
Я не могу добавить комментарий, но я хотел бы сказать, что у меня также была эта проблема сегодня, после 2 лет успешной работы листа, и я нашел эту ветку, основанную на поиске ответов. Я использовал решение, предоставленное выше, чтобы переименовать функцию и заменить имя, где это уместно, на листе. Это было легко для меня, так как у меня был только один экземпляр функции, вызываемой на листе. Но, как только я переименовал / заменил, лист снова начал функционировать.
Для меня переименование пользовательской функции решило проблему. Пока, по крайней мере.
Дополнения
У меня было два дополнения, и ни одна функция не загружалась.
Я их убрал, и все хорошо!
Я столкнулся с похожей проблемой с importrange из другой таблицы.
На самом деле в электронной таблице вы должны получить что-то вроде "Разрешения на доступ" к электронной таблице, к которой вы подходите с помощью importrange. Но она застряла навсегда, и все советы, такие как очистка кэша и т. Д., Не сработали.
В конце концов я продублировал электронную таблицу, и в этой новой электронной таблице он запросил разрешение, и теперь все работает нормально.
Так что это может помочь дублировать вашу таблицу
Это была проблема со мной.
По какой-то причине лист не связывал листы, потому что у него не было разрешения.
Копирование на новый лист позволило получить разрешение, и это сработало.
Я столкнулся с похожей проблемой с importrange из другой таблицы.
На самом деле в электронной таблице вы должны получить что-то вроде "Разрешения на доступ" к электронной таблице, к которой вы подходите с помощью importrange. Но она застряла навсегда, и все советы, такие как очистка кэша и т. Д., Не сработали.
В конце концов я продублировал электронную таблицу, и в этой новой электронной таблице он запросил разрешение, и теперь все работает нормально.
Так что это может помочь дублировать вашу таблицу.
Просто чтобы добавить ответ 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)
Мой скрипт приложения, извлекающий данные из моей базы данных MSSQL, просто отлично отображался в GoogleSheets на моем ноутбуке, но затем не отображался в приложении Android GS.
По этой теме, похоже, есть ряд проблем, которые могут вызвать это, но ответ @DestinyArchitect выше: "Разрешения казались самым простым решением".
Во время тестирования скрипта моего приложения для этого файла GoogleSheet отключен общий доступ. После того, как я переместил его в папку своей команды, где у нас по умолчанию включен общий доступ с несколькими членами команды, данные MSSQL показывались прямо на GoogleSheet в моем приложении Android GS.
Легко исправить, на этот раз...
В моем случае с этой проблемой столкнулись несколько ячеек, использующих функции, но простой ответ был... подождите.
В моем случае я очищал данные с помощью функций importXML по нескольким строкам и столбцам. Я был в восторге от результатов, чувствуя себя на вершине мира, а затем "Загрузка..." начала показывать свое уродливое лицо. Слишком долго. Вот так я оказался здесь в режиме устранения неполадок, нетерпеливый и расстроенный тем, что Google поступил со мной неправильно.
Я пробовал здесь многие решения, но обнаружил, что мой антагонист «Загрузка ...» ведет себя непредсказуемо, появляясь случайным образом, как whacamoles, ничего общего с самим кодом.
Так. В моем случае это был вопрос ожидания (около часа для некоторых строк, но у меня было так много ячеек, извлекающих данные URL).
Мое непрофессиональное предположение заключается в том, что получение данных, подобных этому, помещается в их конвейер полосы пропускания, меньший приоритет, чем ввод URL-адреса в строку поиска или другие запросы пользователя.
В моем случае ячейка застряла с Loading...
сообщение из-за "вероятно" состояния гонки между функциями и разрешениями формул.
Это моя настраиваемая функция:
function ifBlank(value1, value2) {
return !!value1 ? value1 : value2;
}
Это формула, называющая это:=IFBLANK(VLOOKUP($A2,Overrides!$A$2:$E,5,FALSE),VLOOKUP($A2,'_resourceReq'!$A$2:$C,3))
Те VLOOKUP
значения могут быть довольно сложными, и на их разрешение может потребоваться некоторое время.
Решение: (в моем случае)
Обертывание VLOOKUP()
в TO_TEXT()
или VALUE()
например.
Итак, изменив формулу на =IFBLANK(TO_TEXT(VLOOKUP($A2,Overrides!$A$2:$E,5,FALSE)),TO_TEXT(VLOOKUP($A2,'_resourceReq'!$A$2:$C,3)))
работал хорошо.
Если это не сработает, возможно, попробуйте преобразовать значение из функции в ячейку, прежде чем использовать его в качестве аргумента вашей пользовательской функции.