google-apps-script forms - Ist es möglich, ein Google-Formular mit Daten aus einer Google-Tabelle "vorzufüllen"?





examples sheet (2)


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

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" eine ID von 726721210 , während Frage 2 "Geburtstag" 787184751 . Die Fragen 3 und 4 sind leer.

Sie könnten die vorgefüllte URL generieren, indem Sie die über die Benutzeroberfläche bereitgestellte URL wie folgt 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önnten die vorgefüllte URL per E-Mail an jede Person senden, und sie hätten einige Fragen bereits ausgefüllt.

betterBuildUrls ()

Anstatt unsere Vorlage mit roher Gewalt zu erstellen, können wir sie programmatisch zusammensetzen. Dies hat den Vorteil, dass wir den Code erneut verwenden können, ohne dass Sie daran denken 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 4 Fragen enthält, wie Sie sie beschrieben haben. Element [0] ist "Name", [1] ist "Geburtstag" und so weiter.

Wir können eine Formularantwort erstellen, die wir nicht einreichen. Stattdessen füllen wir das Formular teilweise aus, nur um die vorgefüllte Formular-URL zu erhalten. Da die Forms-API die Datentypen jedes Elements versteht, können wir das Stringformat von Datumsangaben und anderen Typen nicht manipulieren, was unseren Code etwas vereinfacht.

( BEARBEITEN: Es gibt eine allgemeinere Version davon in Wie Sie Google Formular Checkboxen vorfüllen? )

/**
 * 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 ein beliebiges Datum in der URL des vorgefüllten Formulars dieses Format aufweist: yyyy-mm-dd . Diese Hilfsfunktion erweitert das Date-Objekt um eine neue Methode zur Verarbeitung der 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, so dass Sie anstelle des May 9th 1975 5/9/1975 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]);
};

Ich bin auf der Suche nach einer Möglichkeit, ein Google-Formular mit bestimmten Daten aus einer Google-Tabelle "vorzufüllen". Das Formular wird die gleichen "Standard" -Fragen für alle haben, aber die Daten in den ersten beiden Fragen werden mit eindeutigen Daten aus einer vorhandenen Google-Tabelle "vorgefüllt". Die Daten werden basierend auf ihrer E-Mail-Adresse in der vorhandenen Tabelle eindeutig sein.

SOURCE SPREADSHEET BEISPIEL

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

FORM BEISPIEL 1

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

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

Frage 3 - leer (wartet auf Benutzerantwort)

Frage 4 - leer (wartet auf Benutzerantwort)

FORMBEISPIEL ZWEI

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

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

Frage 3 - leer (wartet auf Benutzerantwort)

Frage 4 - leer (wartet auf Benutzerantwort)

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

Vielen Dank im Voraus!
Todd




Update: Google Formulare kann jetzt Dateien hochladen. Diese Antwort wurde gepostet, bevor Google Forms Dateien hochladen konnte.

Diese Lösung verwendet keine Google Formulare. Dies ist ein Beispiel für die Verwendung einer Apps Script-Webanwendung, die sich von einem Google-Formular stark unterscheidet. Eine Web App ist im Grunde eine Website, aber Sie können keinen Domain-Namen dafür erhalten. Dies ist keine Änderung eines Google Formulars, die nicht zum Hochladen einer Datei verwendet werden kann.

Hinweis : Ich hatte ein Beispiel für den UI-Dienst und den HTML-Dienst, aber ich habe das Beispiel für den UI-Dienst entfernt, da der UI-Dienst veraltet ist.

HINWEIS : Die einzige verfügbare Sandbox-Einstellung ist jetzt IFRAME . onsubmit Sie ein Attribut onsubmit im ersten Formular-Tag verwenden onsubmit : <form onsubmit="myFunctionName()"> kann das Formular nach der Formularübergabe vom Bildschirm verschwinden.

Wenn Sie den NATIVE-Modus verwenden, funktioniert Ihre Datei-Upload-Webanwendung möglicherweise nicht mehr. Im NATIVE-Modus würde eine Formularübergabe nicht das Standardverhalten der Seite aufrufen, die vom Bildschirm verschwindet. Wenn Sie den NATIVE-Modus verwenden und das Formular zum Hochladen von Dateien nicht mehr funktioniert, verwenden Sie möglicherweise die Schaltfläche "Senden". Ich vermute, dass Sie möglicherweise auch die clientseitige API "google.script.run" verwenden, um Daten an den Server zu senden. Wenn Sie möchten, dass die Seite nach dem Senden eines Formulars nicht mehr auf dem Bildschirm angezeigt wird, können Sie dies auf andere Weise tun. Aber es ist Ihnen vielleicht egal, oder sogar lieber, dass die Seite auf dem Bildschirm bleibt. Je nachdem, was Sie wollen, müssen Sie die Einstellungen konfigurieren und einen bestimmten Code eingeben.

Wenn Sie die Schaltfläche "Senden" verwenden und diese weiterhin verwenden möchten, können Sie versuchen, event.preventDefault(); zu Ihrem Code in der Submit-Event-Handler-Funktion. Oder Sie müssen die clientseitige API von google.script.run .

Ein benutzerdefiniertes Formular zum Hochladen von Dateien von einem Computerlaufwerk des Benutzers auf Google Drive kann mit dem HTML-Dienst für Apps-Skripts erstellt werden. Dieses Beispiel erfordert das Schreiben eines Programms, aber ich habe hier den grundlegenden Code bereitgestellt.

Dieses Beispiel zeigt ein Upload-Formular mit dem HTML-Dienst Google Apps Script.

Was du brauchst

  • Google Benutzerkonto
  • Google Drive
  • Google Apps Script - auch Google Script genannt

Google Apps-Skript

Es gibt verschiedene Möglichkeiten, um im Google Apps Script-Code-Editor zu landen.

  • Laden Sie Apps Script direkt von der Webadresse https://script.google.com
  • Öffnen Sie zuerst ein Google-Blatt und anschließend Apps-Skript
  • Gehen Sie zu Google Drive und dann zu Google Apps-Skript: https://drive.google.com/drive/#my-drive
  • Gehe zu deinem Google Drive und klicke dann auf eine Apps Script-Projektdatei
  • Öffnen Sie das Google Apps-Skript aus Google Text & Tabellen
  • etc

Ich erwähne das, denn wenn Sie nicht alle Möglichkeiten kennen, könnte es ein wenig verwirrend sein. Google Apps Script kann in eine Google-Website, Google Tabellen, Google Docs oder Google Formulare eingebettet oder als eigenständige App verwendet werden.

Apps-Skriptübersicht

Dieses Beispiel ist eine "Stand Alone" -App mit HTML-Service.

HTML-Service - Erstellen Sie eine Web-App mit HTML, CSS und Javascript

Google Apps Script hat nur zwei Arten von Dateien innerhalb eines Project :

  • Skript
  • HTML

.gs Erweiterung .gs . Der .gs Code ist ein serverseitiger Code, der in JavaScript geschrieben ist, und eine Kombination aus der eigenen API von Google.

  • Kopieren Sie den folgenden Code und fügen Sie ihn ein
  • Speichern Sie es
  • Erstellen Sie die zuerst benannte Version
  • Veröffentlichen Sie es
  • Legen Sie die Berechtigungen fest

    und du kannst anfangen es zu benutzen.

Beginnen mit:

  • Erstellen Sie ein neues leeres Projekt in Apps Script
  • Kopieren und Einfügen in diesem Code:

Laden Sie eine Datei mit dem HTML-Service hoch:

Code.gs- Datei ( standardmäßig erstellt)

//For this to work, you need a folder in your Google drive named:
// 'For Web Hosting'
// or change the hard coded folder name to the name of the folder
// you want the file written to

function doGet(e) {
  return HtmlService.createTemplateFromFile('Form')
    .evaluate() // evaluate MUST come before setting the Sandbox mode
    .setTitle('Name To Appear in Browser Tab')
    .setSandboxMode();//Defaults to IFRAME which is now the only mode available
}

function processForm(theForm) {
  var fileBlob = theForm.picToLoad;

  Logger.log("fileBlob Name: " + fileBlob.getName())
  Logger.log("fileBlob type: " + fileBlob.getContentType())
  Logger.log('fileBlob: ' + fileBlob);

  var fldrSssn = DriveApp.getFolderById(Your Folder ID);
    fldrSssn.createFile(fileBlob);

  return true;
}

Erstellen Sie eine HTML-Datei:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <h1 id="main-heading">Main Heading</h1>
    <br/>
    <div id="formDiv">

      <form id="myForm">

        <input name="picToLoad" type="file" /><br/>
        <input type="button" value="Submit" onclick="picUploadJs(this.parentNode)" />

      </form>
    </div>


  <div id="status" style="display: none">
  <!-- div will be filled with innerHTML after form submission. -->
  Uploading. Please wait...
</div>

</body>
<script>

function picUploadJs(frmData) {

  document.getElementById('status').style.display = 'inline';

  google.script.run
    .withSuccessHandler(updateOutput)
    .processForm(frmData)
};
  // Javascript function called by "submit" button handler,
  // to show results.

  function updateOutput() {

    var outputDiv = document.getElementById('status');
    outputDiv.innerHTML = "The File was UPLOADED!";
  }

</script>
</html>

Dies ist ein voll funktionsfähiges Beispiel. Es hat nur zwei Schaltflächen und ein <div> -Element, so dass Sie auf dem Bildschirm nicht viel sehen werden. Wenn das .gs Skript erfolgreich ist, wird True zurückgegeben, und eine onSuccess Funktion wird ausgeführt. Die onSuccess-Funktion (updateOutput) injiziert inneren HTML-Code in das div Element mit der Nachricht "Die Datei wurde UPLOADED!"

  • Speichern Sie die Datei, geben Sie dem Projekt einen Namen
  • Über das Menü: File , Manage Version dann die erste Version speichern
  • Publish , Deploy As Web App dann Aktualisieren

Wenn Sie das Skript das erste Mal ausführen, werden Sie nach Berechtigungen gefragt, weil es Dateien auf Ihrem Laufwerk speichert. Nachdem Sie das erste Mal Berechtigungen erteilt haben, wird das Apps-Skript beendet und die Ausführung wird nicht abgeschlossen. Also, Sie müssen es erneut ausführen. Das Skript wird nach dem ersten Mal nicht erneut nach Berechtigungen fragen.

Die Apps-Skriptdatei wird in Google Drive angezeigt. In Google Drive können Sie Berechtigungen festlegen, wer auf das Skript zugreifen und dieses verwenden darf. Das Skript wird ausgeführt, indem einfach der Link für den Benutzer bereitgestellt wird. Verwenden Sie den Link genau so, wie Sie eine Webseite laden würden.

Ein weiteres Beispiel für die Verwendung des HTML-Dienstes finden Sie unter diesem Link hier auf :

Datei-Upload mit HTML-Service

HINWEISE zum veralteten UI-Service:

Es gibt einen Unterschied zwischen dem UI-Dienst und der Ui getUi() Methode der Spreadsheet-Klasse (oder einer anderen Klasse). Der Apps Script UI-Dienst wurde am 11. Dezember 2014 nicht weiter unterstützt. Er wird noch einige Zeit weiter funktionieren. aber Sie sind aufgefordert, den HTML-Service zu verwenden.

Google-Dokumentation - Benutzeroberflächen-Service

Obwohl der UI-Service veraltet ist, gibt es eine getUi() -Methode der Tabellenkalkulationsklasse zum Hinzufügen benutzerdefinierter Menüs , die NICHT veraltet ist:

Spreadsheet-Klasse - Get UI-Methode

Ich erwähne das, weil es verwirrend sein könnte, weil beide die Terminologie UI verwenden .

Die UI-Methode gibt einen UI-Rückgabetyp zurück.

Sie können HTML zu einem UI-Service hinzufügen, aber Sie können kein <button> , <input> oder <script> -Tag im HTML mit dem UI-Service verwenden.

Hier ist ein Link zu einer freigegebenen Apps-Skript-Web-App-Datei mit einem Eingabeformular:

Gemeinsame Datei - Kontaktformular







google-apps-script google-spreadsheet google-form