Ist es in Google Forms möglich, jeder Zeile, die in die Tabelle eingefügt wird, sowie dem Zeitstempel einen eindeutigen Wert zuzuweisen?
Ist es in Google Forms möglich, jeder Zeile, die in die Tabelle eingefügt wird, sowie dem Zeitstempel einen eindeutigen Wert zuzuweisen?
Antworten:
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 > 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 Triggers
Menü und wählen SieCurrent script's triggers
Füllen Sie die Dropdowns wie folgt aus:
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.
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.
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:
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);
}
}
getUniqueID
Funktion 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;
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.
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)),"")