J'essaie de développer une solution utilisant Google Forms avec Google Sheets pour collecter des données Google Forms, puis diviser automatiquement les données de la soumission d'un formulaire en plusieurs lignes de données dans une autre feuille.
J'ai appris à interroger des données (grâce à beaucoup d'entre vous ici) d'une feuille à l'autre, mais je ne sais pas comment diviser automatiquement une ligne de données en plusieurs.
Voici un vidéo YouTube décrivant le problème de manière visuelle (je ne vais pas le supprimer).
Fondamentalement, j'ai un formulaire Google qui collecte les éléments suivants.
J'ai besoin d'un moyen automatisé pour convertir cette réponse de formulaire unique (1 ligne) en plusieurs lignes (5 lignes), chacune avec les mêmes "données d'en-tête" mais avec une date d'enregistrement unique.
EXEMPLE Données de formulaire
Header Data - Record Date (Student #1) - Record Date (Student #2) - Record Date (Student #3) - Record Date (Student #4) - Record Date (Student #5)
EXEMPLE Données manipulées souhaitées
Header Data - Record Date (Student #1)
Header Data - Record Date (Student #2)
Header Data - Record Date (Student #3)
Header Data - Record Date (Student #4)
Header Data - Record Date (Student #5)
Cellule A2 -> En-têtes
=OFFSET('Form responses 1'!$A$2,ceiling((row()-1)/5,1)-1,0)
Cela peut être répété plusieurs fois, une pour chaque colonne d'en-tête, il suffit de modifier le dernier paramètre en conséquence.
Cellule B2 -> data
=OFFSET('Form responses 1'!$A$2,ceiling((row()-1)/5,1)-1,mod(row()-2,5)*2+1,1,2)
Remplir au besoin
OFFSET()
est utilisé pour extraire les valeurs des données source.'Form responses 1'!$A$2
est le point de départ pour compter les colonnes et les lignes.row()
est utilisé pour incrémenter les itérateurs de lignes et de colonnes.ceiling((row()-1)/5,1)
, itérateur de ligne, permet de définir la ligne à partir des données source.mod(row()-2,5)*2+1
, itérateur de colonne, permet de définir la colonne à partir des données source.S'il existe plusieurs colonnes "données d'en-tête", ajoutez 1 pour chacune d'elles. C'EST À DIRE. s'il y a cinq colonnes "données d'en-tête" et six "colonnes de données", l'itérateur de colonne doit être
mod(row()-2,5)*6+5
La formule de données finale à ajouter à la cellule F2 est la suivante:
=OFFSET('Form responses 1'!$A$2,ceiling((row()-1)/5,1)-1,mod(row()-2,5)*6+5,1,6)
Dans les itérateurs de ligne et de colonne, 5 est utilisé car il existe 5 colonnes pour les "données d'enregistrement".
Cette réponse a des versions refactorisées des formules de ma réponse précédente
Cellule A2 -> En-têtes
=OFFSET(responses!$A$2,ceiling((row()-row($A$1))/$M$1,1)-1,column()-column($A$1),1,COUNTA($A$1:$D$1))
Cellule E2 -> données
=OFFSET(responses!$A$2,ceiling((row()-row($A$1))/$M$1,1)-1,mod(row()-(row($A$1)+1),$M$1)*COUNTA($E$1:$J$1)+COUNTA($A$1:$D$1),1,COUNTA($E$1:$J$1))
Remplir au besoin
OFFSET()
est utilisé pour extraire les valeurs des données source.'Form responses 1'!$A$2
est le point de départ pour compter les colonnes et les lignes.row()
est utilisé pour incrémenter les itérateurs de lignes et de colonnes.ceiling((row()-row($A$1))/$M$1,1)
, itérateur de ligne, permet de définir la ligne à partir des données source.mod(row()-(row($A$1)+1),$M$1)*COUNTA($E$1:$J$1)+COUNTA($A$1:$D$1)
, itérateur de colonne, permet de définir la colonne à partir des données source.COUNTA($E$1:$J$1)
, indique le nombre de colonnes de données.Vous pouvez réaliser ce que vous voulez d'une manière très propre en utilisant (comme l'indiquent vos efforts dans votre question et votre vidéo) un simple Formule QUERY où les données d'en-tête sont dans les colonnes A-D
et les données d'enregistrements sont divisées en colonnes E-AH
.
=query({responses!A:J;responses!A:D,responses!K:P;responses!A:D,responses!Q:V;responses!A:D,responses!W:AB;responses!A:D,responses!AC:AH},"select * where Col7>1000 order by Col1")
Voici un travail SAMPLE SPREADSHEET .
PS: Je sais que c'est une vieille question, mais dans vos commentaires sur YouTube, vous mentionnez que vous n'avez pas encore trouvé de réponse. Si la réponse fonctionne acceptez-la afin d'aider également les autres. ( Pourquoi voter? )