it-swarm.com.de

Aktualisieren Sie die Google Form-Optionen "Aus Liste auswählen" dynamisch aus der Spalte in der Tabelle

Ich versuche, ein Google-Formular einzurichten, mit dem eine Frage " aus Liste auswählen " erstellt wird, wobei jede Option aus den Zeilen in einer bestimmten Spalte ausgewählt wird.

Ich habe versucht diesen Code , aber es hat bei mir überhaupt nicht funktioniert.

Der Code, den ich bisher habe, ist unten. Ich kann die gewünschte Formularfrage mit den Daten aus nur einer Zeile in der jeweiligen Spalte (in diesem Fall der letzten Zeile der Spalte) erstellen.

Wenn mir jemand helfen kann, indem er mir die richtige Richtung zeigt, wie man jede ausgewählte Zeile nur einer Frageoption zuweist. Auch wenn dies eine Möglichkeit ist, die Fragenoptionen bei jeder Aktualisierung der Tabelle dynamisch zu aktualisieren.

var idColumn = 1; // ID of the selected column

//gets document ID from spreadsheet 
//(not 100% sure the role of all of these lines, have worked it out from other examples of code online)
function spreadSheetGetter() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var values = rows.getValues();
  var lr = rows.getLastRow();  

  var docId = sheet.getRange(lr,idColumn,1,1).getValue(); //gets the data from the last row in selected column

fillFormData(docId);
}


//fills for with document ID
function fillFormData(docId) {
var form = FormApp.openById('MY FORMS ID');
var item = form.addListItem();

item.setTitle('Select Existing Customer') //creates the choose from list question
     .setChoices([
         item.createChoice(docId), //data from row 1
         item.createChoice(docId) //data from row 2 etc...
       ])
}
4
Method

Diese Aussage:

var docId = sheet.getRange(lr,idColumn,1,1).getValue();

bekommt nur einen Wert. Ich denke, Sie möchten alle Werte in der Spalte, also verwenden Sie die getValues() ('s' am Ende) -Methode, um ein zweidimensionales Array von Werten zu erhalten. Ändern Sie den Parameter numRows (Anzahl der abzurufenden Zeilen) in die Variable lr. Außerdem möchten Sie wahrscheinlich in Zeile 2 beginnen. Die Syntax lautet:

getRange(row, column, numRows, numColumns)
  • row - Integer die Anfangszeile des Bereichs
  • column - Ganzzahlige Startspalte des Bereichs
  • numRows - Integer die Anzahl der zurückzugebenden Zeilen
  • numColumns - Integer die Anzahl der zurückzugebenden Spalten

Die Parameter müssen also so eingestellt werden:

var docId = sheet.getRange(2,idColumn,lr,1).getValues();

Wenn in der Kalkulationstabelle die erste Zeile Überschriften enthält, möchten Sie die Überschrift möglicherweise nicht in die Elementliste aufnehmen. Deshalb wird der erste Parameter auf die Nummer 2 gesetzt, um von Zeile 2 zu beginnen.

Anschließend müssen Sie die Daten im zweidimensionalen Array verarbeiten und ein neues Array im für die Methode setChoices(choices) erforderlichen Format erstellen, um jeden Wert zur Liste hinzuzufügen. Sie benötigen eine Programmierschleife. Dadurch wird jedes Mal ein neues Array von Elementwerten erstellt, sodass die aktuellen Werte in der Spalte in der Liste aktualisiert werden.

var thisValue = "";
var arrayOfItems = [];
var newItem = "";

for (var i=0;i<docId.length;i++) {
  thisValue = docId[i][0];
  newItem = "item.createChoice('" + thisValue + "')";
  arrayOfItems.Push(newItem);
};

Die vollständige Funktion würde ungefähr so ​​aussehen:

//fills item with document ID
function fillFormData(docId) {
  var form = FormApp.openById('MY FORMS ID');
  var item = form.addListItem();

  var thisValue = "";
  var arrayOfItems = [];
  var newItem = "";

  for (var i=0;i<docId.length;i++) {
    thisValue = docId[i][0];
    Logger.log('thisValue: ' + thisValue);
    newItem = item.createChoice(thisValue);
    arrayOfItems.Push(newItem);
  };

  item.setTitle('Select Existing Customer') //creates the choose from list question
     .setChoices(arrayOfItems)
};
2
Sandy Good

Ich bin mir nicht sicher, ob dies für Sie hilfreich sein wird, aber es gibt einen einfacheren Weg, als diesen Vorgang selbst zu codieren. Es gibt ein Google Forms-Add-On namens FormRanger, das die Felder in einer Frage "Aus Liste auswählen" basierend auf Informationen aus den Zeilen eines anderen Arbeitsblatts automatisch auffüllt. Sie können es installieren, indem Sie im Menü des Formulars das Add-On aufrufen und dann ein neues Add-On hinzufügen.

Hier ist ein Link zur Beschreibung von FormRanger. Dieses Dokument enthält auch ein Tutorial.

https://docs.google.com/document/d/1qidnsrTShKU9kPnYz4nubHs2cK9yWnQ2z_XBoqgdIhs/edit

2
krishnab

Hoffe, ich bin nicht zu spät dafür, aber ich habe es geschafft, die in der Frage erwähnte Lösung zum Laufen zu bringen, und es scheint eine bessere Option zu sein, da ein bereits erstelltes Formular aktualisiert wird und kein neues oder eine neue Option für erstellt werden muss diese. Ich habe auch den Code geändert, der von Allnatural und ChrsF auf dem ursprünglichen Post dargestellt wird, sodass er benannte Bereiche (oder reguläre Bereiche) akzeptiert, wodurch die Anzahl der Blätter verringert wird, die Sie verwenden würden brauchen auf Ihrer Tabelle.

Sie sollten dieses Skript mit den Optionen in die Tabelle einfügen, damit es bei jeder Änderung oder in festgelegten Intervallen ausgeführt werden kann:

//Here you set the options for the question on your form you want to dinamically change and which named range will populate it
var LIST_DATA = [{formFieldTitle:"Who's your tutor", namedRange:"reg_opcoes"}]

//Inserts a menu entry that allows you to run the function to update the options of the form
function onOpen(e){
  var menuEntries = [];
  menuEntries.Push({name: "Update Lists", functionName: "updateLists"});
  SpreadsheetApp.getActiveSpreadsheet().addMenu("List Updater", menuEntries)
}

//The update function itself, it will run for as many options as you set in the LIST_DATA list
function updateLists() {
  var form = FormApp.openById('1Pl3i5Qr8Kq5C2UbBUqA0iZCsmaHXum5eWR1RfIaEL6g'); //Insert your form ID here
  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){ //Here the titles of the questions are called
        updateListChoices(item.asListItem(), LIST_DATA[j].namedRange); //Here the range that populates que question with options is called
        break;
      }
    }
  }
}

//Function that actually gets the values from the range you defined
function updateListChoices(item, sheetName){
  var data = (SpreadsheetApp.getActiveSpreadsheet()
              /* 
                 If you want, you might change the option here to .getDataRange() and work with defined ranges.
                 For that, yoiu should also place a .getSheetName() before it, so that'll know of what interval you're talking about
              */
              .getRange(sheetName) 
              .getValues());
  var choices = [];
  for (var i = 0; i < data.length; i+=1){
    choices.Push(item.createChoice(data[i][0]));
  }
  item.setChoices(choices);
}

Nachdem Sie es zu wokr gebracht haben, können Sie einen Trigger einstellen, um die "updateLists" -Funktion für jede in Ihrer Tabelle vorgenommene Änderung auszuführen. Dann müssen Sie die Option nicht manuell über die Menüschaltfläche aktualisieren.

Ich habe eine Weile nach dieser Lösung gesucht und bin froh, dass ich sie gefunden habe. Hoffe es hilft dir auch.

2
Fogolin

Ich habe die Funktionen in der obigen Antwort so bearbeitet, dass sie sowohl in Sheet als auch in Form funktionieren:

var sheetId = '<YOUR_SHEET_ID>';
var sheetName = 'sheet_1';
var column = 'C';
var formId = '<YOUR_FORM_ID>';
var listItemId = 12345678;

function spreadSheetGetter() {
  var sheet = SpreadsheetApp.openById(sheetId).getSheetByName(sheetName);
  var rows = sheet.getDataRange();
  var numRows = rows.getNumRows();
  var docId = sheet.getRange(sheetName+"!"+column+"2:"+column+numRows).getValues();
  fillFormData([].concat.apply([],docId));
}

function fillFormData(docId) {
  var form = FormApp.openById(formId);
  var item = form.getItemById(listItemId).asListItem();
  item.setChoiceValues(docId);
};

Ich habe IDs für Blätter und Formulare aus URLs gefunden, stattdessen für die ListItem-ID habe ich den bereitgestellten Code verwendet hier :

var form = FormApp.getActiveForm();
var items = form.getItems();
for (var i in items) { 
  Logger.log(items[i].getTitle() + ': ' + items[i].getId());
}
0
ggagliano