Новые пользовательские функции Google Sheets иногда отображают "Загрузка..." бесконечно

ОСОБЕННО ДЛЯ: "НОВЫХ" только в Google листах.

Это известная проблема, выделенная Google на новых листах.

Проблемы: если вы пишете сложные * пользовательские функции в google-apps-script для листов google, вы иногда будете сталкиваться с ячейками, которые отображают красное поле с ошибкой вокруг ячейки с текстом "Загрузка..."

Google предложил:

Если это происходит, попробуйте перезагрузить страницу или переименовать функцию и изменить все ссылки на новое имя.

Однако для других разработчиков, испытывающих эту проблему (и которые не могут избежать ошибки "загрузка..."), я написал свои выводы в ответе ниже о том, как последовательно преодолеть эту проблему (с ограничениями).


* Мы рассматриваем этот вопрос как канонический ответ на неопределенную проблему "Ошибка... Загрузка данных" в Google Sheet. Это не ограничено сложными или медленными функциями.

18 ответов

Важный совет: создавайте несколько копий всей таблицы в процессе эксперимента. У меня 3 таблицы Google повреждены и полностью недоступны (застряли в цикле обновления). Это произошло, когда я экспериментировал с пользовательскими функциями, так что вы были предупреждены!

Вы можете попробовать один или несколько из следующих способов, чтобы решить эту проблему:

  1. В соответствии с предложением Google попробуйте перезагрузить электронную таблицу или переименовать функцию или изменить параметры в ячейке, чтобы убедиться, что это решит проблему.

  2. Окружите ВСЕ ваши пользовательские функции блоком try-catch. Это поможет обнаружить проблемы с кодом, которые вы, возможно, не протестировали должным образом. Например:

    try {// методы}catch(ex){ return "Exception:"+ex; }

  3. Вернитесь к старым листам и протестируйте свои функции и проверьте на наличие любых других типов ошибок, таких как бесконечный цикл или неверный формат данных. Если функция не работает на старых листах, она не будет работать на новых листах, и ее будет сложнее отлаживать.

  4. Убедитесь, что ни один из ваших параметров не относится, не может ожидать или будет содержать число больше 1 миллиона (1000000). Не знаю почему, но использование числа больше миллиона в качестве любого параметра приведет к сбою функции. Если вам нужно, попросите уменьшить размер входных данных (возможно, разделите их на 1000 или попросите M вместо мм).

  5. Проверьте для числовых или с плавающей запятой, где числа могут превышать нормальный набор значащих цифр. Новые таблицы кажутся немного затруднительными с числами, поэтому, если вы ожидаете очень большие или очень сложные числа, ваши функции могут не работать.

Наконец, если ничего из вышеперечисленного не работает, переключитесь на старые листы 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 или более:

  1. С тех пор Сценарии Google App переписали свою структуру разрешений - как эта проблема сейчас случилась со мной, согласно моей внутренней заметке O80U3Z.
  2. Ваш код или какая-то библиотека, которую он использует, внесли изменения, чтобы потребовать большего доступа... но в этом случае у вас гораздо больше шансов угадать причину этой отвратительно-неопределенной ошибки, так что, надеюсь, здесь не будут читать.

Чтобы исправить это, я явно запустил свой код электронной таблицы 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))) работал хорошо.

Если это не сработает, возможно, попробуйте преобразовать значение из функции в ячейку, прежде чем использовать его в качестве аргумента вашей пользовательской функции.