Incrémentation automatique qui reste même en cas de tri

Bonjour,

Mon post fait suite à des questions déjà résolues.
J'ai un fichier avec plusieurs colonnes dont les nom et prenom. J'ajoute régulièrement des lignes à ce fichier qui sont triées régulièrement par ordre alphabétique.
J'aimerai pouvoir incrémenter chaque ligne automatiquement, avec un numéro d'identification qui se conserve même en cas de tri selon une autre colonne.

Quelle possibilité ai-je ?

Bonjour,

Un fichier d'exemple est toujours le bienvenu.

Si vous souhaitez créer une incrémentation statique d'une colonne de votre tableau lors de l'ajout d'une nouvelle ligne, il faut passer par un Script AppScript. Alternativement (le plus simple) vous pouvez aussi "pré-remplir" la colonne en question en prévision des futures lignes.

Effectivement, il aurait été mieux d'ajouter le lien : https://docs.google.com/spreadsheets/d/1q84RQhpKo_njJET-ZMOmYUrRIexBHoj8-Zir6n7rKxk/edit?usp=sharing

As-tu un exemple de script qui pourrait fonctionner ?

Merci ! Mais je ne vois pas la colonne d'identification sur le fichier d'exemple...

C'est important de savoir laquelle vous voulez utiliser, ainsi que le type d'identification (simple index 1-2-3... ou autre ?) afin de pouvoir vous proposer un script.

erreur corrigée sur le fichier

Ok, une proposition assez complexe mais c'est pour permettre des usages plus poussés, par exemple si vous collez d'un coup 10 lignes, ça devrait bien créer 10 ID correspondants.

/**
 * Configuration
 */
const SHEET_NAME = 'Feuil1'; // Adapter si nécessaire
const HEADER_ROW = 1;        // Ligne d'en-tête
const DATA_START = HEADER_ROW + 1; // Première ligne de données (2)
const DATA_LAST_COL = 8;     // Colonnes de données A..H
const ID_COL = 9;            // Colonne I
const ID_PROP_KEY = 'ID_COUNTER'; // Clé de stockage du compteur

const isFilled = v => v !== '' && v !== null;

/**
 * Attribue automatiquement un ID numérique en colonne I lorsqu'une nouvelle ligne est renseignée.
 * - L'ID est persisté via PropertiesService (compteur global), protégé par un lock.
 * - Déclenché à chaque édition (simple trigger onEdit).
 * - Gère les collages multi-lignes.
 */
function onEdit(e) {
  if (!e) return;

  const sheet = e.source.getActiveSheet();
  if (SHEET_NAME && sheet.getName() !== SHEET_NAME) return;

  const editedRange = e.range;

  // Ne traite que les lignes de données
  const startRow = Math.max(editedRange.getRow(), DATA_START);
  const endRow = editedRange.getRow() + editedRange.getNumRows() - 1;
  if (endRow < DATA_START) return;

  // Ne réagit que si l'édition touche les colonnes de données A..H
  const editedStartCol = editedRange.getColumn();
  const editedEndCol = editedStartCol + editedRange.getNumColumns() - 1;
  if (editedStartCol > DATA_LAST_COL || editedEndCol < 1) return;

  const rowCount = endRow - startRow + 1;
  if (rowCount <= 0) return;

  // Lecture A..H et I pour les lignes impactées (batch unique)
  const dataValues = sheet.getRange(startRow, 1, rowCount, DATA_LAST_COL).getValues();
  const idValues   = sheet.getRange(startRow, ID_COL, rowCount, 1).getValues();

  // Lock pour éviter les collisions d'édition concurrentes (utile seulement en usage collaboratif)
  const lock = LockService.getDocumentLock();
  try {
    lock.waitLock(1000); // 1 seconde max
  } catch (err) {
    // Si le lock n'est pas acquis rapidement, on abandonne cette passe
    return;
  }

  try {
    const props = PropertiesService.getDocumentProperties();
    let counter = Number(props.getProperty(ID_PROP_KEY) || 0);

    let wrote = false;
    const outIds = idValues.map(([id], i) => {
      const rowHasData = dataValues[i].some(isFilled);
      const idEmpty = id === '' || id === null;

      if (rowHasData && idEmpty) {
        counter += 1;
        wrote = true;
        return [counter];
      }
      return [id];
    });

    if (wrote) {
      sheet.getRange(startRow, ID_COL, rowCount, 1).setValues(outIds);
      props.setProperty(ID_PROP_KEY, String(counter));
    }
  } finally {
    lock.releaseLock();
  }
}

/**
 * Initialise ou resynchronise le compteur d'ID avec le max trouvé en colonne I.
 * - À exécuter manuellement au besoin (ex. migration/import massif avec IDs existants).
 * - Pas nécessaire à chaque ouverture : onEdit fonctionne sans initialisation préalable.
 */
function initOrSyncIdCounter() {
  const sheet = SpreadsheetApp.getActive().getSheetByName(SHEET_NAME);
  if (!sheet) throw new Error(`Feuille "${SHEET_NAME}" introuvable.`);

  const lastRow = sheet.getLastRow();
  let maxId = 0;

  if (lastRow >= DATA_START) {
    const ids = sheet.getRange(DATA_START, ID_COL, lastRow - DATA_START + 1, 1).getValues();
    maxId = ids.reduce((m, [v]) => {
      const n = Number(v);
      return Number.isFinite(n) && n > m ? n : m;
    }, 0);
  }

  PropertiesService.getDocumentProperties().setProperty(ID_PROP_KEY, String(maxId));
}

/**
 * Ajout d'un bouton dans le ruban pour synchroniser le compteur.
 */
function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('Gestion ID')
    .addItem('Initialiser / resynchroniser le compteur', 'initOrSyncIdCounter')
    .addToUi();
}
Rechercher des sujets similaires à "incrementation automatique qui reste meme cas tri"