web-dev-qa-db-fra.com

Comment ajouter un lien "Modifier la réponse" aux e-mails Google Forms?

J'ai un simple formulaire Google qui recueille des données et, à l'aide d'AppScript, envoie des e-mails de confirmation aux utilisateurs qui les remplissent. Une fois que l'utilisateur a soumis le formulaire, lors de la confirmation, il verra un lien pour modifier sa réponse.

Je voudrais inclure ce lien dans le courriel de confirmation (pour le moment, il n'apparaît que sur la page.) Comment puis-je obtenir l'URL pour modifier une réponse soumise?

Je peux obtenir le lien vers le formulaire via SpreadsheetApp.getActiveSpreadsheet().getFormUrl(). Cela me donne le format suivant: https://docs.google.com/a/domain.com/spreadsheet/viewform?formkey=<formKey>

Le lien n'inclut cependant pas la clé de modification, qui est requise pour que les utilisateurs modifient sa réponse. L'URL attendue devrait ressembler à ceci: https://docs.google.com/a/domain.com/spreadsheet/viewform?formkey=<formKey>&edit=<editKey>

Merci pour l'aide à l'avance!

-K

Édité:

Ajout d'une demande de fonctionnalité à ce sujet: http://code.google.com/p/google-apps-script-issues/issues/detail?id=1345&thanks=1345&ts=1337773007

25
DashK

La réponse que cela n'était pas possible par @Henrique Abreu était vraie jusqu'à très récemment. Google semble avoir ajouté getEditResponseUrl() à la classe FormResponse et avec cela il devient possible d'utiliser du code comme celui-ci pour obtenir l'URL de modification pour un tas de formulaires existants:

function responseURL() {
 // Open a form by ID and log the responses to each question.
 var form = FormApp.openById('1gJw1MbMKmOYE40Og1ek0cRgtdofguIrAB8KhmB0BYXY'); //this is the ID in the url of your live form
 var formResponses = form.getResponses();
 for (var i = 0; i < formResponses.length; i++) {
   var formResponse = formResponses[i];
   Logger.log(formResponse.getEditResponseUrl());
 }
}

Pour le faire envoyer automatiquement un e-mail à l'utilisateur pendant qu'il répond, on pourrait ajouter un déclencheur lors de la soumission du formulaire. Comme la situation avec laquelle je travaille n'exige pas que les gens se connectent avec un compte d'applications, je n'ai pas accès à une adresse e-mail automatiquement, j'ai donc une question textuelle qui capture l'adresse e-mail de l'utilisateur.

Il pose la question de savoir si vous souhaitez ou non modifier les formulaires. J'ai été aux prises avec les avantages relatifs de l'édition d'une réponse existante ou l'envoi d'un formulaire prérempli en utilisant toPrefilledUrl() afin que je puisse voir comment les choses ont changé au fil du temps. Je suppose que cela se résume à la valeur que le suivi vous apportera.

21
Ben

- modifier cela est maintenant possible. Voir les autres réponses.

Une fois que l'utilisateur a soumis le formulaire, lors de la confirmation, il verra un lien pour modifier sa réponse. Je voudrais inclure ce lien dans le courriel de confirmation

Ce n'est pas possible, point final.

Ce lien n'est accessible nulle part et on ne peut pas le deviner/le construire. Mais, il existe des solutions de contournement qui pourraient vous convenir (certains ont suggéré ici que je reformule), par exemple.

Envoyez un lien de formulaire rempli et demandez à l'utilisateur de le renvoyer. Vous auriez besoin d'avoir une sorte de champ de contrôle (par exemple le nom d'utilisateur), afin que vous puissiez connaître et supprimer/ignorer ses anciennes soumissions. Peut-être automatiquement via un script.

Vous pouvez également développer et publier une interface graphique de script d'applications et envoyer un lien vers ce script d'applications ainsi qu'un paramètre que vous générez où vous pouvez déterminer l'entrée que vous devez modifier. L'inconvénient de cette approche est qu'il est quelque peu fastidieux et exagéré de repenser l'ensemble du formulaire sur Apps Script. Mais encore une fois, cela fonctionne.

Enfin, vous pouvez ouvrir une "demande d'amélioration" sur Apps Script issue tracker et attendre qu'ils et l'équipe de Google Spreadsheet/Forms se réunissent pour développer une solution.

2

Si vous utilisez Google Apps, vos répondeurs peuvent y modifier les réponses du formulaire.

Voir: Comment modifier les réponses du formulaire

2
ScampMichael

Voici un article de blog clair qui vous montre comment le faire étape par étape et explique ce qui se passe sous le capot pour les débutants AppsScripts:

http://securitasdato.blogspot.com/2014/11/sending-confirmation-emails-from-google.html

Alors que collectivement, vous pouvez y arriver à partir de toutes les excellentes réponses fournies ici, le script de ce poste a fonctionné le mieux pour moi.

2
Von

Est-ce que cela aide - je ne l'ai pas essayé mais je cherchais la même chose il y a un moment et je l'ai remarqué.

Depuis cette page https://developers.google.com/apps-script/reference/forms/

le code à partir de là contient ceci:

Logger.log('Published URL: ' + form.getPublishedUrl());
Logger.log('Editor URL: ' + form.getEditUrl());

Jon

1
eskdale

Super, le script fonctionne! Merci.

Pour les débutants, comme moi: il suffit de coller le code d'Andre pour la fonction SendConfirmationMail(e) dans l'éditeur de code de votre feuille de calcul et de définir le déclencheur "on form submit" pour l'exécuter. C'est dans l'éditeur de script de feuille de calcul, pas dans l'éditeur de script de formulaire.

Vous devez pirater certaines valeurs. Lisez le code. Pour moi, la confusion était la nécessité de remplacer le ********COLUMN SEQUENCE EX 14****** avec le numéro de colonne de la feuille où vous souhaitez que les URL de modification se terminent. J'ai utilisé 39, soit une colonne de plus que mon formulaire n'utilisait.

Cependant, j'ai eu des problèmes d'exécution dans cette partie:

for (var i in headers) {

            value = e.namedValues[headers[i]].toString();

            // Do not send the timestamp and blank fields            
            if ((i !== "0") && (value !== "")) {
                message += headers[i] + ' :: ' + value + "<br>";
            }
        }

Je ne sais pas pourquoi, mais je l'ai remplacé par ceci:

 for (var keys in columns) {
        var key = columns[keys];
        if ( e.namedValues[key]) {
        message += key + ' :: '+ e.namedValues[key] + "<br>"; 
        } 
    }

Travaille pour moi.

1
user3397716

Essayez ceci: (les crédits ne sont pas pour moi, car je fusionne deux solutions de la troisième partie)

Source: Envoyer un e-mail de confirmation avec Google Forms

/* Send Confirmation Email with Google Forms */

function Initialize() {

    var triggers = ScriptApp.getScriptTriggers();

    for (var i in triggers) {
        ScriptApp.deleteTrigger(triggers[i]);
    }

    ScriptApp.newTrigger("SendConfirmationMail")
        .forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet())
        .onFormSubmit()
        .create();

}

function SendConfirmationMail(e) {
  var form = FormApp.openById('***YOUR FORM CODE***');
    //enter form ID here

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('***SHEET NAME***');

    //Change the sheet name as appropriate
  var data = sheet.getDataRange().getValues();
  var urlCol = ***************COLUMN SEQUENCE EX 14******; // column number where URL's should be populated; A = 1, B = 2 etc
  var responses = form.getResponses();
  var timestamps = [], urls = [], resultUrls = [], url;

  for (var i = 0; i < responses.length; i++) {
    timestamps.Push(responses[i].getTimestamp().setMilliseconds(0));
    urls.Push(responses[i].getEditResponseUrl());
  }
  for (var j = 1; j < data.length; j++) {

    resultUrls.Push([data[j][0]?urls[timestamps.indexOf(data[j][0].setMilliseconds(0))]:'']);
    url = resultUrls[i-1]
  }
  sheet.getRange(2, urlCol, resultUrls.length).setValues(resultUrls);  

    try {

        var ss, cc, sendername, subject, headers;
        var message, value, textbody, sender;

        // This is your email address and you will be in the CC
        cc = Session.getActiveUser().getEmail();

        // This will show up as the sender's name
        sendername = "****YOUR NAME******";

        // Optional but change the following variable
        // to have a custom subject for Google Docs emails
        subject = "Registro de Oportunidade submetido com sucesso";

        // This is the body of the auto-reply
        message = "Nós recebemos seu registro de oportunidade.<br>Muito Obrigado!<br><br>";

        ss = SpreadsheetApp.getActiveSheet();
        headers = ss.getRange(1, 1, 1, ss.getLastColumn()).getValues()[0];

        // This is the submitter's email address
        sender = e.namedValues["********COLUMN NAME OF DESTINATION E-MAIL************"].toString();

        for (var i in headers) {

            value = e.namedValues[headers[i]].toString();

            // Do not send the timestamp and blank fields            
            if ((i !== "0") && (value !== "")) {
                message += headers[i] + ' :: ' + value + "<br>";
            }
        }

        message += "<br>Link to edit" + ' :: ' + url + "<br>";
        textbody = message.replace("<br>", "\n");

        GmailApp.sendEmail(sender, subject, textbody, 
                            {cc: cc, name: sendername, htmlBody: message});

    } catch (e) {
        Logger.log(e.toString());
    }

}

vous pouvez essayer de remplir un formulaire avec les valeurs fournies par cette adresse e-mail que de supprimer les réponses précédentes ...

ce n'est pas une belle façon mais ça peut marcher ...

0
Edo