web-dev-qa-db-fra.com

Puis-je ajouter un champ auto-incrémenté à une feuille de calcul Google basée sur un formulaire Google?

Est-il possible dans Google Forms de donner une valeur unique à chaque ligne insérée dans la feuille de calcul ainsi que l'horodatage?

20
Toby Allen

Vous pouvez le faire en ajoutant un déclencheur de script.

Supposons que votre formulaire actuel comporte deux colonnes Timestamp et la réponse à une question. Vous avez donc actuellement les colonnes A et B remplies de données. Supposons que vous souhaitiez que la colonne C vous attribue un numéro d’incrémentation automatique.

Vous devez d'abord aller à Tools>Script Editor

Dans la fenêtre de l'éditeur de script, entrez le script suivant:

function onFormSubmit(e) {

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

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


}

Enregistrez le script, puis accédez au menu Triggers et sélectionnez Current script's triggers.

Remplissez les listes déroulantes comme suit:

Google Script Triggers

Cliquez Save

Puis enregistrez et fermez la fenêtre Google App Script.

Désormais, lorsque votre formulaire est soumis, il indique le numéro de ligne de la colonne C ainsi que les données soumises via votre formulaire.

Si vous souhaitez modifier la colonne dans laquelle le numéro de ligne est enregistré, vous devez modifier cette ligne du script:

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

et remplacez la valeur 3 par le numéro d’index de colonne correspondant.

11
codingbadger

En complément de l'excellente réponse de Barry, si vous souhaitez pouvoir supprimer des lignes tout en conservant un identifiant unique, vous pouvez disposer d'une cellule statique qui conserve un nombre. Vous pouvez ensuite utiliser ce nombre et l'incrémenter à chaque nouvelle entrée de la table.

La modification consisterait donc à conserver un numéro quelque part sur votre feuille de calcul ('M1' dans le code ci-dessous) et à modifier le code de la manière suivante:

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

Encore une fois, changez l'avant-dernière ligne pour changer l'emplacement de votre identifiant.

7
Danny Parker

S'appuyant sur les deux réponses précédentes (de Barry et Danny):

En supposant que la colonne ID soit la colonne A. Choisissez une cellule "ID suivant" et définissez-la selon la formule suivante (en supposant qu'elle se trouve dans "P1"):

=MAX(A:A)+1

Créez un script à l'aide de l'éditeur de script sous le menu "Outils", puis collez-le comme suit:

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

Ajoutez un déclencheur de script à l'aide du menu "Déclencheurs" de l'éditeur de script: enter image description here

7
oneself

En plus des réponses ci-dessus - Cette solution ne nécessite pas de cellule de feuille de calcul supplémentaire.

Vous pouvez utiliser les gestionnaires d'événements intégrés pour la soumission du formulaire afin d'obtenir un identifiant unique. Étant donné que la feuille de calcul est uniquement la destination du formulaire, la suppression d'une ligne ne supprime pas la réponse. Dans cet esprit...

EDIT: suppression du besoin d'identifiant et traitement des problèmes de formatage de la date.

/**
* 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

Ceci est un dérivé des autres réponses, mais il pourrait être utile pour les futurs utilisateurs.

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 principale différence est que la colonne 1 de la ligne active sera mise à jour lorsque cette ligne est modifiée, mais uniquement si aucune valeur n'a déjà été spécifiée.

Vous devez définir le déclencheur comme mentionné dans d'autres réponses sur on edit.

set trigger to on edit

2
nacross

For "Est-il possible dans Google Form d'attribuer une valeur unique à chaque ligne insérée dans la feuille de calcul ainsi que l'horodatage?" tout en permettant également la suppression d'une ligne dans la feuille de réponses au formulaire l’ajout d’une autre réponse sans dupliquer les valeurs, cela devrait fonctionner:

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