web-dev-qa-db-fra.com

Manipulation de données de formulaires dans Google Sheets

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.

  1. Informations sur l'enseignant (données d'en-tête)
  2. Nom du rapport (données d'en-tête)
  3. Informations de classe (données d'en-tête)
  4. Données de l'élève n ° 1 (données d'enregistrement: champs de formulaire multiples)
  5. Données de l'étudiant n ° 2 (données d'enregistrement: champs de formulaire multiples)
  6. Données de l'élève n ° 3 (données d'enregistrement: champs de formulaire multiples)
  7. Données de l'élève n ° 4 (données d'enregistrement: champs de formulaire multiples)
  8. Données de l'élève n ° 5 (données d'enregistrement: champs de formulaire multiples)

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)
4
Mr. B

Réponse courte

  1. Ajouter une nouvelle feuille.
  2. Ajouter les formules suivantes à la nouvelle feuille

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

Explication

  • 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.
  • Dans la formule de données, le dernier paramètre indique le nombre de colonnes de données.

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".

Démo

tableur

3
Rubén

Cette réponse a des versions refactorisées des formules de ma réponse précédente

Réponse courte

  1. Ajouter une nouvelle feuille.
  2. Ajouter les formules suivantes à la nouvelle feuille

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

Explication

  • 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.
  • Dans les itérateurs de lignes et de colonnes, $ M $ 1 est utilisé pour contenir le nombre de "jeux de données d'enregistrement".
  • COUNTA ($ A $ 1: $ D $ 1) compte le nombre d’en-têtes de colonne
  • 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.
  • Dans la formule de données COUNTA($E$1:$J$1), indique le nombre de colonnes de données.

Démo

tableur

1
Rubén

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? )

0
marikamitsos