Posso aggiungere un campo di incremento automatico a un foglio di calcolo di Google basato su un modulo Google?


20

È possibile in Google Forms assegnare un valore univoco a ciascuna riga che inserisce nel foglio di calcolo e nel timestamp?


Il timestamp AFAIK viene aggiunto automaticamente quando si crea un modulo. Quando guardi all'interno delle colonne del foglio di calcolo, il primo è di solito il timestamp (a meno che tu non lo abbia eliminato per qualche motivo e non so davvero cosa succede se lo fai)
Robert Koritnik,

Immagino che qualcosa sia cambiato da quando è stata data questa risposta perché dopo aver creato il trigger e aggiunto il codice allo script, non succede nulla quando viene inviato il modulo. Qualcuno ha qualche consiglio per far funzionare le soluzioni di cui sopra sulla nuova versione di Google Sheeth
user3255228

Risposte:


11

Puoi farlo aggiungendo un trigger di script.

Supponendo che il modulo corrente abbia due colonne Timestampe 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 Triggersmenu e selezionareCurrent script's triggers

Popolare i menu a discesa come segue:

Trigger di Google Script

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.


È possibile utilizzare questo script ma ho bisogno di un numero univoco in modo che se mai elimini o aggiungo una riga, non lo rovinerò per esempio: ho ID o riga 1, 2, 3, 4, 5, 6 ma elimino manualmente 5 dopo che un ID di invio modulo 6 passerà alla riga 5, quindi l'ID successivo sull'invio del modulo sarà di nuovo 6 Avrò l'aduplicato. Quindi è possibile usare il timestamp e ricavarne un numero unico auto-incrementante?

Ancora meglio, ora lo uso per fare una richiesta a un URL che controllo con tutti i dati e li inserisco direttamente nella mia app
Toby Allen

7

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.


Ho applicato questo, ma questo non ha esito positivo nel caso di eliminare la riga tra le righe di dati. quindi dovrebbe aggiornare il valore nascosto ogni volta che si verifica l'eliminazione della riga

Non è necessario aggiornare il numero al momento dell'eliminazione se sono richiesti solo ID univoci (come da domanda originale). Se diminuisci il valore al momento della cancellazione otterrai ID duplicati.
Danny Parker,

7

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: inserisci qui la descrizione dell'immagine


4

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);
  }

}

Non capisco. Come viene chiamato quando viene inviato il modulo?
CodyBugstein,

@Imray: penso che questo debba essere uno script nel foglio di calcolo. È possibile impostare un trigger nel foglio di calcolo per eseguire una funzione quando viene inviato il modulo. Aggiungerò questo fatto a questa risposta se funziona (devo verificarlo).
Gary S.

1
La getUniqueIDfunzione 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;
Abid H. Mujtaba

2

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.

imposta trigger su su modifica


0

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)),"")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.