Copier une ligne à partir d'une feuille et la coller dans une autre feuille

Bonsoir le forum,

je suis en train de créer un fichier de location de matériel et je souhaiterais conserver une trace des locations clôturées.

J'ai donc une première feuille intitulée "Location" comportant 7 lignes avec les 7 intitulés des différents matériels à louer, puis ensuite les données des loueurs.

Grâce à un bouton auquel j'ai associé un script, je réussi à copier la ligne dans une 2ème feuille intitulée "reporting", puis à vider la ligne copiée de la feuille "Location" en passant le matériel en "disponible". C'est actuellement le seul bouton actif !

Dans la 1ère feuille, j'ai en face des 7 lignes, 7 boutons de copie. Mais actuellement je ne sais pas comment chaque bouton peut copier la ligne en face de laquelle il se trouve. De plus, comment faire pour que la copie s'incrémente automatiquement en dessous de la précédente dans la feuille "Reporting".

Je suis novice et j'ai uniquement utiliser la fonction "enregistrer une macro" et je ne pense pas que ce soit la solution la plus adaptée à mon problème !

Qi l'un ou l'une d'entre vous pouvait m'apporter son aide, ce serait top !

Merci beaucoup pour votre aide

https://docs.google.com/spreadsheets/d/1SmnYzIGe-ETbo6CpeEUBg0zKyU9vmzal-q0CEPwzHdA/edit?gid=0#gid=0

Breitzou

11location.xlsx (7.87 Ko)

Bonjour,

Les images servant de bouton sont pas très fiable pour servir d'offset (c'est à dire attribuer un bouton aux cellules adjacentes).

Une solution simple, serai de les remplacer par des cases à cocher par exemple.

> lorsque vous cocher la case "Clôturer" les données sont déplacées dans la feuille reporting, puis, la ligne est vidée et la case est remise vide.

J'ai fais une demande d'accès en édition.

Bonjour Pierre,

Je viens d'envoyer le partage en édition.

Merci pour votre aide !

Breitzou

C'est bon, tu peux essayer par toi même dans le nouvel onglet Données - bis, complète le formulaire et clique sur la case, ca archive automatiquement dans l'onglet reporting, voici le script réalisant cela :

// 1- on déclare les constantes, qui vont servir à plusieurs endroits
const SS = SpreadsheetApp.getActiveSpreadsheet();
const SHEET_DONNEES = SS.getSheetByName('Données - bis');
const SHEET_REPORT = SS.getSheetByName('Reporting');

// 2- on vérifie lors des éditions si la modification est une case cochée dans la plage définie (dans notre ex entre J5:J11)
function onEdit(e) {
  var colonne = 10; // colonne J
  var ligneDebut = 5; // ligne début à vérifier
  var ligneFin = 11; // ligne fin à vérifier, il est possible de rendre cette ligne dynamique en fonction du nb de lignes
  var sheet = e.source.getActiveSheet();
  var cell = e.range;

    if (sheet.getName() === SHEET_DONNEES.getName() && cell.getColumn()=== colonne && cell.getRow() >= ligneDebut && cell.getRow() <= ligneFin && cell.isChecked()) {
    archiveLigne(cell.getRow());
  }
}

// 3- si une case a été cochée dans la plage, alors on mets les données dans la feuille reporting, puis on vide la ligne
function archiveLigne(row) {
  let dataRange = SHEET_DONNEES.getRange(row,1,1,9).getValues().flat();
  SHEET_REPORT.appendRow(dataRange.getValues().flat());
  SHEET_DONNEES.getRange(row,2,1,9).clearContent();
}

+ voici une alternative qui vérifie si toutes les cellules sont bien remplies avant d'archiver, sinon envoie un message d'erreur :

// 1- on déclare les constantes, qui vont servir à plusieurs endroits
const SS = SpreadsheetApp.getActiveSpreadsheet();
const SHEET_DONNEES = SS.getSheetByName('Données - bis');
const SHEET_REPORT = SS.getSheetByName('Reporting');
const UI = SpreadsheetApp.getUi();

// 2- on vérifie lors des éditions si la modification est une case cochée dans la plage définie (dans notre ex entre J5:J11)
function onEdit(e) {
  var colonne = 10; // colonne J
  var ligneDebut = 5; // ligne début à vérifier
  var ligneFin = 11; // ligne fin à vérifier, il est possible de rendre cette ligne dynamique en fonction du nb de lignes
  var sheet = e.source.getActiveSheet();
  var cell = e.range;

  if (sheet.getName() === SHEET_DONNEES.getName() && cell.getColumn()=== colonne && cell.getRow() >= ligneDebut && cell.getRow() <= ligneFin && cell.isChecked()) {
    archiveLigne(cell.getRow());
  }
}

// 3- si une case a été cochée dans la plage, alors on mets les données dans la feuille reporting, puis on vide la ligne
function archiveLigne(row) {
  let dataRange = SHEET_DONNEES.getRange(row,1,1,9).getValues().flat();
  let verificationChamps = dataRange.some(function(value) {
  return value === "";
  });
  if (verificationChamps) {
    UI.alert("Des champs ne sont pas complétés !")
    SHEET_DONNEES.getRange(row,10).uncheck();
    return;
  }
  SHEET_REPORT.appendRow(dataRange);
  SHEET_DONNEES.getRange(row,2,1,9).clearContent();

}

Bonsoir Pierre,

ça marche au top !

Un grand merci à toi d'avoir pris le temps de solutionner ce problème.

J'ai juste une dernière question.

Au moment ou je coche la case, la copie se fait dans le dossier reporting, mais est-il possible de passer en statut "Clôturé" la ligne copiée dans cet onglet ? Par exemple la cellule I5 pour la 1ère ligne copiée, etc...

Et de la même manière, la ligne qui se vide dans l'onglet Donnée bis peut-elle passée en statut "Disponible" sur la cellule I5 ?

Merci encore pour ton aide précieuse

Breitzou

Bonjour,

Bien sûr c'est possible, si je reprends le script avec vérification datas :

// 1- on déclare les constantes, qui vont servir à plusieurs endroits
const SS = SpreadsheetApp.getActiveSpreadsheet();
const SHEET_DONNEES = SS.getSheetByName('Données - bis');
const SHEET_REPORT = SS.getSheetByName('Reporting');
const UI = SpreadsheetApp.getUi();

// 2- on vérifie lors des éditions si la modification est une case cochée dans la plage définie (dans notre ex entre J5:J11)
function onEdit(e) {
  var colonne = 10; // colonne J
  var ligneDebut = 5; // ligne début à vérifier
  var ligneFin = 11; // ligne fin à vérifier, il est possible de rendre cette ligne dynamique en fonction du nb de lignes
  var sheet = e.source.getActiveSheet();
  var cell = e.range;

  if (sheet.getName() === SHEET_DONNEES.getName() && cell.getColumn()=== colonne && cell.getRow() >= ligneDebut && cell.getRow() <= ligneFin && cell.isChecked()) {
    archiveLigne(cell.getRow());
  }
}

// 3- si une case a été cochée dans la plage, alors on mets les données dans la feuille reporting, puis on vide la ligne
function archiveLigne(row) {
  let dataRange = SHEET_DONNEES.getRange(row,1,1,8).getValues().flat();
  dataRange.push("Cloturé"); // on ajoute le statut Cloturé à la fin des données
  let verificationChamps = dataRange.some(function(value) {
  return value === "";
  });
  if (verificationChamps) {
    UI.alert("Des champs ne sont pas complétés !")
    SHEET_DONNEES.getRange(row,10).uncheck();
    return;
  }
  SHEET_REPORT.appendRow(dataRange);
  SHEET_DONNEES.getRange(row,2,1,9).clearContent();
  SHEET_DONNEES.getRange(row,9).setValue("Disponible"); // on remet le statut Disponible 
}

Bonsoir Pierre,

C'est juste génial ! Cela va me simplifier le travail !

Un grand merci à toi

Bonne soirée

Breitzou

Rechercher des sujets similaires à "copier ligne partir feuille coller"