web-dev-qa-db-fra.com

Les nouvelles fonctions personnalisées de Google Sheets affichent parfois "Chargement en cours ..." indéfiniment

SPÉCIFIQUE POUR: "NOUVELLES" feuilles de Google seulement.

Ceci est un problème connu comme le souligne Google dans les nouvelles feuilles.

Problèmes: Si vous écrivez complexe* fonctions personnalisées dans google-apps-script pour les feuilles Google, vous rencontrerez parfois des cellules qui affichent une zone d'erreur rouge autour de la cellule avec le texte "Chargement ..."

Google a suggéré:

Si cela se produit, essayez de recharger la page ou de renommer la fonction et de remplacer toutes les références par le nouveau nom.

Cependant, pour les autres développeurs rencontrant ce problème (et qui ne peuvent pas échapper à l'erreur "chargement ..."), j'ai écrit mes conclusions dans la réponse ci-dessous sur la façon de surmonter ce problème (avec des limitations) de manière cohérente.


*Nous traitons cette question comme la réponse canonique pour le problème indéfini "Erreur ... Chargement de données" de Google Sheet. Ce n'est pas limité aux fonctions complexes ou lentes.

19
Angelo

J'ai également eu le problème de chargement infini avec la fonction suivante.

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

Il s'avère que vous ne devriez pas avoir un ";" Supprimer le point-virgule a résolu le problème.

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

Cela fonctionne comme on pourrait s'y attendre.

6
Azmo

FWIW, je viens de le rencontrer et le coupable a fini par être un appel getRange() qui a généré plusieurs milliers de lignes dans un tableau. Périodiquement, le message "Chargement ..." était bloqué.

J'ai résolu le problème en mettant cette plage dans le cache de documents. C'est un peu compliqué car le cache ne stocke que des chaînes, pas des tableaux, mais vous pouvez le forcer dans un tableau à l'aide de .split(',') lorsque vous devez accéder à ce tableau. 

(Dans mon cas, il s’agit d’un tableau unique. Il existe probablement un moyen de le faire en envoyant chaque ligne ou colonne dans son propre cache ou en lisant la valeur du cache à N éléments à la fois, chaque N tableau.)

Voici le bit pertinent de mon 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
}

Il s'agit certainement d'un bogue dans Apps Script - getRange () ne devrait pas être suspendu sans un délai d'attente ou un message d'erreur. Mais au moins, il existe une solution de contournement. Voici le bogue que j'ai ouvert contre, où j'ai également mis le code.gs complet de ma feuille.

4
Aaron Weiss

J'ai aussi eu le problème que vous avez expliqué. Il semble que cela puisse être causé de plusieurs façons.

J'ai fini par constater que ma fonction personnalisée affichait cette erreur car elle reposait sur les données d'un appel =IMPORTRANGE() et que cet appel échouait.

J'ai finalement trouvé que l'appel =IMPORTRANGE() échouait parce que j'avais oublié de mettre à jour l'URL à partir de laquelle l'importation était effectuée lorsque j'avais téléchargé une nouvelle version de cette feuille importée à partir. Il semble que le fait d’essayer d’IMPORTRANGE à partir d’un fichier mis à la corbeille puisse provoquer l’erreur infinie "Loading ...".

2
bhekman

Une cause: les autorisations nécessitant une autorisation.

En ce qui concerne {ce problème, il est préférable de formuler les résultats de cellule d’une fonction personnalisée affichant le message dégoûtant-vague 'Chargement ... Erreur: chargement de données ...'}, en effet dans le cas où toutes les instances du même message/Appel de fonction personnalisé similaire affichant cette erreur, c’est que Google Sheets a besoin d’autorisations pour exécuter le script (cela signifie souvent qu’il n’était pas nécessaire auparavant), donc au lieu de {agir correctement: puis inviter l’utilisateur à indiquer ces autorisations, sinon renvoyant cette erreur}, Sheets se bloque à la place avec cette erreur dégoûtante et vague.

Des autorisations supplémentaires peuvent être nécessaires à partir de 1 ou plus:

  1. Les scripts d’application Google ont depuis réécrit leur structure d’autorisations - comment ce problème m’est-il maintenant arrivé, selon ma note interne O80U3Z.
  2. Votre code ou une bibliothèque qu’il utilise a été modifié pour nécessiter plus d’accès ... mais dans ce cas, vous avez beaucoup plus de chances de deviner la cause de cette erreur vague et dégoûtante, alors espérons-le, ne le lirez pas ici.

Pour résoudre ce problème, j’ai explicitement exécuté mon code de feuille de calcul GAS en cliquant sur l’une de mes fonctions de menu personnalisées et, dans «l’éditeur de script», en exécutant l’une de mes fonctions JS personnalisées, notamment «onOpen ()», qui est la plus complète. Le premier m'a promu pour de nouvelles autorisations, via la fenêtre contextuelle ‘Autorisation requise
L’application "MM6ZBT (script MM6Z83)" nécessite une autorisation pour être exécutée. ’, Bien que onOpen () l’ait également fait dans les cas où GAS révisait ses autorisations depuis que nous utilisions cette feuille. Puis, comme j'avais toujours cette erreur 'Chargement ...', j'ai rechargé la page Web (donc la feuille), et, au moins pour ces cas de cette erreur écoeurante et vague, elle avait disparu et les calculs avaient bien fonctionné: - )

2

Conseil important: créez plusieurs copies de votre feuille de calcul au fur et à mesure de vos expériences. J'ai eu 3 feuilles de calcul Google corrompues et rendues complètement inaccessibles (bloquées dans une boucle de rafraîchissement). C'est ce qui s'est passé lorsque j'ai expérimenté des fonctions personnalisées, vous avez donc été averti!

Vous voudrez essayer un ou plusieurs des moyens suivants pour résoudre ce problème:

  1. Comme suggéré par Google, essayez de recharger la feuille de calcul, de renommer la fonction ou de modifier les paramètres de la cellule pour voir si cela résout le problème.

  2. Entourez TOUTES vos fonctions personnalisées dans un bloc try-catch. Cela aidera à détecter les problèmes de code que vous n'avez peut-être pas testés correctement. Par exemple:

    try { // méthodes } catch (ex) { renvoie "Exception:" + ex; }

  3. Revenez aux anciennes feuilles , testez vos fonctions et recherchez tout autre type d'erreur, tel qu'une boucle infinie ou un format de données non valide. Si la fonction ne fonctionne pas dans les anciennes feuilles, cela ne fonctionnera pas dans les nouvelles feuilles et il sera plus difficile de déboguer.

  4. Assurez-vous que NONE, parmi vos paramètres, ne peut, n’attend ou ne contiendra jamais un nombre supérieur à 1 million (1000000). Aucune idée pourquoi, mais utiliser un nombre supérieur à un million en tant que paramètre empêchera votre fonction de s'exécuter. Si vous devez le faire, demandez à ce que l’entrée soit réduite (divisez peut-être par 1000 ou demandez M au lieu de mm).

  5. Recherchez des problèmes numériques ou à virgule flottante dans lesquels les nombres peuvent dépasser un ensemble normal de chiffres significatifs. Les nouvelles feuilles semblent un peu problématiques avec les chiffres, donc si vous attendez des nombres très grands ou très complexes, vos fonctions risquent de ne pas fonctionner.

Enfin, si rien de ce qui précède ne fonctionne, passez aux anciennes feuilles de Google et continuez de travailler. Si vous rencontrez d’autres limitations ou causes d’échec de l’exécution de certaines fonctions, veuillez les écrire ci-dessous pour utilisateurs g-sheet lourds!

1
Angelo

Je ne peux pas ajouter de commentaire, mais je tenais à préciser que j'avais également ce problème aujourd'hui, après 2 ans d'utilisation de la feuille, et j'ai trouvé ce fil basé sur la recherche de réponses. J'ai utilisé la solution fournie ci-dessus pour renommer la fonction et remplacer le nom, le cas échéant, dans la feuille. C'était facile pour moi, car je n'avais qu'une seule fois l'appel de la fonction dans la feuille. Mais dès que j'ai renommé/remplacé, la feuille a recommencé à fonctionner.

1
Jimmy

Add-ons

J'avais deux add-ons, et aucune fonction ne se chargeait.

Je les ai enlevés et tout va bien!

1
Mirror318

Pour moi, renommer la fonction personnalisée a résolu le problème. Pour le moment au moins.

0
Martin Hallén

Juste pour ajouter à la réponse de Azmo ...

En fait, j'ai supprimé tous les points-virgules de fin du code:

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

Et nous avons découvert qu’en effectuant cette opération sur une large plage, vous pouvez également maximiser le nombre acceptable d’appels à l’API.

Pour contourner le problème, j’ai ajouté une vérification IF THEN à mon appel de script personnalisé.

Donc au lieu de:

=checkedOff(H10,H11)

Utilisez quelque chose comme ceci pour vérifier si un champ est rempli avant l'exécution:

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

0
d3m0n1cd4rkn355