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());
}
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top