È possibile in Google Forms assegnare un valore univoco a ciascuna riga che inserisce nel foglio di calcolo e nel timestamp?
È possibile in Google Forms assegnare un valore univoco a ciascuna riga che inserisce nel foglio di calcolo e nel timestamp?
Risposte:
Puoi farlo aggiungendo un trigger di script.
Supponendo che il modulo corrente abbia due colonne Timestamp
e la risposta a una domanda. Quindi al momento hai colonne A e B popolate di dati. Supponiamo che tu voglia che la colonna C abbia il tuo numero di incremento automatico.
Devi prima andare su Tools
> Script Editor
Nella finestra Editor degli script immettere il seguente script:
function onFormSubmit(e) {
var sheet = SpreadsheetApp.getActiveSheet();
var row = SpreadsheetApp.getActiveSheet().getLastRow();
sheet.getRange(row,3).setValue(row);
}
Salvare lo script e quindi andare al Triggers
menu e selezionareCurrent script's triggers
Popolare i menu a discesa come segue:
Clic Save
Quindi salva e chiudi la finestra Script app di Google.
Ora, quando il modulo viene inviato, popolerà il numero di riga nella colonna C insieme ai dati che sono stati inviati tramite il modulo.
Se vuoi cambiare la colonna in cui viene salvato il numero di riga, devi cambiare questa riga dello script:
sheet.getRange(row,3).setValue(row);
e modificare il valore 3 sul numero indice della colonna corrispondente.
Oltre all'eccellente risposta di Barry, se vuoi essere in grado di rimuovere le righe e mantenere comunque un ID univoco puoi avere una cella statica che mantiene un conteggio. È quindi possibile utilizzare questo numero e incrementarlo su ogni nuova voce della tabella.
Quindi la modifica sarebbe quella di mantenere un numero da qualche parte sul foglio di calcolo ('M1' nel codice seguente) e modificare il codice in questo modo:
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);
}
Ancora una volta, cambia la seconda ultima riga per cambiare la posizione del tuo ID.
Basandosi su entrambe le risposte precedenti (di Barry e Danny):
Supponendo che la colonna ID sia la colonna A. Seleziona una cella "ID successivo" e impostala sulla seguente formula (supponendo che sia in "P1"):
=MAX(A:A)+1
Crea lo script usando l'editor di script nel menu "Strumenti" e incolla quanto segue:
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);
}
}
Aggiungi un trigger di script utilizzando il menu "Trigger" nell'editor di script:
Oltre alle risposte di cui sopra - Questa soluzione non richiede una cella di foglio di calcolo aggiuntiva.
È possibile utilizzare i gestori di eventi integrati per l'invio del modulo per ottenere un ID univoco. Poiché il foglio di calcolo è solo la destinazione del modulo, l'eliminazione di una riga non elimina effettivamente la risposta. Con quello in mente...
EDIT: rimossa la necessità di ID e risolto i problemi di formattazione della data.
/**
* 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
funzione può essere notevolmente semplificata semplicemente restituendo la lunghezza delle risposte ad oggi (questo è ciò che la logica di questa funzione sopra descritta sta facendo in modo piuttosto contorto). Fondamentalmente una sola riga nella funzione:return getConnectedForm().getResponses().length;
Questa è una derivata delle altre risposte ma potrebbe essere utile per i futuri utenti.
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);
}
}
La differenza principale è che aggiornerà la colonna 1 nella riga attiva quando quella riga viene modificata, ma solo se non è già stato specificato un valore.
È necessario impostare il trigger come indicato nelle altre risposte su Modifica.
Per "È possibile in Google Form assegnare un valore univoco a ciascuna riga che inserisce nel foglio di calcolo e nel timestamp?" pur consentendo anche l'eliminazione di una riga nel foglio delle risposte del modulo prima dell'aggiunta di un'ulteriore risposta senza duplicare i valori, dovrebbe funzionare:
=iferror(ArrayFormula(match(A1:A,A:A,0)),"")