Новые пользовательские функции 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 (которое выглядело как нормальное число, но каким-то образом вызывало проблемы) в нормальное число, которое работает нормально.