Script déplacer valeurs d'une ligne vers une ligne d'un autre onglet

J'ai une feuille dans laquelle je gère l'avancement des dossiers de mes clients. J'ai essayé un script que j'ai trouvé ici pour déplacer une ligne d'un onglet à un autre. J'ai besoin de modifier le code pour l'adapter à mes besoins...

function onEdit() {
  // moves a row from a sheet to another when a magic value is entered in a column
  // adjust the following variables to fit your needs

  var sheetNameToWatch = "Suivi Clients";

  var columnNumberToWatch = 21; // column A = 1, B = 2, etc.
  var valueToWatch = "OUI";
  var sheetNameToMoveTheRowTo = "Clients Finalisé";

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveCell();

  if (sheet.getName() == sheetNameToWatch && range.getColumn() == columnNumberToWatch && range.getValue() == valueToWatch) {

    var targetSheet = ss.getSheetByName(sheetNameToMoveTheRowTo);
    var targetRange = targetSheet.getRange(targetSheet.getLastRow() + 1, 1);
    sheet.getRange(range.getRow(), 1, 1, sheet.getLastColumn()).moveTo(targetRange);
    sheet.deleteRow(range.getRow());
  }
}

Ce script déplace une ligne d'un onglet à l'autre lorsqu'une valeur spécifique est saisie (dans le code ci-dessus, il déplace une ligne de "Suivi Clients" à "Clients Finalisé" lorsque le mot "OUI" est saisi dans la colonne 21 (Colonne "U")).Ce script fonctionne bien pour déplacer une ligne entière avec une condition.

Ce dont j'ai besoin est un peu plus complexe.

Tout d'abord, les 2 onglets "Suivi Clients" et "Clients Finalisé" sont exactement les mêmes et contiennent les mêmes formules. Les formules sont ARRAYFORMULA dans les colonnes B-H-I-J-K-O-Q-R-S-T-X et Y. Les autres colonnes A-C-D-E-F-G-L-M-N-P-U-V-W et Z sont vides ou doivent être remplies manuellement. J'explique cela parce que ce que je voudrais, tout d'abord, c'est que seul le contenu des colonnes remplies manuellement soit déplacé d'un onglet à l'autre.

Deuxièmement, je voudrais que dans l'onglet "Suivi Clients" les conditions soient "OUI" ou "ANNULÉ" dans la colonne U afin que les valeurs de la ligne aillent de "Suivi Clients" à "Clients Finalisé". Cela signifie que le dossier du client est payé ou annulé, il est donc terminé.

Une fois que la ligne d'un client est dans l'onglet "Clients Finalisé", je voudrais que si je change la valeur de la colonne U de "OUI" ou "ANNULÉ" à "NON", les valeurs de la ligne retourne dans l'onglet "Suivi Clients". Cela signifierait que le client a décidé de ne plus annuler ou qu'il y a eu un problème avec le paiement et donc que le dossier n'est pas complètement terminé.

Je pourrais avoir besoin de 2 scripts identiques que j'adapterais et attribuerais à chaque onglet.

C'est ma feuille pour ceux qui voudraient voir le format :

https://docs.google.com/spreadsheets/d/1CPcMx3Dhbqi-zO4D3jYNxO-PGjyW3iTfRo5gRmEB9p4/edit#gid=0

Merci.

Bonjour,

Pour transférer uniquement les données sans les résultats de calcul, dans la mesure où tu as tout transformé en arrayformulas, il suffira de supprimer de la ligne 5 les formules et ne laisser que l'en-tête.

Pour les transferts croisés entre les 2 feuilles, la difficulté ici est que tu ne peux avoir qu'une seule fonction onEdit(e), il faudra donc reprendre aussi la première fonction pour y cumuler tous les cas de figure rencontrés

  1. suppression de lignes vides
  2. transfert vers l'archive
  3. transfert arrière vers le suivi

J'y jetterai un œil dans la journée

Le script pour effacer les lignes vides que tu as développé en debut de semaine fonctionne tres bien.

Du coup, ce script la pourrait faire un ctrl+X de toutes les colonnes remplies manuellement dans l'onglet "Suivi Clients" et un ctrl+V dans l'onglet "clients Finalisé" dans la premiere ligne vide en bas de page.

Dans ce cas le premier script ferais le travail de nettoyage et celui ci le travail de migration.

Apres je te dis ça mais je suis plus que novice, donc c'est peut être une bonne logique mais plus compliqué a faire..

à voir ...

function onEdit(e) {
  var sh = e.source.getActiveSheet();
  var rng = e.source.getActiveRange();

  if (sh.getName()=='Suivi Clients' && rng.getColumn()==21){
    if(rng.getValue()=='OUI' || rng.getValue()=='ANNULÉ'){
      var plage = sh.getRange(rng.getRow(),1,1,26)
      var dest = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Clients Finalisé')
      dest.insertRowBefore(6)
      plage.copyTo(dest.getRange("A6"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false)
      sh.deleteRow(rng.getRow())
    }
  }
  if (sh.getName()=='Clients Finalisé' && rng.getColumn()==21){
    if(rng.getValue()=='NON'){
      var plage = sh.getRange(rng.getRow(),1,1,26)
      var dest = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Suivi Clients')
      dest.insertRowBefore(6)
      plage.copyTo(dest.getRange("A6"), SpreadsheetApp.CopyPasteType.PASTE_NORMAL, false)
      sh.deleteRow(rng.getRow())
    }
  }

  if (sh.getName() != 'Suivi Clients') return;
  var editRange = { 
    top: 6, 
    left: 3, 
    right: 7 
  };
  var thisRow = e.range.getRow();
  if (thisRow < editRange.top || thisRow > editRange.bottom) return;
  var thisCol = e.range.getColumn();
  if (thisCol < editRange.left || thisCol > editRange.right) return;
  removeEmpty()
}

en supprimant ton autre fonction onEdit() que j'ai juste renommée pour le moment en onEditSTOP

capture d e cran 2022 04 23 a 12 54 21

il ne faut pas lancer ce script à partir de l'éditeur, il se lance en auto dès que tu changera la valeur OUI/NON/ANNULÉ

d'accord j'essaye

Alors ça fonctionne pour la migration.

Seulement vu que des valeurs sont collées dans les colonnes qui contiennent les formules arrayformula, du coup les formules passent en erreur.

Aussi ça change les formules qui sont censés commencer en ligne 6, ça décale d'une ligne a chaque ligne ajoutée.

En insérant les lignes en ligne 7 je n'ai plus le décalage de formule..

En insérant les lignes en ligne 7 je n'ai plus le décalage de formule..

bien vu ! je n'avais pas prêté attention à cela ...

Il reste un probleme, c'est que les valeurs sont collées dans les colonnes qui contiennent les formules arrayformula, du coup les formules passent en erreur.

il, faut que tu fasses comme j'ai fait sur le fichier que tu as posté, à savoir copier la ligne 5 comme valeurs sur le second onglet

J'ai essayé pas mal de choses, j'ai toujours #REF erreur a chaque fois qu'une li s'ajoute.

Je penses que problème vient de cette ligne de code

var plage = sh.getRange(rng.getRow(),1,1,26)

Qui fait que la ligne entière se copie.

Copie je peux faire pour copier uniquement les plages: C-G, L-N, P-P et U-W?

ah ok, j'ai vu

je suis pris, je règle cela dès que je reviens

D'accord merci Mike

Il suffit de mettre PASTE_VALUES et non PASTE_NORMAL

j'en apprends tous les jours

https://developers.google.com/apps-script/reference/spreadsheet/copy-paste-type

au passage ... ne pas mettre 2 fois une fonction du même nom (onEdit) même s'il s'agit de "modules" différents, une seule des 2 est prise en compte (je pense la dernière)

J'ai déjà essayé PASTE_VALUES mais le problème persiste..

Est-ce que tu penses qu'il serait possible de coller uniquement les valeurs de certaines colonnes ou c'est trop compliqué?

Si ça l'est, en collant uniquement les valeurs des plages C-G, L-N, P-P et U-W, je penses que le problème serait réglé

J'ai déjà essayé PASTE_VALUES mais le problème persiste..

bon, il y vraiment quelque chose qui m'échappe, zut !!

Si ça l'est, en collant uniquement les valeurs des plages C-G, L-N, P-P et U-W, je penses que le problème serait réglé

function onEdit(e) {
  var sh = e.source.getActiveSheet();
  var rng = e.source.getActiveRange();

  if (sh.getName()=='Clients Finalisé' && rng.getColumn()==21){
    if(rng.getValue()=='NON'){

      var dest = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Suivi Clients')
      dest.insertRowBefore(7)

      var plage = sh.getRange('C' + rng.getRow() + ':G'  + rng.getRow())
      plage.copyTo(dest.getRange("C7"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false)
      var plage = sh.getRange('L' + rng.getRow() + ':N'  + rng.getRow())
      plage.copyTo(dest.getRange("L7"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false)
      var plage = sh.getRange('P' + rng.getRow())
      plage.copyTo(dest.getRange("P7"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false)
      var plage = sh.getRange('U' + rng.getRow() + ':W'  + rng.getRow())
      plage.copyTo(dest.getRange("U7"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false)

      sh.deleteRow(rng.getRow())
    }
  }

  if (sh.getName()=='Suivi Clients' && rng.getColumn()==21){
    if(rng.getValue()=='OUI' || rng.getValue()=='ANNULÉ'){

      var dest = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Clients Finalisé')
      dest.insertRowBefore(7)

      var plage = sh.getRange('C' + rng.getRow() + ':G'  + rng.getRow())
      plage.copyTo(dest.getRange("C7"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false)
      var plage = sh.getRange('L' + rng.getRow() + ':N'  + rng.getRow())
      plage.copyTo(dest.getRange("L7"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false)
      var plage = sh.getRange('P' + rng.getRow())
      plage.copyTo(dest.getRange("P7"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false)
      var plage = sh.getRange('U' + rng.getRow() + ':W'  + rng.getRow())
      plage.copyTo(dest.getRange("U7"), SpreadsheetApp.CopyPasteType.PASTE_VALUES, false)

      sh.deleteRow(rng.getRow())
    }
  }

  if (sh.getName() != 'Suivi Clients') return;
  var editRange = { 
    top: 6, 
    left: 3, 
    right: 7 
  };
  var thisRow = e.range.getRow();
  if (thisRow < editRange.top || thisRow > editRange.bottom) return;
  var thisCol = e.range.getColumn();
  if (thisCol < editRange.left || thisCol > editRange.right) return;
  removeEmpty()
}

Rechercher des sujets similaires à "script deplacer valeurs ligne onglet"