Domanda

Ho un modulo Google che ha i seguenti due campi:

  • Indirizzo e-mail:- Una casella di testo
  • Attrezzo:- Un pulsante di opzione
    • Strumento 1
    • Strumento 2
    • Strumento 3

L'utente dovrà inserire il suo indirizzo email, selezionare uno strumento e fare clic su Invia.Vorrei che comparisse il seguente messaggio:

Grazie per la risposta.Ti è stata inviata un'e-mail a at indirizzo e-mail inserito scaricare strumento selezionato.

Ho il seguente pezzo di codice nell'editor di 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);
    }

Ho anche impostato il triggers essere Esegui -> emailFormSubmission, Eventi -> from Form , onFormSubmit.

Ciò che accade è:Supponiamo che il primo utente ("A") inserisca le sue informazioni e faccia clic su Invia.Le informazioni inserite vengono visualizzate correttamente.Quando il secondo utente ("B") inserisce le sue informazioni e fa clic su Invia, vengono visualizzate le informazioni di A.Quando il terzo utente ("C") inserisce le sue informazioni e fa clic su Invia, vengono visualizzate le informazioni di B.Ho scoperto che il problema riguarda "getlastrow()" poiché il foglio di calcolo viene aggiornato Dopo emailFormSubmission viene elaborato.

Cosa c'è di sbagliato nel codice sopra?Come posso risolvere questo problema?

AGGIORNAMENTO

Sulla base dei commenti di @wchiquito, ho modificato il codice nel seguente per farlo funzionare.

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());
}
È stato utile?

Soluzione

Ricorda che l'evento On form submit (Comprendere gli eventi) riceve un parametro che ha la seguente struttura:

  • valori​​
  • allineare
  • Valori con nome​​

e puoi fare qualcosa del tipo:

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

Provare il codice seguente per osservare la struttura del parametro e:

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

AGGIORNAMENTO

Per prima cosa, scusa la mia confusione, ti ho mostrato la struttura di a Spreadsheet form submit event quando stai davvero usando a Form submit event.

Abbastanza sicuro, a Form submit event ha la seguente struttura:

  • risposta

Restituendo un oggetto di tipo FormResponse.

Pertanto, definendo l’evento: On submit form (Form submit event), puoi fare qualcosa di simile a quanto segue:

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

Tuttavia il messaggio di conferma impostato in base ai dati inviati come risposte del form, non sembra molto chiaro, è possibile impostare il messaggio, ma non verrà visualizzato per la risposta attiva, se non per quella successiva.

Altri suggerimenti

La mia prima ipotesi è queste due linee qui:

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

Quando chiami getLastRow() su un foglio - stai ottenendo l'ultima riga.Certo, ma considerando l'ordine degli eventi e il modo in cui questi valori vengono elaborati, è necessario un +1, per ottenere la presentazione più recente.Attualmente sei una riga dietro quando il tuo codice viene eseguito per aggiornare il messaggio di conferma del modulo.

Quindi basta modificare il tuo codice su quanto segue:

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

I fogli di calcolo sono i più confusioni dei servizi di Google, a mio avviso.Quando si ottiene valori nel foglio di calcolo, vengono restituiti come [] o [][] a seconda del tuo intervallo quando si chiama getValues().Ma getRange() su un sheet inizia all'indice 1 (per facilitare la lettura del codice che suppongo).Spesso spesso trovo che ho un errore fuori by-one a causa del modo in cui i dati vengono passati in giro.Basta tenerlo a mente mentre lavori con fogli di calcolo :)

risposta breve: vuoi che tu voglia non si può fare con Google Form.

Spiegazione: form.setConfimationMessage () Imposta il messaggio di conferma per il modulo come memorizzato sul server, non per il modulo attivo corrente.Lo stesso vale ad esempio per modulo.settitle ().La forma attiva non verrà modificata.Ci si aspetterebbe un comportamento diverso per il messaggio di conferma, ma ahimè, questo non è il caso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top