Les problèmes avec Autonumber dans Airtable
L’idée de ce champ était à l’origine de pouvoir numéroter automatiquement des lignes dans Airtable.
Cependant, si vous l’avez déjà utilisé, vous avez dû constater que ce champ n’est pas flexible.
En effet, une fois qu’on a créé une ligne, il est impossible de « supprimer » le numéro qui lui avait été assigné.
Par exemple :
- vous créez une première ligne : Airtable lui donne le nombre 1
- vous créez une seconde ligne : Airtable lui donne le nombre 2
- vous supprimer cette dernière ligne
- vous recréez plus tard une autre ligne : Airtable lui donne le nombre 3
C’est particulièrement problématique si vous souhaitez par exemple gérer des factures dans Airtable. La moindre mauvaise manipulation (création d’une ligne sans faire exprès) peut ruiner votre numérotation.
Comment avoir une vraie numérotation séquentielle dans Airtable ?
On va devoir se passer du champ Autonumber et créer une petite automatisation.
Concrètement :
- On détecte quand une nouvelle ligne est créée
- On utilise un script pour récupérer le dernier numéro présent dans la table
- On met à jour la ligne de l’étape 1 et on lui assigne comme numéro le dernier trouvé dans la table + 1.
Par exemple :
- On crée une ligne : numéro 1
- On crée une deuxième ligne : numéro 2
- On supprime cette ligne
- On crée une nouvelle ligne : numéro 2
C’est bien le comportement qu’on souhaite mettre en place.
Mise en place de l’automatisation
- Ajoutez un champ de type « Number » dans votre table
- Rendez-vous dans l’onglet « Automations » (en haut à droite)
- Créez une nouvelle automatisation
- Comme « Trigger » (déclencheur), choisissez « When a record is Created »
- Testez ce déclencheur (il faut minimum une ligne dans la base !)
- Ajoutez une action de type « Run a Script »
- Définissez les variables d’input suivantes :
- « RECORD_ID » qui correspond au record ID qui a déclenché l’automatisation
- TABLE_NAME qui correspond au nom de la table dans laquelle se trouvent les éléments à numéroter
- INCREMENTED_FIELD_NAME qui correspond au champ de type « Number » qui stocke la numérotation.
- Collez le script dispo en dessous
- Testez cette étape
- Activez l’automatisation
- Créez des ligne et supprimez les, vous verrez que la numérotation fonctionne
Script de numérotation sans trou
/*********************************/ /* A better Autonumber */ /*********************************/ /* Author : Florian VERDONCK */ /* Website : airtablefacile.fr */ /* Version : 1.0 */ /*********************************/ let config = input.config(); // Script configuration const TABLE_NAME = config.TABLE_NAME; const INCREMENTED_FIELD_NAME = config.INCREMENTED_FIELD_NAME; // Query all records, sorted by number descending (biggest numbers first) let table = base.getTable(TABLE_NAME); let tableQuery = await table.selectRecordsAsync({ "sorts" : [ { field: INCREMENTED_FIELD_NAME, direction: "desc" } ] }); // Define the default value to zero (in case the next condition is false) let latestNumber = 0; // Get the first one (so the biggest number) if (tableQuery.records) { latestNumber = tableQuery.records[0].getCellValue(INCREMENTED_FIELD_NAME); } // Updates the created records and define it's number to (latestNumber + 1) let numberToAssign = latestNumber+1; await table.updateRecordAsync( config.RECORD_ID, { [INCREMENTED_FIELD_NAME]: numberToAssign } ) output.set("assignedNumber", numberToAssign)
Conclusion
Une petite astuce rapide et facile à mettre en place qui pourra vous dépanner si vous souhaitez numéroter vos ligne efficacement (sans créer des trous dans la numérotation).
Attention cependant, si vous supprimez des lignes intermédiaires, les numéros des lignes précédentes ne changeront pas. (ce qui est logique dans le cas d’une facture par exemple)
Si vous avez d’autres besoins en termes de numérotation, n’hésitez pas à m’envoyer un mail à florian [at] airtablefacile.fr
Un bug, une remarque, une question ?
N’hésitez pas à m’envoyer un email à florian [at] airtablefacile.fr
C’est super ! Comment changer le numéro à chaque nouvelle année pour revenir à la facture ou devis N°1 ?
Bonjour
J’ai tenté ce script mais l’erreur suivante apparait
TypeError: Invalid arguments passed to table.selectQueryResult(options):
• options.sorts[0].field →
options.sorts[0].field should be a string, not a number (5)
or options.sorts[0].field should be a Field, not a number (5)
at main on line 18
La ligne 18 est : let tableQuery = await table.selectRecordsAsync({ …
Avez-vous une solution
avez vous une solution
Bonjour,
Je soupçonne que votre nom de champ soit « 5 », ce qui pose problème au script.
Essayez d’utiliser plutôt le fieldId à la place du fieldName (nom du champ)
Ce fieldId peut être trouvé dans le « Field Manager »
https://support.airtable.com/docs/field-manager-and-field-dependencies
Florian