33
votes

SPECIFIC FOR: "NEW" google sheets only.

This is a known issue as highlighted by google in the new sheets.

Issues: If you write complex* custom functions in google-apps-script for google sheets, you will occasionally run into cells which display a red error box around the cell with the text "Loading..."

Google has suggested:

If this occurs, try reloading the page or renaming the function and changing all references to the new name.

However for other developers experiencing this issue (and who are unable to escape the "loading..." error), I've written my findings in the answer below on how to get past this (with limitations) consistently.


*We're treating this question as the canonical answer for Google Sheet's indefinite "Error... Loading data" problem. It's not limited to complex or slow functions.

13
The ‘This is a known issue as highlighted by google in the new sheets.’ link appears it should be directly to developers.google.com/apps-script/migration/… --pls update. But if ‘This issue’ IS that 1 ‘highlighted’, the description here is missing say that URL‘s last 4 words ‘arguments must be deterministic’ or equivalent (-why missing here?) as infinite valid reasons (as infinite loop or big op) for ‘Loading’ to be hung or very slow so excluding that, so then the alert is misleading or wrong error message, is key. What intended here?Destiny Architect
As with virtually all info esp quoted, pls cite the source: for ‘Google has suggested’; the source appears to be web.archive.org/web/20140311062149/https://… ...but also note by that that the quoted text is now removed -why? -because Google now considers this fixed? -I certainly hope not, as I routinely experience certain custom functions, which are short & fast still {mostly but regularly not always} infinitely hang with ‘Loading... Error: loading data...’ -my current biggest problem with Sheets: why I read here now.Destiny Architect
Glad I came across this post, simply renaming my function called fixed the loading problem. I had already optimized the tar out of the scripts with caching and dependency injection and was scratching my head only to realize it wasn't me. Works fast as lightning now.Gary
This bug looks like a caching design flaw, it's been around for years without any real solution. There doesn't seem to be any open issue about this. I found an easy way to reproduce the issue: just "publish" the sheet that is using custom functions and after a few hours without opening the real sheet, the published cached version will either contain "#NAME?" or "Loading..." until you reopen the editable version of the sheet... This bug also seems to happen more often if you use "large" ranges as input to your function calls.2072

13 Answers

7
votes

I also had the infinite loading issue with the following function.

// check if an item can be checked off
function checkedOff( need, have ) {
  var retStr = "nope";
  if( have >= need ){
    retStr = "yep";
  }
  return retStr;
};

Turns out you shouldn't have a trailing ";". Removing the semicolon solved the problem.

// check if an item can be checked off
function checkedOff( need, have ) {
  var retStr = "nope";
  if( have >= need ){
    retStr = "yep";
  }
  return retStr;
}

This runs as one would expect.

5
votes

FWIW, I just ran into this and the culprit ended up being a getRange() call that pulled several thousand rows into an array. Periodically it would get hung on the "Loading..." message.

I worked around it by putting that range into the document cache. It's a little kludgy because the cache only stores strings, not arrays, but you can force it back into an array using .split(',') when you need to access the array.

(In my case it's a single array. There's probably a way to do it using a double array, either by sending each row or column into its own cache, or reading the cache value back N items at a time, each N becoming its own array.)

Here's the relevant bit from my code:

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
}

This is definitely a bug in Apps Script -- getRange() shouldn't hang without a timeout or error message. But at least there's a workaround. Here's the bug I opened against it, where I've also put the full code.gs from my sheet.

4
votes

One cause: Permissions needing authorizing.

As far as {this problem, better phrased the cell result(s) of a custom function displaying the disgustingly-vague message ‘Loading... Error: loading data...’}, indeed in the case where all instances of the same/similar custom function call displaying this error, is that Google Sheets needs permissions to run the script (often additionally: meaning in the past it didn't need these), so instead of {acting appropriately: then prompting the user for these permissions else returning that error}, Sheets instead hangs with this disgustingly vague error.

Additional permissions can be needed from 1 or more:

  1. Google App Scripts has since rewriting their permission structure --how this problem now just happened to me, per my internal note O80U3Z.
  2. Your code or some library it uses made changes to require more access ...but in this case you have a much better chance of guessing the cause of this disgustingly-vague error, so hopefully won't be reading here.

To fix, I explicitly ran my GAS spreadsheet code by both: clicking one of my custom menu functions and, in the ‘script editor’, running one of my custom JS functions notably the ‘onOpen()’ since that is most comprehensive. The first promoted me for indeed new permissions, via popup ‘Authorization Required
The application "MM6ZBT(MM6Z83 script)" needs authorization to run.’, though onOpen() also did this in cases of GAS revising its permissions since we used that sheet. Then, as I was still getting this ‘Loading...’ error, I reloaded the web page (so the sheet), and, at least for these cases of this disgustingly vague error, it was gone and the computations worked fine :-)

3
votes

Important Tip: Create multiple copies of your entire spreadsheet as you experiment. I have had 3 google spreadsheets corrupted and rendered completely in-accessible (stuck in a refresh loop). This has happened when I was experimenting with custom functions so YOU HAVE BEEN WARNED!

You will want to try one or many of the following ways to fix this issue:

  1. As suggested by google, try re-loading the spreadsheet or re-naming the function or changing the parameters in the cell to see if this fixes the issue.

  2. Surround ALL your custom functions in a try-catch block. This will help detect code issues you may not have tested properly. Eg:

    try{ //methods }catch(ex){ return "Exception:"+ex; }

  3. Revert to the old sheets and test your functions and check for any other type of error such as an infinite loop or invalid data format. If the function does not work in the old sheets, it will not work in the new sheets and it will be more difficult to debug.

  4. Ensure NONE of your parameters refer to, can expect to or will ever contain a number larger than 1 million (1000000). No idea why but using a number larger than a million as any parameter will cause your function to fail to execute. If you have to, ask the input to be reduced in size (maybe divide by 1000 or ask for M instead of mm).

  5. Check for numeric or floating point issues where numbers may exceed a normal set of significant figures. The new sheets seems to be a little glitchy with numbers so if you are expecting very large or very complex numbers, your functions may not work.

Finally, if none of the above work, switch to the old google sheets and continue working. If you find any other limitations or causes for functions to fail to execute, please write them below for me and other users who are heavy g-sheet users!

3
votes

I also had the "loading data..." error but none of the fixes described here worked for me. It didn't seem to be caused by the issues described here. In my case, I narrowed it down to a specific floating point operation issue (it looks like a real bug in Google Sheets to me), and documented one possible work around at

Google Sheets / Apps "Loading data" error: is there a better workaround?

To summarize (at the request of commenter Steve), if a cell with

   = myfunction(B10)

generated a "loading data" error, then for me it could be fixed by wrapping the argument in a "value()" function:

   = myfunction(value(B10))

which converts the number in cell B10 (which seemed like a normal number but generated problems somehow) into a normal number that works fine.

2
votes

I also had the problem that you explained. It seems that it can be caused in more than one way.

I ended up finding that my custom function was displaying that error because it relied on data from an =IMPORTRANGE() call, and that call was failing.

I eventually found that the =IMPORTRANGE() call was failing because I had forgotten to update the URL that it was importing from when I had uploaded a new version of that imported-from sheet. It seems that trying to IMPORTRANGE from a trashed file can cause the infinite "Loading..." error.

1
votes

For me, renaming the custom function solved the problem. For now at least.

1
votes

Add-ons

I had two add-ons, and no function was loading.

I removed them, and all is well!

1
votes

TL;DR - Try duplicating the sheet tab and delete the old one

I struggled with this issue today, and tried some of the approaches mentioned. For various reasons, renaming the function wasn't possible for me.

It was very clear that if I called a my function like this in cell X25:

=myFunction("a", 1, "b", 2, "c", 3)

The cell would be stuck "Loading...", while just changing a parameter slightly (e.g. converting a number to a string) the cell would evaluate fine.

=myFunction("a", "" & 1, "b", 2, "c", 3)

Just copying the code into another cell (e.g. X24) and executing it there seemed to bypass the problem. As soon as I moved it back to the original parameters or cell, it got stuck "Loading..." again. So I would assume it's some kind of caching of "Cell ID", function and parameters that go bonkers on Google's side.

My good-enough solution was to simply duplicate the Sheet tab, delete the old one, and finally rename the new one back to the original name. This solved the problem for me.

0
votes

Just to add to Azmo 's answer...

I in fact removed all trailing semi-colons from the code:

// check if an item can be checked off
function checkedOff( need, have ) {
  var retStr = "nope"
  if( have >= need ){
    retStr = "yep"
  }
  return retStr
}

And discovered, that when doing this over a large range you can also max out the acceptable number of calls to the API.

To get around it I added an IF THEN check around my custom script call.

So instead of:

=checkedOff(H10,H11)

Use something like this to check for a populated field before execution:

=if(H17<>"-",checkedOff(H10,H11),0)

0
votes

I ran up to a similar problem with importrange from another spreadsheet.

Actually in the spreadsheet you should get something like "Permission to access" the spreadsheet you approach with importrange But it got stuck forever in this and all tips like clearing cache etc. didn't worked.

Eventually I duplicated the spreadsheet and in this new spreadsheet it asked for the permission and all works fine now.

So it might help to duplicate your spreadsheet.

0
votes

My app script pulling data from my MSSQL database displayed just fine on GoogleSheets my laptop browser but then did not display on the Android GS app.

Per this thread it looks like there's a number of issues that could cause this, but @DestinyArchitect's answer above re: Permissions seemed like the simplest fix.

While testing my app script, Sharing was off for this GoogleSheet file. Once I moved it to my team's folder where we have default Sharing switched on with a few team members, the MSSQL data showed right up on the GoogleSheet in my Android GS app.

Easy fix, this time...

0
votes

In my case, the cell was stuck with a Loading... message due to "probably" a race condition between functions and formulas resolutions.

This is my custom function:

function ifBlank(value1, value2) {
  return !!value1 ? value1 : value2;
}

This is the formula calling it: =IFBLANK(VLOOKUP($A2,Overrides!$A$2:$E,5,FALSE),VLOOKUP($A2,'_resourceReq'!$A$2:$C,3)) Those VLOOKUP values could be pretty complex and could also take some time to resolve.

Solution: (in my case)

Wrapping the VLOOKUP() into TO_TEXT() or VALUE() for example.

So, changing the formula to =IFBLANK(TO_TEXT(VLOOKUP($A2,Overrides!$A$2:$E,5,FALSE)),TO_TEXT(VLOOKUP($A2,'_resourceReq'!$A$2:$C,3))) worked well.

If that doesn't work maybe try resolving the value from a function into a cell before using it as the argument of your custom function.