Gibt es eine Möglichkeit, eine Frage im Stil "Aus einer Liste auswählen" in einem Google Form mit einer Liste von Daten (z. B. in einer Tabelle) zu verknüpfen?

10

Gibt es eine Möglichkeit, eine Frage im Stil "Aus einer Liste auswählen" in einem Formular mit einer Liste von Daten (z. B. in einer Tabelle) zu verknüpfen?

Dies würde bedeuten, dass neue Optionen, die der Liste in der Tabelle hinzugefügt wurden (oder wo immer es sonst möglich ist, die Liste zu hosten), automatisch als Option zur zukünftigen Auswahl im Formular angezeigt werden.

In meinem Fall würde dies bedeuten, dass die Befragten, die das Formular ausfüllen, aus der umfassenden Liste der Freiwilligen auswählen können, welche Freiwilligen bei dieser bestimmten Freiwilligensitzung anwesend waren (anstatt jeden Namen einzeln einzugeben), aber da Freiwillige sporadisch beitreten, ist dies der Fall Dies wäre äußerst hilfreich, wenn diese automatisch zu den Optionen in der Liste hinzugefügt werden könnten, anstatt jedes Mal manuell eine neue Option hinzuzufügen.

Ich habe keine Ahnung, ob dies möglich ist, aber ich würde es wirklich begrüßen, wenn jemand einen Weg vorschlagen könnte, dies zu tun.

Andy
quelle
Jacob Jan Tuinstra

Antworten:

3

Die Antwort von Tom Horwood funktioniert hervorragend, aber erst, nachdem ein wichtiger Fehler in seinem Code korrigiert wurde. Alle Verweise auf LIST_DATAElemente sollten unter Verwendung des Index j(nicht i) erfolgen. Ich habe nicht genug Karma, um Toms Beitrag zu kommentieren.

Unten ist der korrigierte Code. Ich habe auch den Namen der LIST_DATAElemente geändert, damit sie etwas aussagekräftiger sind. Es zeigt auch, wie Tom vorausgedacht hatte (Lob!) Und die Möglichkeit bot, mehr als ein Formularelement mit dem Inhalt von mehr als einer Tabellenkalkulationsliste zu aktualisieren.

var FORMID = "PUT_YOUR_FORM_ID_HERE";
var LIST_DATA = [{formFieldTitle:"Job Number", worksheetName:"JobNumbers"},
             {formFieldTitle:"Task 1 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 2 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 3 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 4 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 5 Category", worksheetName:"TaskCategories"},
             {formFieldTitle:"Task 6 Category", worksheetName:"TaskCategories"},
            ];

function onOpen(e){
  var menuEntries = [];
  menuEntries.push({name: "Update Lists", functionName: "updateLists"});
  SpreadsheetApp.getActiveSpreadsheet().addMenu("List Updater", menuEntries)
};

function updateLists() {
  var form = FormApp.openById(FORMID);
  var items = form.getItems();
  for (var i = 0; i < items.length; i += 1){
    for (var j = 0; j < LIST_DATA.length; j += 1) {
      var item = items[i]
      if (item.getTitle() === LIST_DATA[j].formFieldTitle){
        updateListChoices(item.asListItem(), LIST_DATA[j].worksheetName);
        break;
      }
    }
  }
}

function updateListChoices(item, sheetName){
  var data = (SpreadsheetApp.getActiveSpreadsheet()
              .getSheetByName(sheetName)
              .getDataRange()
              .getValues());
  var choices = [];
  for (var i = 0; i < data.length; i+=1){
    choices.push(item.createChoice(data[i][0]));
  }
  item.setChoices(choices);
}

Um zusammenzufassen, wie dies funktioniert (für diejenigen wie mich, die Google Apps Script zum ersten Mal verwenden). Ich habe im obigen Codeausschnitt auf Blattnamen und Formularfeldnamen verwiesen, um es hoffentlich verständlicher zu machen:

  1. In der Tabelle, die Ihrem Formular zugeordnet ist:

    • Erstellen Sie ein neues Arbeitsblatt. Dies enthält die Liste der Elemente, die einem Feld hinzugefügt werden sollen. Geben Sie dem Arbeitsblatt einen geeigneten Namen (z. B. TaskCategories). Fügen Sie Ihre Liste der Elemente dort in die erste Spalte dieses Arbeitsblatts ein. Löschen Sie alle zusätzlichen Spalten und Zeilen auf diesem Blatt (dies kann erforderlich sein oder nicht - nicht getestet)
    • Wählen Sie im Menü Extras die Option "Skript-Editor". Kopieren Sie das obige Codefragment und fügen Sie es in den Skripteditor ein. Sie müssen die folgenden Teile des Skripts ändern:
      • Der Wert der Variablen FORMIDmuss in die ID Ihres Formulars geändert werden. Die ID ist der lange Code (zwischen Schrägstrichen) in der URL-Leiste Ihres Browsers für das gewünschte Formular.
      • Die LIST_DATAVariable muss an Ihr Formular und Ihre Anforderungen angepasst werden. Sie werden feststellen, dass jedes Element in LIST_DATAein Tupel von formFieldTitleund ist worksheetName. Ersteres ist der Name des Formularfelds (das muss ein Feldtyp vom Typ "Aus Liste auswählen" sein) - im Formulareditor heißt es Question Title. Letzteres ist der Name des zuvor erstellten Arbeitsblatts, das die Liste der Elemente enthält, mit denen Sie das Feld füllen möchten. Fügen Sie der Liste so viele dieser Tupel hinzu, wie Sie benötigen.
      • Speichern Sie nun das Skript (Klicken Sie auf das Speichersymbol)
      • Testen Sie das Skript, indem Sie im Skripteditor-Menü die Option "Ausführen" und dann "updateLists" auswählen. Wenn Sie dies zum ersten Mal tun, werden Sie um Erlaubnis gebeten. Wenn das Skript erfolgreich ist, können Sie feststellen, dass in Ihrem Formular jetzt die angegebenen Felder ausgefüllt sind. Andernfalls wird auf dem Bildschirm eine Fehlermeldung angezeigt.
  2. Wenn Sie zur Tabelle zurückkehren, sollte ein neuer Menüpunkt mit dem Titel angezeigt werden List Updater. Es enthält ein Element, Update Listsdas Sie jedes Mal ausführen müssen, wenn Sie eines Ihrer Arbeitsblätter für Listen ändern. Das Formular wird entsprechend aktualisiert.

Ich stelle außerdem zum Nutzen der Leser fest, dass FormRanger nicht mit den neuen Google Spreadsheets funktioniert. Das sagen die FormRanger-Entwickler auf ihrer Website. Vielleicht / hoffentlich ändert sich das in Zukunft, aber zum Zeitpunkt dieser Veröffentlichung funktioniert der obige Code für mich und ich verwende ihn in einer bereitgestellten Form für einen Client.

allnatürlich
quelle
Ich denke, dies ist eine großartige Antwort, um die Schritt für Schritt für diejenigen aufzunehmen, die keine Erfahrung mit dem Verknüpfen eines Skripts oder irgendetwas haben. Um bei der Formatierung des js-Codes wählerisch zu sein, fügen Sie nach der Initialisierung des LIST_DATA-Arrays ein Semikolon hinzu. Um es jetzt weiter anzupassen, verwenden Sie "for (var i = 1; i <data.length; i + = 1) {// Überspringen Sie die Headerzeile, indem Sie den Index bei 1 beginnen."
Gary
Bearbeitet, um das fehlende Semikolon zu beheben - danke @Gary für das Bemerken :-)
allnatural
2

Sie können dies mit einem normalen Formular und einem Skript tun. Verwenden Sie Form.getItems (), suchen Sie das Element in der Schleife und dann Item.asListItem (). SetChoices (...)

Hier ist ein Beispielcode, die ich in diesem Beispiel verwendet habe , Blatt und Form

var FORMID = "YOUR FORM ID HERE";
var LIST_DATA = [{title:"Who's your tutor", sheet:"TutorName"}]

function onOpen(e){
  var menuEntries = [];
  menuEntries.push({name: "Update Lists", functionName: "updateLists"});
  SpreadsheetApp.getActiveSpreadsheet().addMenu("List Updater", menuEntries)
}

function updateLists() {
  var form = FormApp.openById(FORMID);
  var items = form.getItems();
  for (var i = 0; i < items.length; i += 1){
    for (var j = 0; j < LIST_DATA.length; j+=1) {
      var item = items[i]
      if (item.getTitle() === LIST_DATA[j].title){
        updateListChoices(item.asListItem(), LIST_DATA[j].sheet);
        break;
      }
    }
  }
}

function updateListChoices(item, sheetName){
  var data = (SpreadsheetApp.getActiveSpreadsheet()
              .getSheetByName(sheetName)
              .getDataRange()
              .getValues());
  var choices = [];
  // If your sheets have headers, change i = 0 to i = 1
  for (var i = 0; i < data.length; i+=1){
    choices.push(item.createChoice(data[i][0]));
  }
  item.setChoices(choices);
}
Tom Horwood
quelle
Der Formularlink ist jetzt behoben
Tom Horwood
1

Es gibt ein Google Forms-Add-On namens Formularwerte, das zumindest eine halbautomatische Möglichkeit bietet: Wenn Sie Ihre Antworten in der Tabelle ändern, müssen Sie die Auswahlmöglichkeiten in Ihrer Antwort manuell neu ausfüllen, aber zumindest ist dies recht einfach .

kynan
quelle
0

Mit den regulären Google Forms ist dies nicht möglich.

Sie können jedoch mithilfe von Google Apps Script und speziell des UIService eine eigene Benutzeroberfläche erstellen . Beachten Sie jedoch, dass Sie die gesamte GUI neu erstellen müssen - Sie können keine Teile aus Ihrem vorhandenen Formular verwenden.

Alternativ können Sie den GUI Builder verwenden . Es ist ein WYSIWYG-Editor für Google Apps Script-GUIs.

Was auch immer Sie wählen, Sie sollten bereit sein, etwas zu programmieren, um das zu erreichen, was Sie wollen.

Vidar S. Ramdal
quelle
1
Der GUI Builder ist veraltet, daher würde ich das nicht mehr verwenden.
Jacob Jan Tuinstra
Der UIService ist ebenfalls veraltet.
Rubén
0

Es gibt eine Möglichkeit, die Listenaktualisierung zu automatisieren, indem Sie einen Trigger [ 1 ] [ 2 ] für festlegen Update Lists.

Der Pfad lautet Skripteditor -> Ressourcen -> Auslöser des aktuellen Projekts

Dann add a new trigger. Für die angegebenen Beispiele können Sie festlegen updatesList, dass from spreadsheetund ausgeführt werden On form submission. Auf diese Weise wird die Funktion onOpennicht benötigt.

Nayuki Pereira Hara
quelle
-1

Ja, es kann getan werden, einen guten Teil des Tages damit verbracht, die Antwort zu finden und sie dann für meine Zwecke zu entwickeln, aber es kann getan werden.

Ich brauchte ein Anmeldeformular für Freiwillige, damit die Leute mehrere Kästchen aus einer Liste von Bereichen ankreuzen können, für die sie sich freiwillig melden möchten. Daher besteht eine Frage mit mehreren Feldern darin, dass die resultierende Google-Tabelle nur alles auflistet, was sie in einer Zelle überprüft haben. Es gab 21 Freiwilligenoptionen, so dass dies eindeutig kein nützliches Format für diese Informationen wäre. Ich wollte das tun, was ich verstanden habe, um zu sagen, dass Sie es wollten. Ich wollte eine Spalte mit jeder der 21 Optionen in einer eigenen Spalte haben. Neben dem Zeitstempel (Formular generiert), dem Namen, der E-Mail-Adresse und dem Telefon befinden sich 21 Spalten mit "Ja" oder leer gelassen. Die Spaltenüberschrift ist jede Option, die sie auswählen können. Einige fragen sich vielleicht, warum sie nicht einfach 21 Fragen mit "Ja" oder "Nein" haben.

Beachten Sie zunächst, dass beim Ausfüllen eines Google-Formulars in der resultierenden Tabelle eine Zeile eingefügt wird, anstatt die Daten zur nächsten leeren Zeile hinzuzufügen. Dies bedeutet, dass alle Formeln, die sich in der Zeile befanden, nur heruntergestoßen wurden und die neuen Daten aus der Formel keine Formel zwei haben, um mit den Eingabedaten zu arbeiten. Um darüber hinaus zu kommen, habe ich der Tabelle (Arbeitsmappe) ein Blatt hinzugefügt. Ich habe Eingaben von brettathds unter http://productforums.google.com/forum/#!topic/docs/dlW6U6cHuKw verwendet und daher die folgende Formel in Zelle A1 dieses zweiten Blattes eingefügt: = ARRAYFORMULA (Blatt1! A1: A). Ich habe für jede Spalte bis Spalte E Ähnliches getan. Spalte E hat die Frage mit den 21 Kontrollkästchen.

Noch auf dem zweiten Blatt hatte Zeile 1 der Spalten FY Überschriften, die mit dem Text auf jeder Kontrollkästchenoption aus der Checkliste der Bereiche identisch waren, für die sie sich freiwillig melden möchten. Dann war Spalte Z die nächste und letzte Frage im Formular. Es war eine kurze Textfrage mit dem Titel "Zusätzliche Kommentare". Für diese Spalte habe ich die = ARRAYFORMULA (Sheet1! F1: F) verwendet. Ich habe dies als separate Frage durchgeführt, anstatt die Option "other" am Ende der Kontrollkästchen-Fragen zu verwenden, da es anscheinend keine gute Möglichkeit gab, dies zu ermitteln Daten in die Tabelle.

Nun zu dem Teil, der antwortet, wie Sie die Informationen aus der Zelle in Spalte E (in der bis zu 21 Elemente aufgelistet sein können) erhalten, um Spalten mit "Ja" oder einfach leer zu trennen. Die Formel in F2 auf dem zweiten Blatt lautet = iferror (if (Suche (F $ 1, $ E2)> 0, "Ja",)) Diese Formel prüft, ob der genaue Text in der Spaltenüberschrift (F1) gefunden wurde Wenn dies in E2 der Fall ist, wird ein "Ja" zurückgegeben. Andernfalls wird es leer gelassen.

Diese Formel, auf die in F2 verwiesen wird, ist so geschrieben (unter Verwendung von "$" über die Taste F4), dass F2 von GY in jede Zelle in Zeile 2 kopiert / eingefügt werden kann (Google Spreadsheet unterstützt das Kopieren von Formeln durch Ziehen / Kopieren nicht wie möglich in Excel, aber Sie können dies tun, indem Sie F2, dann STRG + C und dann G2: Y2 und dann STRG + V auswählen. Ich habe dann die gleiche Methodik verwendet und F2: Y2 bis F3: Y100 eingefügt.

Ich habe dann Spalte E auf dem zweiten Blatt ausgeblendet, so dass das resultierende Arbeitsblatt kompakter war (wobei der gesamte Zeilenumbruch der langen Antworten vermieden wurde).

Jetzt bin ich bereit, 99 Freiwillige über das schnelle und einfache Formular aufzunehmen, das sie ausfüllen. Durch die Verwendung der Filteroptionen oben in den Spalten konnte auch festgestellt werden, wer für welche Bereiche verfügbar war.

Eine letzte Frustration, die ich nicht gelöst habe. Ich habe einige gefälschte Formulare ausgefüllt, um meine Formeln und mein Design zu testen, und diese Zeilen dann aus der verknüpften Tabelle gelöscht. Ich hatte auch ein paar Leute, die doppelte Formulare ausgefüllt haben. Ich habe auch ihre Zeilen gelöscht. Bemerkenswert in den Produktforen ist, dass ich nicht der einzige bin, der frustriert ist zu erfahren, dass Google die Test- / Schein- / Duplikatdaten immer noch in der "Zusammenfassung der Antworten" (auf der Registerkarte "Formular" der Tabelle) verkabelt hat. Daher ist die Zusammenfassung der Antworten für die Genauigkeit unbrauchbar, wenn Zeilen gelöscht wurden, um Daten aus Test- / Schein- / Duplikatformularen zu entfernen.

Aber es ist vollbracht und ich speichere diese Notizen für das nächste Mal, wenn ich ähnliche benötige. Ich bin zuversichtlich, dass dies beim nächsten Mal problemlos in weniger als 30 Minuten erledigt werden kann.

Hoffe das hilft, lass es mich wissen, wenn du Fragen hast.

user37987
quelle
2
Das ist viel Text.
Jacob Jan Tuinstra
Ein
großes Lob