Accès aux données saisies par l'utilisateur lors de la soumission dans les formulaires Google
-
21-12-2019 - |
Question
J'ai un formulaire Google qui contient les deux champs suivants :
- Adresse e-mail:- Une zone de texte
- Outil:- Un bouton radio
- Outil 1
- Outil 2
- Outil 3
L'utilisateur entrerait son adresse e-mail, sélectionnerait un outil et cliquerait sur Soumettre.Je souhaite que le message suivant apparaisse :
Merci d'avoir répondu.Un email vous a été envoyé à adresse e-mail saisie Télécharger outil sélectionné.
J'ai le morceau de code suivant dans l'éditeur de script
function emailFormSubmission() {
var form = FormApp.getActiveForm();//the current form
var dest_id = form.getDestinationId(); //the destination spreadsheet where form responses are stored
var ss = SpreadsheetApp.openById(dest_id);//open that spreadsheet
var theFormSheet = ss.getSheets()[0]; //read the first sheet in that spreadsheet
var row = theFormSheet.getLastRow(); //get the last row
var emailid = theFormSheet.getRange(row,2,1,1).getValue();//get column 2 corresponding to the email id. column 1 is timestamp. so, skip that.
var tool = theFormSheet.getRange(row,3,1,1).getValue();//get column 3 corresponding to the selected tool.
form.setConfirmationMessage('Thanks for responding. An email has been sent to you '+ emailid + ' to download' + tool);
}
J'ai également défini le triggers
être exécuté -> emailFormSubmission
, Événements -> from Form
, onFormSubmit
.
Ce qui se produit est:Supposons que le premier utilisateur (« A ») saisisse ses informations et clique sur Soumettre.Ses informations saisies s'affichent correctement.Lorsque le deuxième utilisateur (« B ») saisit ses informations et clique sur Soumettre, les informations de A s'affichent.Lorsque le troisième utilisateur (« C ») saisit ses informations et clique sur Soumettre, les informations de B s'affichent.J'ai trouvé que le problème venait de "getlastrow()" puisque la feuille de calcul est mise à jour après emailFormSubmission est traité.
Quel est le problème avec le code ci-dessus ?Comment puis-je réparer ça?
MISE À JOUR
Sur la base des commentaires de @wchiquito, j'ai modifié le code comme suit pour le faire fonctionner.
function emailFormSubmission(e) {
var form = FormApp.getActiveForm();
//Check this link on how to access form response:
//https://developers.google.com/apps-script/understanding_events?hl=en
var responses = e.response;//e is of type formresponse.
var emailid = responses.getItemResponses()[0].getResponse();
var tool = responses.getItemResponses()[1].getResponse();
Logger.log(emailid);
Logger.log(tool);
form.setConfirmationMessage('Thanks for responding. An email has been sent to '+ emailid + ' with instructions to download ' + tool +'. If you do not find our email in your inbox, please check your spam folder');
Logger.log(form.getConfirmationMessage());
}
La solution
N'oubliez pas que l'événement On form submit
(Comprendre les événements) reçoit un paramètre qui a la structure suivante :
- valeurs
- gamme
- Valeurs nommées
et tu peux faire quelque chose comme :
function emailFormSubmission(e) {
...
var row = e.range.getRow();
...
}
Essayez le code suivant pour observer la structure du paramètre e
:
function emailFormSubmission(e) {
...
Logger.log(e);
...
}
MISE À JOUR
Tout d'abord, excusez ma confusion, je vous ai montré la structure d'un Spreadsheet form submit event
quand vous utilisez vraiment un Form submit event
.
Effectivement, un Form submit event
a la structure suivante :
- réponse
Renvoyer un objet de type FormResponse
.
Par conséquent, définir l’événement : On submit form
(Form submit event
), vous pouvez faire quelque chose comme ceci :
function emailFormSubmission(e) {
var itemResponses = e.response.getItemResponses();
for (var i = 0, len = itemResponses.length; i < len; ++i) {
Logger.log('Response #%s to the question "%s" was "%s"',
(i + 1).toString(),
itemResponses[i].getItem().getTitle(),
itemResponses[i].getResponse());
}
}
Cependant, le message de confirmation paramétré en fonction des données envoyées en réponse du formulaire, ne semble pas très clair, vous pouvez paramétrer le message, mais il ne s'affichera pas pour la réponse active, sinon pour la suivante.
Autres conseils
Ma première hypothèse concerne ces deux lignes ici :
var emailid = theFormSheet.getRange(row,2,1,1).getValue();//get column 2 corresponding to the email id. column 1 is timestamp. so, skip that.
var tool = theFormSheet.getRange(row,3,1,1).getValue();//get column 3 corresponding to the selected tool.
Quand vous appelez getLastRow()
sur une feuille - vous obtenez la dernière ligne.Bien sûr, mais compte tenu de l'ordre des événements et de la manière dont ces valeurs sont traitées, vous avez besoin d'un +1
, pour obtenir la soumission la plus récente.Actuellement, vous êtes en retard d'une ligne lorsque votre code s'exécute pour mettre à jour le message de confirmation du formulaire.
Alors changez simplement votre code comme suit :
var emailid = theFormSheet.getRange(row+1,2,1,1).getValue();
var tool = theFormSheet.getRange(row+1,3,1,1).getValue();
Les feuilles de calcul sont, à mon avis, le service Google le plus déroutant.Lorsque vous obtenez des valeurs dans la feuille de calcul, elles sont renvoyées sous forme de []
ou [][]
en fonction de votre portée lorsque vous appelez getValues()
.Mais getRange()
sur un sheet
commence à l'index 1 (pour faciliter la lecture du code, je suppose).Souvent, je constate que j'ai une erreur ponctuelle en raison de la façon dont les données sont transmises.Gardez cela à l'esprit lorsque vous travaillez avec des feuilles de calcul :)
Réponse courte:ce que vous voulez ne peut pas être fait avec les formulaires Google.
Explication:form.setConfirmationMessage() définit le message de confirmation pour le formulaire tel qu'il est stocké sur le serveur, et non pour le formulaire actif actuel.Il en va de même par exemple pour form.setTitle().Le formulaire actif ne sera pas modifié.On pourrait s’attendre à un comportement différent pour le message de confirmation, mais hélas, ce n’est pas le cas.