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

70

Ich suche nach einer Möglichkeit, ein Google-Formular mit bestimmten Daten aus einer Google-Tabelle vorab auszufüllen. Das Formular enthält für alle die gleichen "Standard" -Fragen, aber die Daten in den ersten beiden Fragen werden mit eindeutigen Daten aus einer vorhandenen Google-Tabelle "vorgefü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

FORMULAR BEISPIEL 1

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

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

Frage 3 - leer (wartet auf Benutzerantwort)

Frage 4 - leer (wartet auf Benutzerantwort)


FORMULAR BEISPIEL ZWEI

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

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

Frage 3 - leer (wartet auf Benutzerantwort)

Frage 4 - leer (wartet auf Benutzerantwort)


Weiß jemand, ob dies möglich ist? Wenn ja, wird jede Hilfe oder Anweisung sehr geschätzt.

Danke im Voraus!
Todd

Herr B.
quelle

Antworten:

102

Sie können im Formulareditor eine vorab ausgefüllte Formular-URL erstellen, wie in der Dokumentation zu 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", lautet 787184751. 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 an eine 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, und sie hat bereits einige Fragen ausgefüllt.

betterBuildUrls ()

Anstatt unsere Vorlage mit Brute Force 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. In diesem Beispiel nehmen wir an, dass das Formular nur 4 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 Datumsangaben und anderen Typen zu ändern, was unseren Code etwas vereinfacht.

( BEARBEITEN: Eine allgemeinere Version davon finden Sie unter So füllen Sie Kontrollkästchen für Google-Formulare aus. )

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

Es wird erwartet, dass alle Datumsangaben in der vorab ausgefüllten Formular-URL dieses Format haben : yyyy-mm-dd. Diese Hilfsfunktion erweitert das Date-Objekt um eine neue Methode zur Abwicklung der Konvertierung.

Wenn Sie Daten aus einer Tabelle lesen, erhalten Sie ein Javascript-Datumsobjekt, sofern das Format der Daten als Datum erkennbar ist. (Ihr Beispiel ist nicht erkennbar, also May 9th 1975könnten Sie es verwenden 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]);
};
Mogsdad
quelle
Mogsdad, vielen Dank für die Information. Mein oberstes Ziel ist es, diesen Prozess "automatisiert" zu machen. Die Quell-Tabelle wird über ein Google-Formular aktualisiert. Ich möchte, dass ein sekundäres Formular automatisch mit einigen dieser Daten "vorgefüllt" und dann automatisch per E-Mail an die zugehörige E-Mail-Adresse gesendet wird . Ist das mit dem obigen Skript möglich?
Herr B
4
Es ist möglich, das obige Skript als Baustein zu verwenden. Verwenden Sie einen Auslöser für die Formularantwort für "Formular A", um die vorab ausgefüllte URL für "Formular B" zu generieren. Das Skript in "Blatt A" benötigt die ID oder URL von "Formular B", anstatt es zu verwenden, ss.getFormUrl()wenn Sie die "bessere" Funktion verwenden. Anstatt alle Daten zu
durchlaufen
Weißt du, ich habe völlig vergessen, wie vorgefüllte URLs formatiert wurden. Es sollte einen einfacheren Weg geben (nun, ich denke, es ist wirklich nicht so schwer), aber einen offensichtlicheren Weg, um vorgefüllte Formulare zu generieren. Ich wünschte, ich könnte Ihre Antwort noch 10 Mal positiv bewerten, da dies eine unglaublich nützliche Funktion ist, aber es ist nicht sofort ersichtlich, wie dies zu tun ist.
Chris Cirefice
1
@Mogsdad ist es möglich, die Antwort des zweiten Formulars als Update an das erste Formular zu senden? Ich meine, wenn der Benutzer Formular B einreicht, anstatt ein neues Antwortblatt zu erstellen, können wir die neuen Werte einfach an das vorhandene Blatt anhängen?
Kira
2
Das hängt davon ab, was "Anhängen" bedeutet. Wenn Sie dem ursprünglichen Formular eine weitere Zeile hinzufügen möchten, können Sie dies mithilfe der Forms-Methoden tun. Wenn Sie Informationsspalten außerhalb der ursprünglichen Antworten hinzufügen möchten, können Sie dies über tun, Range.setValues()indem Sie die andere Tabelle nach ID öffnen.
Mogsdad