web-dev-qa-db-de.com

Ist es möglich, ein Google-Formular mithilfe von Daten aus einer Google-Tabelle vorab auszufüllen?

Ich suche nach einer Möglichkeit, ein Google-Formular vorab mit bestimmten Daten aus einer Google-Tabelle auszufüllen. Das Formular enthält für alle die gleichen "Standard" -Fragen, die Daten in den ersten beiden Fragen werden jedoch mit eindeutigen Daten aus einer vorhandenen Google-Tabelle "vorab gefüllt". Die Daten sind basierend auf ihrer E-Mail-Adresse in der vorhandenen Tabelle eindeutig.

SOURCE SPREADSHEET BEISPIEL

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

FORMBEISPIEL 1

Frage 1 - mit Daten gefüllt (Mike Jones) aus einer Google-Tabelle.

Frage 2 - mit Daten gefüllt (9. Mai 1975) aus einer Google-Tabelle.

Frage 3 - leer (warten auf Benutzerantwort)

Frage 4 - leer (warten auf Benutzerantwort)


FORM BEISPIEL ZWEI

Frage 1 - mit Daten gefüllt (Jim Smith) aus einer Google-Tabelle.

Frage 2 - mit Daten gefüllt (19. April 1985) aus einer Google-Tabelle.

Frage 3 - leer (warten auf Benutzerantwort)

Frage 4 - leer (warten auf Benutzerantwort)


Weiß jemand, ob dies getan werden kann? Wenn ja, wird jede Hilfe oder Anweisung sehr geschätzt.

Danke im Voraus!
Todd

62
Mr. B

Sie können eine vorab ausgefüllte Formular-URL im Formular-Editor erstellen, wie in der Dokumentation für Drive Forms beschrieben. Am Ende erhalten Sie eine URL wie diese, zum Beispiel:

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

buildUrls ()

In diesem Beispiel hat Frage 1, "Name", die ID 726721210, Während Frage 2, "Geburtstag" 787184751 Lautet. Die Fragen 3 und 4 sind leer.

Sie können die vorab ausgefüllte URL generieren, indem Sie die über die Benutzeroberfläche bereitgestellte URL wie folgt als Vorlage anpassen:

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

Dies ist effektiv genug - Sie können die vorab ausgefüllte URL per E-Mail an jede Person senden, die bereits einige Fragen ausgefüllt hat.

betterBuildUrls ()

Anstatt unsere Vorlage mit brachialer Gewalt zu erstellen, können wir sie programmgesteuert zusammensetzen. Dies hat den Vorteil, dass wir den Code wiederverwenden können, ohne daran denken zu müssen, die Vorlage zu ändern.

Jede Frage in einem Formular ist ein Element. Nehmen wir für dieses Beispiel an, dass das Formular nur vier Fragen enthält, wie Sie sie beschrieben haben. Artikel [0] Ist "Name", [1] Ist "Geburtstag" und so weiter.

Wir können eine Formularantwort erstellen, die wir nicht senden. Stattdessen füllen wir das Formular teilweise aus, um die vorab ausgefüllte Formular-URL zu erhalten. Da die Formular-API die Datentypen der einzelnen Elemente versteht, können wir vermeiden, das Zeichenfolgenformat von Datums- und anderen Typen zu ändern, was unseren Code etwas vereinfacht.

( BEARBEITEN: Es gibt eine allgemeinere Version davon in So füllen Sie Google-Formular-Kontrollkästchen vor? )

/**
 * 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 Funktion

Jedes Datumselement in der URL des vorab ausgefüllten Formulars hat voraussichtlich das folgende Format: yyyy-mm-dd. Diese Hilfsfunktion erweitert das Date-Objekt um eine neue Methode für die Konvertierung.

Wenn Sie Daten aus einer Tabelle lesen, erhalten Sie ein Javascript-Date-Objekt, sofern das Format der Daten als Datum erkennbar ist. (Ihr Beispiel ist nicht erkennbar, daher können Sie anstelle von May 9th 1975 Auch 5/9/1975 Verwenden.)

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