it-swarm.com.ru

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

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

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

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

Google предложил:

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

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


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

19
Angelo

У меня также была проблема бесконечной загрузки со следующей функцией.

// 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;
}

Это работает, как и следовало ожидать.

6
Azmo

Я только что столкнулся с этим, и преступник оказался вызовом 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 из моего листа.

4
Aaron Weiss

У меня также была проблема, которую вы объяснили. Кажется, что это может быть вызвано несколькими способами.

В итоге я обнаружил, что моя пользовательская функция отображала эту ошибку, потому что она основывалась на данных из вызова =IMPORTRANGE(), и этот вызов не удался.

В конце концов я обнаружил, что вызов =IMPORTRANGE() сбой, потому что я забыл обновить URL-адрес, с которого он импортировал, когда я загрузил новую версию этого импортированного из листа. Похоже, что попытка IMPORTRANGE из загруженного файла может привести к бесконечной ошибке «Загрузка ...».

2
bhekman

Одна из причин: разрешения требуют авторизации.

Что касается {этой проблемы, лучше сформулировать результат (ы) ячейки пользовательской функции, отображающей отвратительно неопределенное сообщение «Загрузка ... Ошибка: загрузка данных ...»}, действительно в случае, когда все экземпляры одинаковы/аналогичный вызов пользовательской функции, отображающий эту ошибку, заключается в том, что Google Sheets нужны разрешения для запуска сценария (часто дополнительно: это означало, что в прошлом они не требовались), поэтому вместо того, чтобы {действовать надлежащим образом, затем запрашивать у пользователя эти разрешения еще возвращая эту ошибку}, Sheets вместо этого зависает с этой отвратительно неопределенной ошибкой.

Дополнительные разрешения могут потребоваться от 1 или более:

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

Чтобы исправить это, я явно запустил свой код электронной таблицы GAS, щелкнув по одной из моих пользовательских функций меню и в «редакторе сценариев», запустив одну из моих пользовательских функций JS, в частности, «onOpen ()», поскольку она наиболее полная. Первый выдвинул меня за действительно новые разрешения через всплывающее окно ‘Требуется авторизация
Для запуска приложения «MM6ZBT (скрипт MM6Z83)» требуется авторизация. », Хотя onOpen () также делала это в случаях, когда GAS пересматривал свои разрешения, так как мы использовали этот лист. Затем, когда я все еще получал эту ошибку «Загрузка ...», я перезагружал веб-страницу (так что лист), и, по крайней мере для этих случаев этой отвратительно неопределенной ошибки, она исчезла, и вычисления работали нормально: )

2
Destiny Architect

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

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

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

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

    попробуй { // методы } catch (ex) { return "Exception:" + ex; }

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

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

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

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

1
Angelo

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

1
Jimmy

Дополнения

У меня было два дополнения, и ни одна функция не загружалась.

Я их убрал, и все хорошо!

1
Mirror318

Для меня переименование пользовательской функции решило проблему. Пока, по крайней мере.

0
Martin Hallén

Просто чтобы добавить ответ 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)

0
d3m0n1cd4rkn355