Copier des lignes et certaines cellules vers une autre feuille

Bonjour,

Depuis une feuille ("formulaire"), j'ai un bouton "enregistrer". Je souhaite copier, en cliquant sur le bouton "enregistrer", les lignes d'une plage définie (A6-I10) vers une autre feuille ("liste_pb"). Il faut également que le nom et la classe de l'élève (cellules B3 et D3 de la feuille "formulaire") soient copiés dans les premières colonnes du tableau cible, en regard donc des lignes copiées.

J'ai tenté de m'inspirer du script proposé par Sébastien mais je ne connais pas la syntaxe pour copier une plage donnée vers des colonnes nommées d'une autre feuille.

function enregistrer() {
  const feuille1 = SpreadsheetApp.getActiveSheet();
  const feuille2 = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('tableau_recapitulatif');
  feuille2.appendRow([
    feuille1.getRange('B6').getValue(),
    feuille1.getRange('B5').getValue(),
    feuille1.getRange('D13').getValue(),    
  ]);
  SpreadsheetApp.getActiveSpreadsheet().toast('Vos informations sont bien enregistrées !', 'Confirmation');
}

Lien vers mon document de travail : https://docs.google.com/spreadsheets/d/11HIs5Vu5PKrNBsP2lcUw-gEwh_WUW1jTxDlaEIjIjI4/edit?usp=sharing

Si quelqu'un à une piste je suis preneur.

Merci

Bonjour,

Voici étape par étape un exemple de code, votre fichier étant en lecture seule, je n'ai pu le tester :

1/ déclarer l'environnement de travail, le fichier Google Sheet actif, puis les 2 feuilles sur lesquels vous allez agir (formulaire et liste_pb)

function enregistrer() {
  const fichierSheet = SpreadsheetApp.getActiveSpreadsheet();
  const formulaire = fichierSheet.getSheetByName('formulaire');
  const listePb = fichierSheet.getSheetByName('liste des pb');

Maintenant, il faut récupérer les informations voulues dans le fichier formulaire :

var nomPrenom = formulaire.getRange('B3').getValue();
var donnees = formulaire.getRange('A6:I10').getValues();

Les données sont stockées dans 2 variables, on va maintenant écrire sur l'onglet liste des pb, pour cela, on fait une boucle qui en fonction du nombre de lignes :

  for (var i = 0; i < tableau.length; i++) {
    listePb.appendRow([nomPrenom].concat(detail[i]));
  }
}

À votre place, au lieu de vous limitez à A6:I10 je ferai une variable qui mesure le nombre de ligne, afin d'avoir x lignes automatiquement :

  var nbLigne = formulaire.getLastRow()-6;

Et du coup, il faut changer la variable donnees par :

  var donnees = formulaire.getRange(6,1,nbLigne,9).getValues();

Et voici le code final (avec la plage à copier variable) :

function enregistrer() {
  const fichierSheet = SpreadsheetApp.getActiveSpreadsheet(); // fichier sheet actif
  const formulaire = fichierSheet.getSheetByName('formulaire'); // onglet formulaire
  const listePb = fichierSheet.getSheetByName('liste des pb'); // onglet liste des pb

  var nbLigne = formulaire.getLastRow()-6; // calcule le nombre de ligne du fichier - 6 (car les 1ères données sont en ligne 6)
  var detail = formulaire.getRange(6,1,nbLigne,9).getValues(); // met dans une variables les données à partir de la ligne 6, colonne 1 jusqu'à la dernière ligne, colonne 9
  var nomPrenom = formulaire.getRange('B3').getValue(); // met la cellule nom prenom dans une variable

  for (var i = 0; i < detail.length; i++) { // boucle sur le nombre de lignes dans la variable détail
    listePb.appendRow([nomPrenom].concat(detail[i])); // insere i lignes du nom prenom + de ligne du détail
  }
}

Bonjour,

Merci pour le code et la pédagogie, j'apprécie de grappiller en passant quelques notions de programmation qui me font cruellement défaut.

Le script recopie bien les lignes et le nom mais seulement pour les deux premières lignes, la troisième est ignorée.

Je réalise à l'insant que le bouton case à cocher n'est pas recopié par la formule Query. Je ne sais pas si on peut automatiser cet ajout lorsque la ligne contient des données.

Concernant la programmation, Sébastien a réalisé une suite de tutoriel complet pour Google Apps script si cela vous intéresse :

https://www.sheets-pratique.com/fr/apps-script

Ensuite, pour répondre point par point :

Au sujet des cases à cocher, en effet, une case représente en fait une valeur vrai ou faux et la case n'est qu'un format visuel.

Pour des formats spécifiques comme des dates par exemple, on peut utiliser .getDisplayValue() qui permet de copier la valeur qu'on voit à l'écran et non pas la valeur réelle (qui dans le cadre d'une date illisible par exemple).

Mais pour des cases à cocher ça ne fonctionne pas, il faut ajouter via le script des cases, dans votre cas, à la suite du code insérez :

  var nbLigneCases = listePb.getLastRow()-1;
  listePb.getRange(2,8,nbLigneCases,3).setDataValidation(SpreadsheetApp.newDataValidation().requireCheckbox().build())

Ce code va compter le nombre de lignes - l'en-tête, puis créer des checkbox à partir de la ligne 2, colonne 8, jusqu'à la ligne x, colonne 11.

Au sujet du nombre de lignes copiées, j'ai mis :

  var nbLigne = formulaire.getLastRow()-6;

Car j'ai cru voir 6 lignes avant les données, maintenant, j'en vois 5, donc changez juste -6 par -5.

(cette variable compte le nombre de lignes de votre feuille, or, il ne faut pas prendre en compte l'en-tête, juste les données, c'est pour cela que je soustrais ce nombre au total.)

Pour finir, sur le QUERY, vous ne prenez pas les colonnes H,I,J et en effet, si vous les prenez, cela affiche FAUX / VRAI.

Pour le coup, j'ignore comment faire pour afficher des cases automatiquement.

Merci pour le lien vers le cours Google Apps script.

Les cases à cocher me semblaient la forme la plus efficace et pratique. Le fait de ne pas pouvoir en créer automatiquement remet l'idée en question. Comme le nombre de références varient selon les niveaux , il faudrait que je prévoie des cases pour la plus longues liste. A l'affichage de la plus courte ça fait vraiment moche.

J'ai donc tenté la liste déroulante. Par défaut la première valeur est "ok", si l'opérateur constate un souci il modifie la valeur. Dans le principe ça me satisfait. Mais j'ignore pourquoi le Query copie bien la liste déroulante pour la première valeur mais pas les suivantes.

Par ailleurs lors de l'enregistrement du niveau 6e par exemple, le nom est répété 3 fois dans la feuille "liste des pb" alors qu'il n'y a qu'une référence.

Retirez vos descriptions à droite, car le compteur de ligne les prend en compte comme des données.

Bonjour,

Effectivement, sans les commentaires sur la droite le compteur fonctionne et l'enregistrement est ok.

Merci beaucoup.

Comme pour les cases à cocher, le Query ne copie pas les listes déroulantes. Je crains donc de devoir prévoir une série de listes déroulantes correspondant à la plus longue liste de références. Pas très esthétique tout ça...

Comme pour les cases à cocher, le Query ne copie pas les listes déroulantes. Je crains donc de devoir prévoir une série de listes déroulantes correspondant à la plus longue liste de références. Pas très esthétique tout ça...

C'est-à-dire ? dans l'onglet formulaire vous choisissez un niveau et vous avez d'importé les éléments correspondant de l'onglet liste_references.

Selon le niveau (sixième, cinquieme...) le nombre de références varie.

Pour le formulaire le query me permet de récupérer les références correspondant au niveau indiqué en B1, liste de longueur variable donc.

J'avais pensé ajouter des cases à cocher dans la feuille "liste_references" en imaginant que le query du formulaire les importe. On a vu que le query récupère la valeur Vrai / Faux mais pas la case à cocher.

Or d'un point de vue pratique, je souhaitais que l'opérateur qui récupère les bouquins n'ait qu'à cocher la case selon l'état puis enregistrer.

A défaut d'obtenir ces cases dans le formulaire (adaptées au nombre de lignes), j'ai tenté de remplacer les cases à cocher dans la liste des réf. par une liste déroulante. Mais , comme pour les cases, le query ne réplique que la première valeur (ok par défaut).

Je cherche donc une ruse pour que le formulaire affiche les données correspondant au niveau, permette simplement de valider l'état du manuel et , enfin, qu'on puisse enregistrer les valeurs saisies.

Je vous ai répondu point par point sans visualiser votre besoin global, dites-moi si j'ai juste :

- Vous voulez un fichier pour suivre et gérer le prêt de livres

> l'onglet liste_reference comprend tous vos livres en stocks et leurs états

> l'onglet formulaire permet de choisir un niveau d'étude, puis de choisir les élèves 1 par 1 et indiquer si les livres sont rendus et leurs états.

- Ce formulaire est ensuite enregistré de l'onglet liste des pb ou vous pouvez ainsi lister le retour de vos livres

C'est un cas particulier.

Contexte : Les manuels prêtés aux élèves n'ont fait l'objet d'aucun prêt formel (papier ou numérique) à la rentrée de sept 2022. Nous n' avons pas, non plus, d'état du stock en volume, coût, état (sans commentaires ).

Besoins : Arrivé en sept. dans l'établissement, je découvre les dégâts et récupère la gestion des manuels cette fin d'année. Avant d'informatiser pour la rentrée prochaine, j'ai besoin de m'assurer que tous les élèves ont rendu leurs manuels, d'établir le stock, m'assurer de son état et faire d'éventuelles commandes de réassort.C'est la fonction de l'outil que je tente de créer.

Perspectives : Pour la rentrée j'ai prévu de gérer et faire le prêt via un logiciel dédié. Les infos récupérées via cet outil me seront également utiles pour préparer cette base et commander des étiquettes avec code barre.

Je connais la liste des références en usage par niveau. Je peux récupérer la liste des élèves. Je dois donc organiser le retour des livres (pas le prêt) :

- l'onglet "liste_references" comprend tous les références des livres en usage, donc en prêt, pas d'indication d'état, volume, coût

- l'onglet "formulaire" est destiné à permettre à un opérateur , lors dur retour des livres, de :

  • choisir le niveau d'étude, B1, (ce qui déclenche l'affichage en tableau des références de ce niveau)
  • récupérer le nom de l'élève B3 (vérification d'après la liste transmise par le secrétariat, onglet "liste_eleves") ; la LV2 et l'option
  • l'opérateur vérifie que les livres restitués correspondent à la liste, si l'option est la bonne, si la réf. de LV2 est la bonne
  • par défaut l'état est ok, si abimé, inutilisable ou non rendu, l'opérateur le signale sur le formulaire (case à cocher, menu déroulant)
  • le bouton enregistrer récupère dans l'onglet "liste des pb" : nom, classe, réf restituées par l'élèves et état

Cette procédure devrait me permettre :

- d'établir mon stock (tableau croisé, à construire, pour le nombre de livres par réf) ;

- évaluer, par rapport aux cohortes à venir, les besoins et faire des commandes ;

- savoir quelles étiquettes CB prévoir et combien ; déterminer le nombre d'exemplaires à générer dans la future base de données

- relancer les élèves qui n'ont pas restitué leurs manuels (à prévoir : tableau qui compare l'onglet "liste_eleves" où sont les noms de ceux qui ont rendu leurs livres, avec une autre feuille où on a la liste complète des élèves inscrits cette année 2022-23 (en cours de préparation)

Désolé pour la longueur du message, j'espère être plus clair sur le cahier des charges.

Bonjour,

Merci pour ces précisions, donc votre besoin est instantané, pas besoin de monter un fichier de suivi ; vous avez une base de livres, en état initial bon, votre objectif est de, lors du retour de ceux-ci, avoir un état complet des retours pour votre nouvel outil.

Donc cela ne sert à rien de développer un outil trop perfectionné pour uniquement une vague de retour.

À ce jour, qu'est-ce qui manque à votre fichier pour être fonctionnel ?

Bonjour,

Il me manque encore pas mal d'éléments :

  • comme j'ai du créer 12 lignes de listes déroulantes dans le formulaire (correspondant au nombre maxi de réf pour la classe de 3e), des lignes vides sont reportées lors de l'enregistrement dans la feuille "liste des pb". Il faudrait pouvoir "nettoyer " ces lignes inutiles
  • j'ai besoin d'un tableau récapitulatif de l'état du stock (+ calcul du nombre de réf/état) , du type :
Etat
RéférencesNon renduTrès abimé
InutilisableOk
(titre du livre)
(nombre de réf. correspondantes)
(nombre de réf. correspondantes)(nombre de réf. correspondantes)(nombre de réf. correspondantes)
  • un tableau qui liste les réf. non rendues ou inutilisables (potentiellement plusieurs réf pour un même élève) et :
NomclasseTitre du livre
Prix
  • un tableau qui liste les réf. Très abimées (potentiellement plusieurs réf pour un même élève, valeur pénalité constante):
NomclasseTitre du livre
Pénalité
10€
  • un tableau qui compare les nom des élèves enregistrés lors du retour avec la liste complète des élèves (feuille "liste_eleves") : objectif -> relancer les absents

Je ne suis donc pas au bout du chantier.

Bonjour,

Les réponses de PierreLepinay m'ont permises de clore cette question. Merci à lui. J'obtiens, grâce à ses propositions, le résultat escompté.

Je poursuis mon chantier sur d'autres problématiques.

Rechercher des sujets similaires à "copier lignes certaines feuille"