Expiration du délai de connexion - Appscript - Comment l'augmenter ?

Bonjour à tous,

Après des recherches infructueuses, je viens vers vous car voilà plusieurs semaines que mon code appscript retourne de plus en plus fréquemment cette erreur :

"Expiration du délai de connexion au service Feuilles de calcul lors de l'accès au document portant l'ID XXXXXXXXXXXXXXXXXX"

C'est un fichier sheets, lié à plusieurs Gform, dont le dépôt entraine des actions dans le sheets + il y a des commandes dans le sheets pour déclencher des actions.

Il y a une dizaine d'utilisateurs, et parfois le dépôt d'une réponse Gform intervient en même temps qu'une manipulation dans le sheets. Auparavant, tout fonctionnait très bien, mais depuis quelques temps, je reçois de plus en plus fréquemment (5 à 6 fois par jour) le message d'erreur cité au dessus. Le code ne contient pas d'erreur, même si il pourrait très probablement être optimisé, je suis un développeur amateur dans le cadre de mes projets.

Le problème est qu'après ces erreurs, évidemment le code s'arrête, et les infos ne remontent pas, ce qui pose des problèmes opérationnels dans mon service !

Pouvez vous m'expliquer, ou me donner si ça existe, une solution pour augmenter ce délai de connexion, afin que les actions s'exécutent jusqu'au bout ?

PS : je travaille dans une entreprise qui ne me permet pas de vous partager le fichier et son code... L'idée est de connaitre une solution générique dans les paramètres par exemple.

Merci de votre aide !

Bonjour,

J'utilise beaucoup apps script et pourtant je n'ai jamais rencontré cette erreur

Toutefois de ce que vous dites les actions sont étalées dans le temps, vous pourriez les regrouper afin d'en exécuter, plusieurs en même temps ?

Par exemple votre script se lance qu'une fois tous les formulaires complétés.

Sinon, vous pouvez vous servir de try {}catch{} afin de travailler sur des erreurs mais si celles ci sont causées par un temps d’exécution trop long, ce n'est pas ciblable.

Autre possibilité, vous mesurez le temps d’exécution de votre script morceau par morceau et tentez des optimisation.

Bonjour Pierre,

Mince moi qui pensais que c'était un problème courant...

Je me suis mal exprimé : toutes les actions qui peuvent l'être sont regroupées dans des boucles communes, et chaque Gform différent déclenche une partie spécifique du code.

Toutes les boucles ont été optimisées (breaks lorsque match, etc...), mais j'ai l'impression que plus le sheets se charge en données (au fur et à mesure de l'utilisation), plus l'exécution ralentit et flirte avec le délai ! C'est là que mes compétences en dev s'arrêtent et je ne saurai pas optimiser plus...

D'où ma question de savoir si il est simplement possible d'augmenter ce fameux "délai d'exécution" !

Et en passant par un JSON en tampon ?

Les scripts issus des G-Form complète un JSON

Le script Gsheet va puiser sur ce JSON pour travailler

Bonjour,

Je ne sais pas si ça s'applique à ton cas, mais il faut limiter au maximum le nombre de requêtes.

Par exemple, si tu dois parcourir ta feuille avec une boucle, il faut récupérer tout le contenu en une fois avec getValues (avant la boucle) puis tester les valeurs dans ta boucle à partir de l'array obtenu. Si au contraire tu testes dans ta boucle les lignes une par une (avec une ou plusieurs requêtes par ligne), c'est infiniment plus lent.

Cordialement,

@Pierre,

Je ne connais pas cette méthode, comment l'active t-on ?

Pour être plus précis, lorsqu'un utilisateur complète un Gform, les réponses viennent s'écrire dans le sheets via le lien automatique proposé par la suite Google. Lorsque le script se déclenche, les données sont déjà écrites dans le sheets, car j'utilise 2 déclencheurs :

  • Basé sur la feuille de calcul - Lors d'une modification (Taux d'erreur = 3%)
  • Basé sur la feuille de calcul - Lors de l'envoi du formulaire (Taux d'erreur = 32% ) (Ce qui est normal en réalité car les utillsateurs utilisent très majoritairement les Gform plutôt que les commandes du sheets)

@Sébastien,

C'est bien dans une boucle for que le code plante, la recherche d'une condition dans le sheets prend trop de temps à mesure que le fichier se remplit de lignes.

Il y a 4 if avec des sous boucles for dans cette boucle principale. Pourtant à chaque if je ne recherche qu'une seule correspondance, et le "break" est bien placé pour achever la boucle lorsque la condition est remplie...

Avant de lancer les boucles for, j'utilise la méthode "range" pour définir le cadre de recherche. Mais effectivement je ne récupère pas le contenu AVANt de lancer la boucle. La boucle teste les lignes 1 par 1 !

Je ne connais pas la méthode "Array", mais j'imagine qu'il y a des tutos sur le forum ?

lorsqu'un utilisateur complète un Gform, les réponses viennent s'écrire dans le sheets

Au lieu de faire ça tu créer un fichier JSON à partir de la trame des tes données :

let donnees = {
"nom":"machin",
"prenom":"truc",
"age":1
};

let json = JSON.stringify(donnees);
let folder = DriveApp.getFolderById('129U1z8sdsfX6Pb8mTNv'); // dossier cible
   folder.createFile('archivage.json', jsonString, MimeType.PLAIN_TEXT); // SAUVEGARDE

Puis quand tu veux ajouter des données tu procède ainsi :

  var fichier = DriveApp.getFileById('ID du fichier JSON'); // ou par URL
  var jsonData = JSON.parse(fichier.getBlob().getDataAsString());

  var nouvelleDonnee = {
    "nom": "bidule",
    "prenom": "azerty",
    "age": 999,
  };

  jsonData.push(nouvellePersonne);
  let nouveauContenu = JSON.stringify(tableauJSON);
  fichier.setContent(nouveauContenu);
}

Pour ton traitement de script sheet, tu importe le JSON et tu peux le traiter :

  var fichier = DriveApp.getFileById('ID du fichier JSON'); // ou par URL
  var jsonData = JSON.parse(fichier.getBlob().getDataAsString());

Avant de lancer les boucles for, j'utilise la méthode "range" pour définir le cadre de recherche. Mais effectivement je ne récupère pas le contenu AVANt de lancer la boucle. La boucle teste les lignes 1 par 1 !

Pour résumer grossièrement, si tu as par exemple 10'000 lignes et que tu le fais avant, ça fait 1 requête ... Si tu le fais à chaque ligne, c'est 10'000 requêtes à traiter pour Google ... Donc si tu as 1 requête VS 10'000 requêtes, je te laisse imaginer l'impact sur le temps d'exécution du script

Pour mieux comprendre tout ça, j'ai créé un exercice pratique simple avec un exemple de ce cas et qui montre bien la différence entre une boucle optimisée ou non :

Je ne connais pas la méthode "Array", mais j'imagine qu'il y a des tutos sur le forum ?

Je voulais simplement parler d'un tableau [].

Si tu débutes et que ce n'est pas clair pour toi, tu as le cours Apps Script du site et notamment ces 2 pages sur les tableaux :

Merci beaucoup pour vos réponses !

Je vais étudier les 2 solutions, mais je pense que celle de Sébastien correspond davantage au problème rencontré !

Je reviendrai clôturer le sujet une fois les tests terminés !

Et c'est beaucoup plus simple à mettre en place et maintenir, d'optimiser le script que de prévoir une solution avec du JSON.

Rechercher des sujets similaires à "expiration delai connexion appscript comment augmenter"