Frage

Ich habe ein Google-Formular, das die folgenden zwei Felder enthält:

  • E-Mail-Adresse:- Ein Textfeld
  • Werkzeug:- Ein Optionsfeld
    • Werkzeug 1
    • Werkzeug 2
    • Werkzeug 3

Der Benutzer gibt seine E-Mail-Adresse ein, wählt ein Tool aus und klickt auf „Senden“.Ich möchte, dass die folgende Meldung erscheint:

Danke für die Antwort.Ihnen wurde eine E-Mail an at gesendet eingegebene E-Mail-Adresse herunterladen ausgewähltes Werkzeug.

Ich habe den folgenden Code im Skripteditor

    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);
    }

Das habe ich auch eingestellt triggers ausgeführt werden -> emailFormSubmission, Veranstaltungen -> from Form , onFormSubmit.

Was passiert ist:Angenommen, der erste Benutzer („A“) gibt seine Informationen ein und klickt auf „Senden“.Seine eingegebenen Informationen werden korrekt angezeigt.Wenn der zweite Benutzer („B“) seine Informationen eingibt und auf „Senden“ klickt, werden die Informationen von A angezeigt.Wenn der dritte Benutzer („C“) seine Informationen eingibt und auf „Senden“ klickt, werden die Informationen von B angezeigt.Ich habe festgestellt, dass das Problem bei „getlastrow()“ liegt, da die Tabelle aktualisiert wird nach emailFormSubmission wird verarbeitet.

Was stimmt mit dem obigen Code nicht?Wie kann ich das beheben?

AKTUALISIEREN

Basierend auf den Kommentaren von @wchiquito habe ich den Code wie folgt geändert, damit er funktioniert.

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());
}
War es hilfreich?

Lösung

Denken Sie daran, dass das Ereignis On form submit (Ereignisse verstehen) erhält einen Parameter, der folgenden Aufbau hat:

  • Werte
  • Reichweite
  • benannte Werte

und Sie können so etwas tun:

function emailFormSubmission(e) {
    ...
    var row = e.range.getRow();
    ...
}

Probieren Sie den folgenden Code aus, um die Struktur des Parameters zu beobachten e:

function emailFormSubmission(e) {
    ...
    Logger.log(e);
    ...
}

AKTUALISIEREN

Entschuldigen Sie zunächst meine Verwirrung, ich habe Ihnen die Struktur von a gezeigt Spreadsheet form submit event wenn Sie wirklich a verwenden Form submit event.

Sicher genug, a Form submit event hat folgenden Aufbau:

  • Antwort

Ein Objekt vom Typ zurückgeben FormResponse.

Definieren Sie daher das Ereignis: On submit form (Form submit event), können Sie etwa Folgendes tun:

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());
  }
}

Die Bestätigungsnachricht, die gemäß den als Antworten des Formulars gesendeten Daten festgelegt wurde, scheint jedoch nicht sehr klar zu sein. Sie können die Nachricht festlegen, sie wird jedoch nicht für die aktive Antwort angezeigt, wenn nicht für die nächste.

Andere Tipps

Meine erste Vermutung sind diese beiden Zeilen hier:

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.

Wenn du anrufst getLastRow() auf einem Blatt – Sie erhalten die letzte Zeile.Sicher, aber angesichts der Reihenfolge der Ereignisse und der Art und Weise, wie diese Werte verarbeitet werden, benötigen Sie eine +1, um die neueste Einreichung zu erhalten.Derzeit sind Sie eine Zeile im Rückstand, wenn Ihr Code ausgeführt wird, um die Formularbestätigungsnachricht zu aktualisieren.

Ändern Sie also einfach Ihren Code wie folgt:

var emailid = theFormSheet.getRange(row+1,2,1,1).getValue();
var tool = theFormSheet.getRange(row+1,3,1,1).getValue();

Tabellenkalkulationen sind meiner Meinung nach die verwirrendsten Dienste von Google.Wenn Sie Werte in der Tabelle erhalten, werden diese als zurückgegeben [] oder [][] Abhängig davon, wie groß Ihre Reichweite ist, wenn Sie anrufen getValues().Aber getRange() auf einen sheet beginnt bei Index 1 (um das Einlesen des Codes zu erleichtern, nehme ich an).Oft stelle ich fest, dass aufgrund der Art und Weise, wie Daten weitergegeben werden, ein Einzelfehler auftritt.Denken Sie daran, wenn Sie mit Tabellenkalkulationen arbeiten :)

kurze Antwort: Sie möchten nicht mit Google-Formularen fertig sein.

Erläuterung: Form.setconfirmationMessage () Legt die Bestätigungsnachricht für das auf dem Server gespeicherte Formular fest, nicht für das aktuelle aktive Formular.Gleiches gilt zum Beispiel für form.setitle ().Das aktive Formular wird nicht geändert.Man würde ein anderes Verhalten für die Bestätigungsnachricht erwarten, aber so ist dies nicht der Fall.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top