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


20

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


Der AFAIK-Zeitstempel wird automatisch hinzugefügt, wenn Sie ein Formular erstellen. Wenn Sie in die Tabellenspalten schauen, ist der erste normalerweise der Zeitstempel (es sei denn, Sie haben ihn aus irgendeinem Grund gelöscht und ich weiß nicht wirklich, was passiert, wenn Sie das tun)
Robert Koritnik

Ich vermute, dass sich seit dieser Antwort etwas geändert hat, da nach dem Erstellen des Auslösers und dem Hinzufügen des Codes zum Skript beim Senden des Formulars nichts passiert. Hat jemand einen Rat, um die oben genannten Lösungen für die neue Version von Google Sheeth
user3255228 10.03.15

Antworten:


11

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

Angenommen, Ihr aktuelles Formular enthält zwei Spalten Timestampund 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 > gehenTools Script Editor

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, gehen Sie zum TriggersMenü und wählen SieCurrent script's triggers

Füllen Sie die Dropdowns wie folgt aus:

Google Script-Trigger

Klicken 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.


Ist es möglich, dieses Skript zu verwenden, aber ich benötige eine eindeutige Nummer, so dass ich, wenn ich jemals eine Zeile lösche oder hinzufüge, es nicht vermassle? Beispiel: Ich habe ID oder Zeile 1, 2, 3, 4, 5, 6, aber ich lösche manuell 5 Nach dem Absenden eines Formulars wird ID 6 in Zeile 5 verschoben, sodass die nächste ID beim Absenden des Formulars wieder 6 lautet. Ist es also möglich, den Zeitstempel zu verwenden und daraus eine eindeutige, automatisch inkrementierende Zahl zu erstellen?

Noch besser ist, dass ich dies jetzt verwende, um eine Abrufanforderung an eine von mir kontrollierte URL mit allen Daten zu richten und sie direkt in meine App zu stellen
Toby Allen

7

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.


Ich habe dies angewendet, aber dies ist nicht erfolgreich, wenn die Zeile zwischen den Datenzeilen gelöscht wird. Es sollte den verborgenen Wert aktualisieren, wenn eine Zeile

Die Nummer muss beim Löschen nicht aktualisiert werden, wenn nur eindeutige IDs erforderlich sind (gemäß der ursprünglichen Frage). Wenn Sie den Wert beim Löschen verringern, erhalten Sie doppelte IDs.
Danny Parker

7

Aufbauend auf 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: Bildbeschreibung hier eingeben


4

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 das Arbeitsblatt nur das Ziel für das Formular ist, wird die Antwort beim Löschen einer Zeile nicht wirklich gelöscht. In diesem Sinne ...

BEARBEITEN: ID-Notwendigkeit entfernt und Datumsformatierungsprobleme 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);
  }

}

Ich verstehe das nicht. Wie wird dies beim Absenden des Formulars aufgerufen?
CodyBugstein

@Imray: Ich denke, das muss ein Skript in der Tabelle sein. Sie können einen Auslöser in der Tabelle einrichten, um eine Funktion auszuführen, wenn das Formular gesendet wird. Ich werde diese Tatsache zu dieser Antwort hinzufügen, wenn es funktioniert (ich muss es überprüfen).
Gary S.

1
Die getUniqueIDFunktion kann stark vereinfacht werden, indem einfach die Länge der bisherigen Antworten zurückgegeben wird (das ist, was die Logik dieser oben beschriebenen Funktion auf eine ziemlich verworrene Weise tut). Grundsätzlich eine einzige Zeile in der Funktion:return getConnectedForm().getResponses().length;
Abid H. Mujtaba

2

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.

Trigger auf On Edit setzen


0

Für "Ist es in Google Form möglich, jeder Zeile, die in die Tabelle eingefügt wird, sowie dem Zeitstempel einen eindeutigen Wert zuzuweisen?" Dies sollte auch das Löschen einer Zeile im Formularantwortenblatt vor dem Hinzufügen einer weiteren Antwort ohne Duplizieren von Werten ermöglichen:

=iferror(ArrayFormula(match(A1:A,A:A,0)),"")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.