it-swarm.com.de

Kann ich ein Autoincrement-Feld zu einer Google-Tabelle hinzufügen, die auf einem Google Form basiert?

Ist es in Google Forms möglich, jeder Zeile, die in die Tabelle eingefügt wird, sowie dem Zeitstempel einen eindeutigen Wert zuzuweisen?

20
Toby Allen

Sie können dies tun, indem Sie einen Skript-Trigger hinzufügen.

Angenommen, Ihr aktuelles Formular enthält zwei Spalten Timestamp und die Antwort auf eine Frage. Sie haben also momentan die Spalten A und B, die mit Daten gefüllt sind. Nehmen wir an, Sie möchten, dass in Spalte C die Nummer automatisch erhöht wird.

Sie müssen zuerst zu Tools>Script Editor gehen.

Geben Sie im Skripteditor das folgende Skript ein:

function onFormSubmit(e) {

var sheet = SpreadsheetApp.getActiveSheet();
var row =  SpreadsheetApp.getActiveSheet().getLastRow();

sheet.getRange(row,3).setValue(row);


}

Speichern Sie das Skript und rufen Sie das Menü Triggers auf und wählen Sie Current script's triggers aus.

Füllen Sie die Dropdowns wie folgt aus:

Google Script Triggers

Klicken Sie auf Save

Speichern und schließen Sie dann das Google App Script-Fenster.

Wenn Ihr Formular jetzt gesendet wird, wird die Zeilennummer in Spalte C zusammen mit den Daten, die über Ihr Formular gesendet wurden, eingetragen.

Wenn Sie die Spalte ändern möchten, in der die Zeilennummer gespeichert wird, müssen Sie die folgende Zeile des Skripts ändern:

sheet.getRange(row,3).setValue(row);

und ändern Sie den Wert 3 in die entsprechende Spaltenindexnummer.

11
codingbadger

Zusätzlich zu der hervorragenden Antwort von Barry können Sie, wenn Sie Zeilen entfernen und dennoch eine eindeutige ID behalten möchten, eine statische Zelle haben, die eine Zählung aufrechterhält. Sie können diese Nummer dann verwenden und bei jedem neuen Eintrag in der Tabelle erhöhen.

Die Änderung besteht also darin, eine Zahl in Ihrer Tabelle zu speichern ('M1' im Code unten) und den Code so zu ändern, dass er wie folgt aussieht:

function onFormSubmit(e) 
{
   var sheet = SpreadsheetApp.getActiveSheet();
   var row =  SpreadsheetApp.getActiveSheet().getLastRow();

   var bugCount = sheet.getRange("M1").getValue();
   bugCount++;

   sheet.getRange(row,1).setValue(bugCount);
   sheet.getRange("M1").setValue(bugCount);
}

Ändern Sie erneut die vorletzte Zeile, um die Position Ihrer ID zu ändern.

7
Danny Parker

Aufbauend auf den beiden vorherigen Antworten (von Barry und Danny):

Angenommen, die ID-Spalte ist Spalte A. Wählen Sie eine "Nächste ID" -Zelle aus und stellen Sie sie auf die folgende Formel ein (vorausgesetzt, sie befindet sich in "P1"):

=MAX(A:A)+1

Erstellen Sie ein Skript mit dem Skript-Editor im Menü "Extras" und fügen Sie Folgendes ein:

function onFormSubmit(e) {
  // Get the active sheet
  var sheet = SpreadsheetApp.getActiveSheet();
  // Get the active row
  var row = sheet.getActiveCell().getRowIndex();
  // Get the next ID value.  NOTE: This cell should be set to: =MAX(A:A)+1
  var id = sheet.getRange("P1").getValue();
  // Check of ID column is empty
  if (sheet.getRange(row, 1).getValue() == "") {
    // Set new ID value
    sheet.getRange(row, 1).setValue(id);
  }
}

Fügen Sie einen Skript-Trigger über das Menü "Trigger" im Skript-Editor hinzu: enter image description here

7
oneself

Weiter zu den obigen Antworten - Für diese Lösung ist keine zusätzliche Tabellenzelle erforderlich.

Sie können die eingebauten Ereignishandler zum Senden des Formulars verwenden, um eine eindeutige ID zu erhalten. Da die Tabelle nur das Ziel für das Formular ist, wird die Antwort beim Löschen einer Zeile nicht gelöscht. In diesem Sinne ...

BEARBEITEN: ID-Bedarf wurde entfernt und Datumsformatierungsprobleme wurden behoben.

/**
* This function extracts the relevant properties from the event handler,
* then uses them to get the uniqueID and record the response
* @param {Object} e The event parameter for form submission to a spreadsheet;
*     e has the following properties values, range, namedValues
*/

function onFormSubmit(e) {
  var uniqueID = getUniqueID(e.values);
  recordResponseID(e.range, uniqueID);
}

/**
* Records the unique ID for this response to the correct cell.
* @param  {Object} eventRange Range in which the response is written
* @param  {Integer} uniqueID   Unique id for this range
*/

function recordResponseID(eventRange, uniqueID) {
  var row = eventRange.getRow();
  var column = eventRange.getLastColumn() + 1;
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.getRange(row, column).setValue(uniqueID);

}
/**
* A shortcut function to get the form that is connected to this spreadsheet
* @return {Form}          The form associated with this spreadsheet.
**/

function getConnectedForm() {
  var formUrl = SpreadsheetApp.getActiveSpreadsheet().getFormUrl();
  var form =  FormApp.openByUrl(formUrl);
  return form;
}

/**
* Returns a unique ID for the response, by finding the actual Response that
* has the same properties.
* @param  {Array} eventValues Array of: Timestamp_string, form_response_value...
* @return {Integer}             The unique id (by 1 based array position) of the Response
*/

function getUniqueID(eventValues) {
  var isMatch = false;
  var eventItems = eventValues.slice(1);

  var responses = getConnectedForm().getResponses();
  //loop backwards through responses (latest is most likely)
  for (var i = responses.length - 1; i > -1; i--) {
    var responseItems = responses[i].getItemResponses();
    //check each value matches

    for (var j = 0; j < responseItems.length; j++) {
      if (responseItems[j].getResponse() !== eventItems[j]) {
        break;
      }
      isMatch = true;
    }
    if (isMatch) {
      return i + 1;
    }
  }
}

function testOnSubmit() {
  var answers = [
    ["Sue", "39", "Okay I suppose"],
    ["John", "22", "Great"],
    ["Jane", "45", "yeah no"],
    ["Bob", "33", "Super"]
  ];

  var form = getConnectedForm();
  var items = form.getItems();
  for (var i = 0; i < answers.length; i++) {
    var formResponse = form.createResponse();
    for (var j = 0; j < items.length; j++) {
      var item = items[j];
      var itemResponse = item.asTextItem().createResponse(answers[i][j]);
      formResponse.withItemResponse(itemResponse);
    }
    formResponse.submit();
    Utilities.sleep(500);
  }

}
4
Tom Horwood

Dies ist eine Ableitung der anderen Antworten, kann aber für zukünftige Benutzer nützlich sein.

function onEdit(e) 
{
   var sheet = SpreadsheetApp.getActiveSheet();
   var row =  SpreadsheetApp.getActiveSheet().getActiveCell().getRow();

   var bugCount = sheet.getRange("M2").getValue();
   bugCount++;

   if (sheet.getRange(row, 1).getValue() == "") {
      sheet.getRange(row,1).setValue(bugCount);
      sheet.getRange("M2").setValue(bugCount);    
   }

}

Der Hauptunterschied besteht darin, dass Spalte 1 in der aktiven Zeile aktualisiert wird, wenn diese Zeile bearbeitet wird, jedoch nur, wenn noch kein Wert angegeben wurde.

Sie sollten den Auslöser wie in den anderen Antworten beschrieben auf on edit setzen.

set trigger to on edit

2
nacross

Für "Ist es in Google Form möglich, jeder Zeile, die in das Arbeitsblatt eingefügt wird, sowie dem Zeitstempel einen eindeutigen Wert zuzuweisen?" und gleichzeitig das Löschen einer Zeile im Formularantwortenblatt vor dem zuzulassen Wenn Sie eine weitere Antwort hinzufügen, ohne Werte zu duplizieren, sollte dies funktionieren:

=iferror(ArrayFormula(match(A1:A,A:A,0)),"")
0
pnuts