web-dev-qa-db-fra.com

Est-il possible de «pré-remplir» un formulaire Google à l'aide des données d'un tableur Google?

Je cherche un moyen de "pré-remplir" un formulaire Google avec des données spécifiques provenant d'un tableur Google. Le formulaire comportera les mêmes questions "standard" pour tout le monde, mais les données de la première question seront "préremplies" avec des données uniques provenant d'un tableur Google existant. Les données seront uniques en fonction de leur adresse électronique dans la feuille de calcul existante.

Exemple de feuille de calcul source

Col 1       Col 2        Col 3 
email       name         birthday  
@mike       Mike Jones   May 9th 1975  
@jim        Jim Smith    April 19th 1985

EXEMPLE DE FORMULAIRE UN

Question 1 - pré-rempli avec les données (Mike Jones) à partir d'un tableur Google.

Question 2 - pré-remplie avec les données (9 mai 1975) à partir d'un tableur Google.

Question 3 - vide (en attente de la réponse de l'utilisateur)

Question 4 - vide (en attente de la réponse de l'utilisateur)


EXEMPLE DE FORME DEUX

Question 1 - pré-rempli avec les données (Jim Smith) à partir d'un tableur Google.

Question 2 - préremplie avec les données (19 avril 1985) à partir d'un tableur Google.

Question 3 - vide (en attente de la réponse de l'utilisateur)

Question 4 - vide (en attente de la réponse de l'utilisateur)


Est-ce que quelqu'un sait si cela peut être fait? Si oui, toute aide ou direction sera grandement appréciée.

Merci d'avance!
Todd

62
Mr. B

Vous pouvez créer une URL de formulaire préremplie à partir de l'éditeur de formulaire, comme décrit dans documentation relative à Drive Forms . Vous allez vous retrouver avec une URL comme celle-ci, par exemple:

https://docs.google.com/forms/d/--form-id--/viewform?entry.726721210=Mike+Jones&entry.787184751=1975-05-09&entry.1381372492&entry.960923899

buildUrls ()

Dans cet exemple, la question 1, "Nom", a un identifiant de 726721210, alors que la question 2, "Anniversaire" est 787184751. Les questions 3 et 4 sont vierges.

Vous pouvez générer l'URL préremplie en adaptant celui fourni par l'interface utilisateur en tant que modèle, comme ceci:

function buildUrls() {
  var template = "https://docs.google.com/forms/d/--form-id--/viewform?entry.726721210=##Name##&entry.787184751=##Birthday##&entry.1381372492&entry.960923899";
  var ss = SpreadsheetApp.getActive().getSheetByName("Sheet1");  // Email, Name, Birthday
  var data = ss.getDataRange().getValues();

  // Skip headers, then build URLs for each row in Sheet1.
  for (var i = 1; i < data.length; i++ ) {
    var url = template.replace('##Name##',escape(data[i][1]))
                      .replace('##Birthday##',data[i][2].yyyymmdd());  // see yyyymmdd below
    Logger.log(url);  // You could do something more useful here.
  }
};

C'est assez efficace - vous pouvez envoyer l'URL préremplie à chaque personne, qui aurait déjà répondu à certaines questions.

betterBuildUrls ()

Au lieu de créer notre modèle en utilisant la force brute, nous pouvons l'assembler par programme. Cela aura l’avantage de pouvoir réutiliser le code sans avoir besoin de penser à changer de modèle.

Chaque question d'un formulaire est un élément. Pour cet exemple, supposons que le formulaire ne comporte que 4 questions, telles que vous les avez décrites. Article [0] est "Nom", [1] est "Anniversaire", et ainsi de suite.

Nous pouvons créer une réponse au formulaire, que nous ne soumettrons pas. Nous le compléterons partiellement, mais uniquement pour obtenir l'URL du formulaire pré-rempli. Puisque l'API Forms comprend les types de données de chaque élément, nous pouvons éviter de manipuler le format de chaîne des dates et d'autres types, ce qui simplifie quelque peu notre code.

( EDIT: Il existe une version plus générale de ceci dans Comment pré-remplir les cases à cocher du formulaire Google? )

/**
 * Use Form API to generate pre-filled form URLs
 */
function betterBuildUrls() {
  var ss = SpreadsheetApp.getActive();
  var sheet = ss.getSheetByName("Sheet1");
  var data = ss.getDataRange().getValues();  // Data for pre-fill

  var formUrl = ss.getFormUrl();             // Use form attached to sheet
  var form = FormApp.openByUrl(formUrl);
  var items = form.getItems();

  // Skip headers, then build URLs for each row in Sheet1.
  for (var i = 1; i < data.length; i++ ) {
    // Create a form response object, and prefill it
    var formResponse = form.createResponse();

    // Prefill Name
    var formItem = items[0].asTextItem();
    var response = formItem.createResponse(data[i][1]);
    formResponse.withItemResponse(response);

    // Prefill Birthday
    formItem = items[1].asDateItem();
    response = formItem.createResponse(data[i][2]);
    formResponse.withItemResponse(response);

    // Get prefilled form URL
    var url = formResponse.toPrefilledUrl();
    Logger.log(url);  // You could do something more useful here.
  }
};

yymmdd Fonction

Tout élément de date dans l'URL du formulaire prérempli doit être au format suivant: yyyy-mm-dd. Cette fonction d'assistance étend l'objet Date avec une nouvelle méthode permettant de gérer la conversion.

Lors de la lecture de dates dans une feuille de calcul, vous obtenez un objet Date javascript, tant que le format des données est reconnaissable en tant que date. (Votre exemple n'est pas reconnaissable, donc au lieu de May 9th 1975 vous pouvez utiliser 5/9/1975.)

// From http://blog.justin.kelly.org.au/simple-javascript-function-to-format-the-date-as-yyyy-mm-dd/
Date.prototype.yyyymmdd = function() {
  var yyyy = this.getFullYear().toString();                                    
  var mm = (this.getMonth()+1).toString(); // getMonth() is zero-based         
  var dd  = this.getDate().toString();             

  return yyyy + '-' + (mm[1]?mm:"0"+mm[0]) + '-' + (dd[1]?dd:"0"+dd[0]);
};
91
Mogsdad