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

J'ai un simple formulaire Google qui collecte des données et, à L'aide D'AppScript, envoie des e-mails de confirmation aux utilisateurs qui le remplissent. Après que l'utilisateur ait soumis le formulaire, lors de la confirmation, il verra un lien pour modifier sa réponse.

Je voudrais inclure ce lien dans l'e-mail 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 suis en mesure d'obtenir le lien vers le formulaire via SpreadsheetApp.getActiveSpreadsheet().getFormUrl(). Il me donne le format suivant: https://docs.google.com/a/domain.com/spreadsheet/viewform?formkey=<formKey>

Le lien n'inclut cependant pas la touche edit, qui est requise pour que les utilisateurs puissent modifier leur 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

24
demandé sur Mogsdad 2012-05-23 01:20:38

9 réponses

La réponse que cela n'a pas été 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 d'édition 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 à l'utilisateur au fur et à mesure qu'il répond, on peut ajouter un déclencheur sur le formulaire submit. Comme la situation avec laquelle je travaille n'exige pas que les gens se connectent avec un compte apps que je n'ai pas l'accès à une adresse e-mail automatiquement, donc j'ai une question texte qui capture l'adresse e-mail de l'utilisateur.

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

20
répondu Ben 2014-02-16 23:36:47

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

Voir: Comment modifier les réponses de Formulaire

2
répondu ScampMichael 2012-05-23 01:36:53

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

Après que l'utilisateur ait soumis le formulaire, lors de la confirmation, il/elle verra un lien vers modifier sa réponse. Je voudrais inclure ce lien dans l'e-mail 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 y a des solutions de contournement qui pourraient vous convenir (certains ont suggéré ici que je vais reformuler), par exemple

Envoyer un lien de formulaire par-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), de sorte que vous pouvez connaître et supprimer/ignorer ses anciennes soumissions. Éventuellement automatiquement via un script.

Vous pouvez également développer et publier une interface graphique apps-script et envoyer un lien vers ce script apps plus un paramètre que vous générez où vous pouvez déterminer quelle entrée vous devez modifier. L'inconvénient de cette approche est qu'il est un peu lourd et exagéré de re-concevoir le formulaire entier sur le Script des applications. Mais encore une fois, il fonctionne.

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

2
répondu Henrique G. Abreu 2014-08-03 21:52:11

Voici un billet 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 post a le mieux fonctionné pour moi.

2
répondu Von 2015-01-24 23:01:42

Cela - je n'ai pas essayé, mais je cherchais la même chose il y a un moment et remarqué.

De 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
répondu eskdale 2013-06-19 18:21:26

Génial, le script fonctionne! Grâce.

Pour les débutants, comme moi: collez simplement le code d'andre pour la fonction SendConfirmationMail(e) dans l'éditeur de code de votre feuille de calcul et définissez 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****** par le numéro de colonne de la feuille où vous voulez que les URL d'édition finissent. J'ai utilisé 39 qui est une colonne de plus que mon formulaire était à l'aide de jusqu'à.

Cependant, j'ai 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>"; 
        } 
    }

Fonctionne pour moi.

1
répondu user3397716 2014-03-18 13:49:15

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

}
1
répondu Andre Vacari - Capo Software 2014-03-18 18:45:09

Vous pouvez essayer de remplir un formulaire avec les valeurs données à partir de cette adresse e-mail que supprimer les réponses précédentes ...

Ce n'est pas une belle façon mais cela peut fonctionner ...

0
répondu Edo 2012-05-23 01:15:49

Je ne pense pas que nous ayons accès à cette valeur via L'API Spreadsheet (ce qui signifie que le Script Apps ne l'a pas non plus). Le plus proche auquel je peux penser serait la valeur "key" dans ce flux . Vous auriez à tester pour savoir si. Il n'y a pas d'autre alternative que d'accéder directement à L'API de feuille de calcul. Donc, d'abord, vous devez obtenir la dernière ligne via l'api use ?reverse=true&max-results=1

-1
répondu mzimmerman 2012-05-23 01:07:38