Afficher cellule dans une autre feuille en fonction d'une valeur

Pour la colonne K : En effet il faut supprimer la ligne lorsque ce n'est plus égale à "A envoyer"

Pour la colonne J : Idéalement, ce serait de supprimer la ligne dans "EXPE" SI la case n'est plus égale à "JMJ" mais de ne pas toucher à "A envoyer" car peu importe l'expéditeur, ça reste "A envoyer"

function onEdit(event){ 
  var nf = 'TABLEAU_DE_SUIVI_DE_FABRICATION';
  var nd = 'EXPE';
  var f = event.source.getActiveSheet();
  var r = event.source.getActiveRange();
  var d = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(nd);

  // expe
  var col= 11; // colonne K
  if (r.getColumn() == col && f.getName() == nf){ 
    if(r.getValue() == 'A envoyer' && r.offset(0,-1).getValue() == 'JMJ'){ 
      d.insertRowBefore(2);
      d.getRange("A2").setFormula("=" + nf + "!B" + r.getRow());
      d.getRange("B2").setFormula("=" + nf + "!D" + r.getRow());
      d.getRange("C2").setFormula("=" + nf + "!H" + r.getRow());
      d.getRange("D2").setFormula("=" + nf + "!I" + r.getRow());
      d.getRange("E2").setFormula("=" + nf + "!L" + r.getRow());
      f.getRange("AA" + r.getRow()).setFormula('=iferror(row(' + nd + '!A2);"ligne supprimée")');
    } else {
      var ligne = f.getRange("AA" + r.getRow()).getValue();
      if (typeof ligne == 'number'){
        d.deleteRow(ligne);
      }
      f.getRange("AA" + r.getRow()).setValue('');
    }    
  }

}

Merci encore c'est vraiment top, j'ai regardé et lorsqu'il n'y a pas d'erreur de saisi (ce qui est préférable ^^) c'est PAR-FAIT !

Juste petite question, savoir si c'est une limite technique de Google Sheet ou si c'est juste trop de temps de code pour si peu de modif, mais en gros en faisant mes tests, j'ai remarqué que lorsque je me trompe sur la case de la colonne "J" si je commence par mettre par exemple "AUTRE" (et à envoyer dans la colonne "K") et qu'ensuite je me rends compte de l'erreur et que je remets la bonne valeur dans "J" à savoir "JMJ" et bien ça n'actualise pas, (donc la ligne ne va pas se mettre dans le tableau).

Autre cas de figure, à l'inverse, j'ai mis "JMJ" dans la colonne "J" au départ, donc la ligne est dans le tableau, mais finalement c'est une erreur, je change pour mettre "AUTRE" et bien la ligne ne se supprime pas du tableau EXPE, je pense que c'est la même chose, le code ne revérifie pas cette colonne.

Si c'est vraiment trop chiant à faire, arrêtons-nous là et je sensibiliserais les utilisateurs sur ce détail ! Si c'est faisable et si ce n'est pas de l'abus de gentillesse, alors je suis preneur

Encore bonne journée et sinon EXCELLENT travail ! Ca fonctionne du feu de dieu ! Encore merci :D

GSheets travaille essentiellement en ligne, à savoir que toutes les modifications sont répercutées sur le serveur et que c'est le serveur qui effectue le script. Il faut donc un bon débit/une bonne connexion internet. Ensuite, un temps de réponse de l'ordre de la seconde n'est pas si mal que cela en internet.

Je trouve que GSheets a beaucoup de qualité (par rapport à excel), mais ce point est en effet un peu limitatif.

Si tu veux une amélioration de confort, il faut oublier les scripts événementiels et mettre en place un bouton qui déclenchera à ta demande le transfert vers l'onglet EXPE.

Je te remercie, nous allons donc rester comme ça c'est vraiment au top !

En revanche j'ai un autre détail (que j'essaie de régler mais sans succès ! xD) en gros, j'ai aussi un système d'archivage (sur ce même tableau, que tu m'avais aidé à confectionner d'ailleurs !) et en gros, il arrive que la ligne disparaisse dans le tableau, donc "EXPEDITION" affiche logiquement un #REF!

J'ai donc testé par mes propres moyens de bidouiller un petit code pour que ces cases se supprime d'elles-mêmes, mais j'y arrive avec un mot (J'avais testé avec le mot "TESTTT" c'était impec, mais en gros je n'arrive pas à lui dire "if isError()" ou un truc du genre :/

En gros lui dire que SI ça renvoie une ERREUR alors on supprime, voici mon petit bout de code :

    var col= 1; // colonne A
  if (r.getColumn() == col && f.getName() == nd){ 
     for(var i=v.length-1;i>=0;i--)
    if(v[0,i]== isError() )
      s.deleteRow(i+1);
  }

(Qui ne fonctionne pas en l'état hein) je ne sais pas comment écrire le "isError" en gros ! :'(

Une suggestion de fonction à tester ...

function estErreur(cel) {
  var liste = ["#NULL!", "#DIV/0!", "#VALUE!", "#REF!", "#NAME?", "#NUM!", "#N/A","#ERROR!"];
  return liste.includes(cel);
}

Je l'avais trouvé sur le web celle-ci en effet, mais je n'arrive pas à la mettre en application, pour une raison qui m'échappe je n'arrive pas à la faire fonctionner :(

je ne sais pas ce que c'est que s et v dans ton cas

ceci fonctionne :

function testErreur() {
  var doc = SpreadsheetApp.getActiveSpreadsheet();
  var feuille = SpreadsheetApp.getActive();
  var r = feuille.getActiveRange();
  if(estErreur(r.getValue())){
    Browser.msgBox('Planté !');;
  }
};

function estErreur(cel) {
  var liste = ["#NULL!", "#DIV/0!", "#VALUE!", "#REF!", "#NAME?", "#NUM!", "#N/A","#ERROR!"];
  return liste.includes(cel);
}

https://docs.google.com/spreadsheets/d/1m-haB0-2DUh2FBFBagoG_deLXpI2b0mbtt2b_4OYqvg/edit?usp=sharing

J'ai actualisé le document "TEST" afin de copier / coller le code que j'avais sur mon doc (pour que tu puisses voir "s" et "v" concernant ton code, je suis étonné, rien ne se passe de mon côté sur ton lien (peut-être parce que lecture seule ?)

De même, en mettant tout ça (un simple copier / coller) sur mon document, rien ne se passe malgré l'exécution du script, et il semble me dire que la variable "doc" n'est appelé nulle part je crois :

image

Mon exemple est juste un test

Tu te positionnes sur la cellule en erreur et tu lances manuellement la macro qui te répondra "Planté !"

Le but est de montrer comment fonctionne la fonction.

Oui, la variable doc était superflue.

J'ai actualisé le document "TEST" afin de copier / coller le code que j'avais sur mon doc (pour que tu puisses voir "s" et "v" concernant ton code, je suis étonné, rien ne se passe de mon côté sur ton lien (peut-être parce que lecture seule ?)

D'abord il manque des {} après le if

  if(v[0,i]=='#REF!'){s.deleteRow(i+1);}

tu fais un test sur la cellule r qui est modifiée si elle est en colonne 1, je ne comprends pas tout

if (r.getColumn() == col && f.getName() == nd)
  • est-ce que tu modifies la cellule de la colonne A de EXPEDITION ?
  • ou est-ce que à l'occasion d'une modif quelconque tu veux épurer la feuille ?

Maintenant que je comprends mieux le sujet, je pense que tout ce qui a été fait est inutile, il suffit d'une fonction pour remplacer l'intégralité du script.

=query(TABLEAU_DE_SUIVI_DE_FABRICATION!B3:L;"select B, D, H, I, J, L where J <>'' and K='A envoyer' ")

voir l'onglet test

Merci encore pour le temps que tu m'accordes, j'ai regardé pour l'onglet "Test" en revanche lorsque je défile, ça ne fonctionne plus vraiment ...

Après, vu que le script fonctionne, même si ce n'est pas le plus optimisé, je pense rester dessus :) Mais merci pour cette seconde piste !

Concernant le fait de supprimer la ligne si elle renvoie une erreur, je vais continuer de gratter de ce côté, en attendant encore merci pour toutes les précisions et le temps accordé !

Merci encore pour le temps que tu m'accordes, j'ai regardé pour l'onglet "Test" en revanche lorsque je défile, ça ne fonctionne plus vraiment ...

qu'est-ce qui ne fonctionne plus ? c'est une fonction classique et puissante de GSheets

et cela résout le problème de latence https://forum.excel-pratique.com/sheets/afficher-cellule-dans-une-autre-feuille-en-fonction-d-une-va...

Rechercher des sujets similaires à "afficher feuille fonction valeur"