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?
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?
Réponses:
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 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 Triggers
menu et sélectionnezCurrent script's triggers
Remplissez les listes déroulantes comme suit:
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.
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.
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:
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);
}
}
getUniqueID
fonction 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;
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.
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)),"")