11
votes

Comment mettre en pause les scripts d'app jusqu'à la fin de la feuille de calcul

Parce que Google Spreadsheets ne prend pas en charge les itérations, j'ai écrit mon propre script d'application simple pour ajuster une entrée en fonction du calcul de la sortie de feuille de calcul. Cependant, après avoir changé la variable d'entrée, la feuille de calcul se recalcule mais des scripts d'application ne semblent pas attendre cette recalcul, donc je finis par récupérer des valeurs telles que "penser ..." ou "#na". Existe-t-il un moyen de mettre en pause un script et d'attendre que le calcul soit terminé avant de passer à la ligne suivante dans le script?

Actuellement, j'utilise simplement une boucle pour regarder la cellule, mais je voulais savoir s'il y avait un moyen plus élégant de mettre en pause l'exécution jusqu'à ce que la feuille soit effectuée en calcul.

J'écris beaucoup d'Excel Macros et Excel VBA attend toujours que le calcul terminé avant de passer à la ligne suivante dans le code. Les applications ne semblent pas le faire, donc j'espère qu'il existe un moyen facile de le faire.

Une deuxième question: parce que cette itération peut prendre un certain temps, comment une interruption et résilient-elles un script de fonctionnement? Je n'arrive pas à trouver un moyen de faire cela.


0 commentaires

5 Réponses :


5
votes

Délai de script après environ 6 minutes pour éviter les boucles infinies et exécuter constamment des programmes. Je ne pense pas qu'il y ait un moyen manuel d'arrêter un script.

Edit: Oups, j'ai oublié de répondre à votre première question: j'ai pensé qu'Eiltit a expliqué après la recalculition, mais apparemment, je n'utilise pas assez de formules pour voir cela. Si cela n'attend pas, le meilleur moyen est de faire quelque chose comme ceci: xxx

Il fait une pause du script pendant quelques secondes, puis vérifie à nouveau.


1 commentaires

Juste pour ce que ça vaut la peine, pour quiconque en regardant ce type de configuration pour le code de production en dehors des feuilles, il vaut la peine d'ajouter un compteur de chèques de santé à la santé (sortie de la boucle tandis que si le compteur frappe une valeur de grande valeur) car si pour une raison quelconque, cela ne le complète jamais verrouille un fil pour toujours. J'ai vu ce code apporter des serveurs quand ils ont lentement verrouillé chaque fil ...



0
votes

Vous pouvez mettre la structure récursive dans le fichier de code.js plutôt que sur la feuille de calcul. JavaScript peut vraiment gérer la récursion. Vous pouvez alors faire mettre à jour le script la feuille de calcul sur chaque itération (ou chaque 100).


0 commentaires

3
votes

J'écris également un peu dans Excel VBA, où les fonctions de calcul indigène sont pratiques. Je rencontre plusieurs fois le même problème dans Google Apps / Docs, désirant exécuter du code chaque fois que des calculs sont terminés. Je me demande pourquoi il n'y a pas de fonction native dans Google Apps / Docs pour gérer cela. Quoi qu'il en soit, j'ai écrit ce code pour résoudre le problème. J'espère que ça aide.

function onEdit() {

Refresh();

};

function Refresh () {

     var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1");
     var sheet2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");

     // set the range wherever you want to make sure loading is done    

     var range = sheet.getRange('A:A')
     var values = range.getValues();

     var string = values.toString();

     var loading = "Loading";

                    do
                      {var randomWait = Math.floor(Math.random()*1+0); randomWait;}
                    while (string.search(loading) ==! 0);

      range.copyTo(sheet2.getRange('A1'), {contentsOnly:true});

customMsgBox();

};

function customMsgBox() {
  Browser.msgBox("Data refreshed.");
};


1 commentaires

Cela ressemble à une attente assez intensive occupée à moi. en.wikipedia.org/wiki/busy_waitting Il serait sûrement mieux utiliser des utilitaires.sleep (X) Dans la boucle? De plus, l'exemple de feuille n'utilise pas le code ci-dessus, mais utilise une feuille de calcul.flush (); (qui ne fonctionne pas réellement).



7
votes

Voici un moyen très simple d'empêcher le prochain script de partir jusqu'à ce que le script actuel se termine dans les scripts de Google Apps. Ajoutez simplement un appel à Testwait () après chaque script que vous traitez successivement. Le SpreadsheetApp.flush () semble également réinitialiser la minuterie de délai d'attente sur la feuille de calcul à la valeur par défaut de 5min, de sorte que vous ayez plus de temps pour traiter plusieurs scripts en une fois. xxx


1 commentaires

Dans mon cas, appelez simplement SpreadsheetApp.flush (); était suffisant. Merci quand même!



1
votes

J'ai eu le même problème. Je l'ai résolu en utilisant 2 scripts car je devais être sûr que la feuille de calcul contient les données dont j'ai besoin.

Le premier script fournit une valeur de graine pour remplir la feuille de calcul via une fonction importéxml.

Le deuxième script traite ces données.

J'ai utilisé des déclencheurs en temps basés sur le temps pour exécuter les scripts permettant de suffisamment de temps pour que le premier script soit terminé


0 commentaires