Instabilité du code

Bonjour à tous,

On m'a confié la tâche d'afficher le résultat en 3 saisies de références et de l'enregistrer ce résultat dans un autre fichier. Les saisies se feront via scan et les utilisateurs ne disposent ni de clavier ni de souris, tout doit être automatique. Je suis sur Google Sheet avec Apps Script.

J'ai créer 4 fichiers :

Fichier 1 : liste des références articles et des composants (chaque article à les composants qui lui correspond sur la même ligne)

Onglet 2 : Historique des saisies des Fichiers 2, 3 et 4 avec le résultat

Fichier 2 et 3 : saisie des références article et composant 1.

Fichier 4 : scan du composant 2 et Résultat de la correspondance

A savoir que le fichier 4 récupère les informations des Fichiers 2 et 3 via IMPORTRANGE

Pour pouvoir afficher le résultat aux utilisateurs j'ai créer une plage qui affiche la case Résultat en plus grand. Vu que je vais effacer les cellules de saisie via un script ma case Résultat se remet à 0 instantanément. Le but est de récupérer le résultat et de l'afficher à l'utilisateur, j'ai fais le choix de ne pas passer par MsgBox car il faut cliquer sur OK et l'utilisateur ne peut pas le faire.

J'arrive bien à afficher le résultat à l'utilisateur, le problème est que ça marche complétement aléatoirement et je ne comprend pas pourquoi. Je vous met mon code et quelques images, j'ai 2 vidéos qui montrent lorsque ça marche et lorsque ça marche pas mais elles sont trop lourdes.

Je suis parti de 0, j'ai appris l'existence d'Apps Script la semaine dernière , mes connaissances sont très limitées.

Toute aide me serait forte utile,

Merci,

function onEdit(event) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveRange();

  // Vérifie si les cellules A2, C2 et E2 sont remplies
  if (sheet.getName() == "Scan3 + Matching" && range.getRow() == 2 && (range.getColumn() == 1 || range.getColumn() == 3 || range.getColumn() == 5) && range.getValue() != "") {

    //Scan3 + Matching
    Enregistrement_Des_References();
  }
}

function Enregistrement_Des_References() {

// Déclarer les fichiers
var Fichier_Scan_1 = SpreadsheetApp.openByUrl("URL FICHIER 2");
var Fichier_Scan_2 = SpreadsheetApp.openByUrl("URL FICHIER 3");
var View_only = SpreadsheetApp.openByUrl("URL FICHIER 1");
var Fichier_Scan_3 = SpreadsheetApp.getActiveSpreadsheet();

//Déclarer les feuilles
var Feuille_Scan_1 = Fichier_Scan_1.getSheets()[0];
var Feuille_Scan_2 = Fichier_Scan_2.getSheets()[0];
var Feuille_Scan_3 = Fichier_Scan_3.getActiveSheet();
var Feuille_Historique = View_only.getSheets()[1];

//Délcarer la Dernière Ligne de Historique et la dernière colonne
var Derniere_Ligne_Historique = Feuille_Historique.getLastRow();
var Derniere_Colonne = Feuille_Historique.getLastColumn();

//Récupérer cette Range et sa valeur
var Range_A_Coller = Feuille_Historique.getRange(1, 1, Derniere_Ligne_Historique, Derniere_Colonne);
var Valeur_A_Coller = Range_A_Coller.getValues();

//Dernière ligne Scan_3
var Valeur_Ligne_3 = Feuille_Scan_3.getLastRow();

//Copier la valeur de la Range des saisies références
var Range_A_Copier = Feuille_Scan_3.getRange("A2:E2");
var Valeur_A_Copier = Range_A_Copier.getValues();

// Trouver la première ligne vide sur les 5 premières colonnes de l'Hisotrique
var First_Ligne_Vide = 1;
for (var i = 1; i <= Derniere_Ligne_Historique; i++) {
    if (Valeur_A_Coller[i - 1][0] == "") {
    First_Ligne_Vide = i;
       break;
      }
  }

//Copie la Valeur_A_Copier dans la Dernière_Ligne_Historique écrite des 5 premières colonnes
Feuille_Historique.getRange(First_Ligne_Vide, 1, 1, 5).setValues(Valeur_A_Copier);

//Interface utilisateur, affiche le résultat qui vient d'être scanner
var Recuperer_Le_Resultat = Feuille_Scan_3.getRange("G2").getValues();
PropertiesService.getScriptProperties().setProperty("Resultat", Recuperer_Le_Resultat);
var Afficher_Le_Resultat = Feuille_Scan_3.getRange("A5:E10");
Afficher_Le_Resultat.setValue(Recuperer_Le_Resultat);

Feuille_Scan_1.getRange("A2").clear();
Feuille_Scan_2.getRange("A2").clear();
Feuille_Scan_3.getRange("E2").clear();
}
8nouveau-dossier.zip (209.37 Ko)

Bonjour,

Si je résume votre situation : (redites s'il y a des erreurs)

- plusieurs utilisateurs scanne des produits > cela génère une donnée référence (que vous rattachez à une base de donnée d'articles et de composants, issues du fichier 1).

- la donnée est stockée dans un tableau historique des saisies (fichier 1 > onglet 2) par ordre chronologique

- l'utilisateur qui scanne doit avoir immédiatement le résultat (lien référence - > produit / référence)

- le champ "résultat" se ré-initialise

Question 1 : où le scan arrive-t-il ? Dans quel fichier ?

Question 2 : Ce fichier doit-il pouvoir supporter plusieurs utilisateurs en simultané ?

Bonjour merci de votre réponse,

Globalement c'est ça, j'ai l'utilisateur 1 qui scanne la référence produit (Fichier 2), l'utilisateur 2 qui scan le composant 1 (Fichier 3) et l'utilisateur 3 qui scan le composant 2 (Fichier 4). Ca affiche le résultat de correspondance et ça informe les utilisateurs du résultat (toujours sur le fichier 4). Ensuite, les différents scans et résultats sont enregistrés dans l'historique (Fichier 1, onglet 2). Le fichier Historique reçoit les 3 scans + le résultat en même temps donc pas besoin d'utilisation simultanée.

Cette partie fonctionne correctement, mon problème provient de l'affichage du résultat qui se réinitialise quasiment instantanément (voir vidéo). La ligne 2 est envoyé au fichier Historique et la plage A5:E10 doit afficher le résultat de G2 et rester jusqu'au prochain scan.

J'ai réussi à contourner le problème en rajoutant Utilities.sleep(90) à la toute fin du script, ce qui fonctionnait bien hier. Aujourd'hui en voulant retester, impossible j'ai dû passer de 90 à 900 pour que ça fonctionne.

Je suppose que la case G2 se réinitialise trop vite et que l'affichage en A5:E10 ne suit pas, mais bon j'aimerais avoir une explication pour mettre en place une solution durable. Je peux envoyer une vidéo lorsque ça fonctionne pour avoir une idée visuelle du résultat.

Merci,

Bonjour,

Je ne souhaite pas ouvrir de fichier .zip, mais si votre objectif est simplement d'afficher la dernière donnée d'un tableau, vous pouvez mettre un simple lastrow ?

var historique = sheet.getSheetByName('onglet 2')
var adresseDernier =  historique.getLastRow();
var dernier = historique.getRange(adresseDernier,1,1,10).getValues();

Puis, dans votre code de scan, vous mettez la valeur de dernier en G2 ?

ok pas de soucis je vais mettre une image tout simplement pour être plus explicit.

Dans le fichier 4, à partir du moment où les 3 références ont été scanné, ça déclenche mon matching (case G2) et toute la ligne 2 est envoyé dans l'historique.

Ensuite, ça affiche le résultat dans la plage A5:E10 et ça reset la ligne 2 pour saisir d'autres référence. Ma plage A5:E10 s'affiche aléatoirement voilà mon problème, l'envoi vers l'historique se passe correctement.

La photo 1 montre ce qui déclenche le script et la photo 2 montre le résultat à avoir. Lorsque cela ne marche pas la plage A5:E10 s'affiche une fraction de seconde et reprend la valeur G2 soit N/A.

D'où mon hypothèse sur le problème de tempo

1 2

Donc, ce qui lance le script, c'est la présence de donnée en A2 + C2 + E2, à ce moment-là la correspondance est interrogée et le résultat s'affiche en G2 (match / no match), et A5 = G2.

Ce qui pose problème c'est le "vidage" de la ligne 2, c'est cela ? La ligne se réinitialise trop rapidement ?

C'est exactement ça, en décomposant ça donne :

- A2, C2 et E2 remplies --> donne le résultat en G2

- la ligne 2 est envoyée à l'onglet Historique

- la plage A5:E10 affiche le résultat de G2

- la ligne 2 est effacée pour saisie de nouvelles références

- la plage A5:E10 reste affichée pour informer les utilisateurs du résultat qui vient d'être établi (alors que G2 est devenue vide)

Je n'arrive pas à avoir la A5:E10 qui reste affichée de façon constante

D'accord, donc dans votre script, il faudrait SETVALUE la nouvelle donnée A5 uniquement lorsqu'un nouveau match se fait. Et ne jamais clear cette cellule, seulement insérer de nouvelles données.

d'accord je vois je vais essayer cette option, merci

Rechercher des sujets similaires à "instabilite code"