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

20

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?

Toby Allen
la source
L'horodatage AFAIK est automatiquement ajouté lorsque vous créez un formulaire. Lorsque vous regardez à l'intérieur des colonnes de la feuille de calcul, la première est généralement l'horodatage (sauf si vous l'avez supprimé pour une raison quelconque et je ne sais pas vraiment ce qui se passe si vous le faites)
Robert Koritnik
Je suppose que quelque chose a changé depuis que cette réponse a été donnée car après avoir créé le déclencheur et ajouté le code au script, rien ne se passe lorsque le formulaire est soumis. Quelqu'un at-il des conseils pour faire fonctionner les solutions ci-dessus sur la nouvelle version de Google Sheeth
user3255228

Réponses:

11

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

Supposons que votre formulaire actuel comporte deux colonnes Timestampet la réponse à une question. Vous disposez donc actuellement des colonnes A et B remplies de données. Supposons que vous vouliez que la colonne C ait votre numéro d'incrémentation automatique.

Vous devez d'abord aller à Tools > Script Editor

Dans la fenêtre de l'éditeur de script, saisissez 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 allez dans le Triggersmenu et sélectionnezCurrent script's triggers

Remplissez les listes déroulantes comme suit:

Déclencheurs de script Google

Cliquez sur Save

Ensuite, enregistrez et fermez la fenêtre Google App Script.

Maintenant, lorsque votre formulaire est soumis, il remplira le numéro de ligne dans la colonne C avec les données qui ont été 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.

codingbadger
la source
Est-il possible d'utiliser ce script mais j'ai besoin d'un numéro unique de sorte que si je supprime ou ajoute une ligne, il ne le gâchera pas par exemple: j'ai l'ID ou la ligne 1, 2, 3, 4, 5, 6 mais je supprime manuellement 5 après l'envoi d'un formulaire, l'ID 6 passera à la ligne 5, de sorte que l'ID suivant sur le formulaire soumis sera à nouveau 6, je devrai le dupliquer. Est-il donc possible d'utiliser l'horodatage et d'en faire un numéro d'auto-incrémentation unique?
Encore mieux, je l'utilise maintenant pour faire une demande get vers une URL que je contrôle avec toutes les données et la mettre directement dans mon application
Toby Allen
7

Suite à l'excellente réponse de Barry, si vous voulez pouvoir supprimer des lignes et conserver un identifiant unique, vous pouvez avoir une cellule statique qui conserve un décompte. Vous pouvez ensuite utiliser ce numéro 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 pour qu'il ressemble à ceci:

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, modifiez l'avant-dernière ligne pour modifier l'emplacement de votre ID.

Danny Parker
la source
J'ai appliqué cela, mais cela ne réussit pas dans le cas de la suppression de la ligne entre les lignes de données. il devrait donc mettre à jour la valeur cachée chaque fois que la suppression de ligne se produit
Le numéro n'a pas besoin d'être mis à jour lors de la suppression si des identifiants uniques suffisent (conformément à la question d'origine). Si vous diminuez la valeur lors de la suppression, vous obtiendrez des ID en double.
Danny Parker du
7

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

En supposant que la colonne ID est la colonne A. Choisissez une cellule "Next ID" 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 dans le menu "Outils" et 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: entrez la description de l'image ici

soi-même
la source
4

Suite aux 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 soumettre le formulaire afin d'obtenir un identifiant unique. Étant donné que la feuille de calcul n'est que la destination du formulaire, la suppression d'une ligne ne supprime pas réellement la réponse. Dans cet esprit...

EDIT: suppression du besoin d'ID et résolution 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);
  }

}
Tom Horwood
la source
Je ne comprends pas. Comment cela s'appelle-t-il lorsque le formulaire est soumis?
CodyBugstein du
@Imray: Je pense que ce doit être un script dans la feuille de calcul. Vous pouvez configurer un déclencheur dans la feuille de calcul pour exécuter une fonction lorsque le formulaire est soumis. J'ajouterai ce fait à cette réponse si cela fonctionne (je dois le vérifier).
Gary
1
La getUniqueIDfonction peut être grandement simplifiée en renvoyant simplement la longueur des réponses à ce jour (c'est ce que fait la logique de cette fonction décrite ci-dessus de manière plutôt compliquée). Fondamentalement, une seule ligne dans la fonction:return getConnectedForm().getResponses().length;
Abid H. Mujtaba
2

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 qu'il mettra à jour la colonne 1 de la ligne active lorsque cette ligne est modifiée, mais uniquement si aucune valeur n'est déjà spécifiée.

Vous devez définir le déclencheur comme mentionné dans les autres réponses lors de la modification.

définir le déclencheur sur modification

nacross
la source
0

Pour "Est-il possible dans Google Form de donner 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 du formulaire avant l'ajout d'une autre réponse sans dupliquer les valeurs, cela devrait fonctionner:

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