Automatiser le pré-traitement des données fab-dis

fabdis pretraitement image
Automatiser le pré-traitement des données FAB-DIS : la méthode intelligente

Automatiser le pré-traitement des données FAB-DIS : la méthode intelligente

Vous ouvrez votre fichier FAB-DIS fraîchement reçu du fournisseur et vous commencez à le « nettoyer » : supprimer des colonnes, corriger des formats, ajouter des calculs… Puis un collègue vous demande une info du fichier d’origine. Problème : vous l’avez écrasé. Ou pire : vous avez introduit une erreur qui corrompt toutes vos données sans vous en apercevoir.

Le pré-traitement automatisé résout ce problème. Au lieu de modifier directement le fichier source, vous créez automatiquement une copie de travail où toutes les transformations sont appliquées de manière contrôlée, traçable et réversible. Le fichier FAB-DIS original reste intact, vos données sont sécurisées, et votre workflow devient industriel.

Cet article vous présente la méthode complète du pré-traitement intelligent : comprendre les blocs FAB-DIS 3.0, créer une zone de sécurité, automatiser les 3 niveaux de traitement (basique, intermédiaire, avancé), et mettre en place un workflow professionnel.

💡 AutoExcel automatise votre workflow FAB-DIS de bout en bout

Nous créons des solutions de pré-traitement sur mesure qui créent automatiquement vos copies de travail, appliquent vos règles métier et préservent toujours vos fichiers source. Demandez une démo personnalisée.

⚠️ Les 5 erreurs fatales du traitement direct

Modifier directement un fichier FAB-DIS source expose à des risques majeurs :

  • 🔥 Perte de données irréversible : une mauvaise manipulation, et vos données d’origine sont perdues à jamais
  • ⚠️ Corruption silencieuse : une formule erronée qui se propage sur 5 000 lignes sans que vous le remarquiez
  • 🔄 Impossibilité de reproduire : vous ne savez plus quelles transformations ont été appliquées
  • 👥 Travail en équipe impossible : chacun modifie sa version, impossible de synchroniser
  • 📊 Absence de traçabilité : en cas d’audit ou de litige, vous ne pouvez pas prouver l’origine des données

Coût moyen d’une corruption de données non détectée : 2 500 à 15 000 €

La philosophie du pré-traitement : la règle d’or de la donnée

🔒 Ne JAMAIS modifier la source

Toute transformation doit s’effectuer sur une copie de travail automatiquement générée et horodatée.

Le pré-traitement des données repose sur un principe fondamental de l’ingénierie des données : la séparation entre données brutes et données transformées. Voici pourquoi cette approche est indispensable :

Les 3 piliers du pré-traitement intelligent

1. Zone de sécurité

Le fichier FAB-DIS original est stocké dans un dossier « Archives » et n’est JAMAIS modifié.

2. Copie de travail

Chaque traitement génère automatiquement une copie horodatée (FAB-DIS_20260125_1430.xlsx)

3. Traçabilité totale

Un fichier log enregistre toutes les transformations appliquées avec date/heure/utilisateur

Architecture du workflow de pré-traitement

Flux de traitement sécurisé

📥 FAB-DIS source Lecture seule
Archivé
📋 Copie auto Horodatée
Modifiable
⚙️ Traitement Nettoyage
Enrichissement
✅ Fichier final Prêt import
Validé

Comprendre la structure FAB-DIS 3.0 : les blocs de données

Le format FAB-DIS 3.0 structure les données en « blocs » thématiques. Comprendre cette architecture est essentiel pour un pré-traitement intelligent : vous ne traiterez pas tous les blocs de la même manière.

Les 5 blocs principaux (obligatoires)

B00 – Cartouche

Métadonnées : émetteur, date, devise, version

Traitement : Lecture uniquement

B01 – Commerce

Cœur du catalogue : références, libellés, tarifs, GTIN

Traitement : Nettoyage intensif

B02 – Logistique

Dimensions, poids, conditionnements

Traitement : Validation formats

B03 – Média

Photos, vidéos, fiches produits, URLs

Traitement : Vérification liens

B04 – Réglementaire

Éco-contribution, réparabilité, conformité

Traitement : Extraction sélective

Les blocs conditionnels (optionnels)

Bloc Contenu Fréquence de présence
C01 – Extension Made In, garanties, aides ~40% des FAB-DIS
C02 – Correspondance Pièces de rechange, consommables ~30% des FAB-DIS
C03 – Variante Tailles, couleurs, matières ~25% des FAB-DIS
C04 – ETIM Caractéristiques techniques normalisées ~60% des FAB-DIS (secteur électrique/BTP)
C05 – Arrêt Produits retirés, notices, SAV ~20% des FAB-DIS
C06 – Substitution Produits de remplacement ~15% des FAB-DIS

💡 Principe du traitement partiel intelligent : Vous n’avez probablement besoin que de 20 à 30% des colonnes du FAB-DIS pour votre usage. Le pré-traitement consiste à identifier, extraire et nettoyer uniquement ces colonnes essentielles, ignorant le reste. Gain de temps : 60 à 70%.

Les 3 niveaux de pré-traitement automatisé

Le pré-traitement se décline en 3 niveaux de sophistication. Choisissez le niveau adapté à votre contexte et vos besoins.

🟢

Niveau 1 : Pré-traitement basique (essentiel)

10 min setup

Objectif : Créer automatiquement une copie de travail et extraire uniquement les colonnes essentielles du bloc B01_Commerce.

Ce qui est fait automatiquement :

  • ✅ Copie du fichier source vers un dossier « Travail » avec nom horodaté
  • ✅ Extraction des 15 colonnes principales de B01 (REFCIALE, LIBELLE80, TARIF, TVA, GTIN, etc.)
  • ✅ Suppression des lignes totalement vides
  • ✅ Création d’une feuille « Données_Travail » propre

Script Office Scripts Niveau 1 :

function main(workbook: ExcelScript.Workbook) {
  // 1. Identifier la feuille B01_Commerce
  let sourceSheet = workbook.getWorksheet("B01_Commerce");
  
  if (!sourceSheet) {
    console.log("❌ Feuille B01_Commerce introuvable");
    return;
  }
  
  // 2. Créer ou nettoyer la feuille de travail
  let workSheet = workbook.getWorksheet("Donnees_Travail");
  if (workSheet) {
    workSheet.delete();
  }
  workSheet = workbook.addWorksheet("Donnees_Travail");
  
  // 3. Définir les colonnes essentielles à extraire
  const essentialColumns = [
    "MARQUE", "REFCIALE", "GTIN", "LIBELLE40", "LIBELLE80", "LIBELLE240",
    "DATETARIF", "TARIF", "QT", "TVA", "UB", "DELAI", 
    "FAM1", "FAM1L", "FAM2", "FAM2L"
  ];
  
  // 4. Récupérer les en-têtes source
  const sourceHeaders = sourceSheet.getRange("1:1").getValues()[0];
  const colMapping: {[key: string]: number} = {};
  
  sourceHeaders.forEach((header, index) => {
    const headerStr = String(header).toUpperCase().trim();
    if (essentialColumns.includes(headerStr)) {
      colMapping[headerStr] = index;
    }
  });
  
  // 5. Créer les en-têtes dans la feuille de travail
  const workHeaders: string[] = [];
  essentialColumns.forEach(col => {
    if (colMapping[col] !== undefined) {
      workHeaders.push(col);
    }
  });
  
  workSheet.getRange(1, 1, 1, workHeaders.length).setValues([workHeaders]);
  
  // 6. Copier uniquement les colonnes essentielles
  const sourceData = sourceSheet.getUsedRange();
  const sourceValues = sourceData.getValues();
  
  const workData: any[][] = [];
  
  for (let i = 1; i < sourceValues.length; i++) {
    const sourceRow = sourceValues[i];
    
    // Vérifier que la ligne n'est pas vide
    const isEmpty = sourceRow.every(cell => !cell || String(cell).trim() === "");
    if (isEmpty) continue;
    
    const workRow: any[] = [];
    essentialColumns.forEach(col => {
      if (colMapping[col] !== undefined) {
        workRow.push(sourceRow[colMapping[col]]);
      }
    });
    
    workData.push(workRow);
  }
  
  // 7. Écrire les données dans la feuille de travail
  if (workData.length > 0) {
    workSheet.getRange(2, 1, workData.length, workHeaders.length)
             .setValues(workData);
  }
  
  console.log("✅ Pré-traitement Niveau 1 terminé !");
  console.log(`📊 ${workData.length} produits extraits`);
  console.log(`📋 ${workHeaders.length} colonnes conservées sur ${sourceHeaders.length}`);
}

Résultat : Une nouvelle feuille « Donnees_Travail » contenant uniquement vos 15 colonnes essentielles, prête pour les traitements suivants.

🟡

Niveau 2 : Pré-traitement intermédiaire (optimisé)

30 min setup

Objectif : En plus du Niveau 1, effectuer les nettoyages basiques automatiques : espaces, majuscules, formats de prix.

Ce qui est ajouté automatiquement :

  • ✅ Suppression des espaces multiples dans tous les libellés
  • ✅ Conversion des libellés en casse titre (Première Lettre Majuscule)
  • ✅ Nettoyage des codes GTIN (suppression espaces, validation format)
  • ✅ Conversion TVA décimale en pourcentage (0.2 → 20%)
  • ✅ Formatage des prix (2 décimales, séparateur correct)
  • ✅ Ajout d’une colonne « TVA_POURCENT » calculée

Extension du script Niveau 1 :

// Après l'extraction des données (ligne workData.push)
// Ajoutez ces transformations :

// Fonction de nettoyage de texte
function cleanText(text: string): string {
  if (!text) return "";
  return String(text)
    .replace(/\s+/g, ' ')  // Espaces multiples → 1 espace
    .trim()
    .toLowerCase()
    .split(' ')
    .map(word => word.charAt(0).toUpperCase() + word.slice(1))
    .join(' ');
}

// Fonction de validation GTIN
function cleanGTIN(gtin: string): string {
  const cleaned = String(gtin).replace(/\s/g, '').trim();
  if (/^\d{8}$|^\d{12}$|^\d{13}$|^\d{14}$/.test(cleaned)) {
    return cleaned;
  }
  return ""; // GTIN invalide → vide
}

// Dans la boucle de copie, transformez les données :
const workRow: any[] = [];
essentialColumns.forEach((col, idx) => {
  if (colMapping[col] !== undefined) {
    let value = sourceRow[colMapping[col]];
    
    // Nettoyage selon le type de colonne
    if (col.includes("LIBELLE")) {
      value = cleanText(value);
    } else if (col === "GTIN") {
      value = cleanGTIN(value);
    } else if (col === "TARIF") {
      value = Number(value).toFixed(2);
    } else if (col === "TVA") {
      // Garder le format décimal pour la colonne d'origine
      value = Number(value);
    }
    
    workRow.push(value);
  }
});

// Ajouter une colonne TVA en pourcentage
if (colMapping["TVA"] !== undefined) {
  const tvaPourcent = Number(sourceRow[colMapping["TVA"]]) * 100;
  workRow.push(tvaPourcent);
}

workData.push(workRow);

// N'oubliez pas d'ajouter "TVA_POURCENT" dans les en-têtes :
const workHeaders: string[] = [];
essentialColumns.forEach(col => {
  if (colMapping[col] !== undefined) {
    workHeaders.push(col);
  }
});
workHeaders.push("TVA_POURCENT"); // Colonne calculée

Résultat : Vos données sont extraites ET nettoyées automatiquement, prêtes pour l’import ou l’enrichissement.

🔵

Niveau 3 : Pré-traitement avancé (industriel)

1-2h setup

Objectif : Traitement multi-blocs avec enrichissement, validation croisée et rapport de qualité.

Ce qui est ajouté automatiquement :

  • ✅ Fusion des données de B01_Commerce + B02_Logistique + B04_Réglementaire
  • ✅ Validation croisée (ex: GTIN présent dans B01 doit avoir des médias dans B03)
  • ✅ Enrichissement automatique (calcul volume depuis dimensions, poids volumétrique, etc.)
  • ✅ Détection et signalement des incohérences
  • ✅ Génération d’un rapport de qualité détaillé
  • ✅ Export multi-formats (Excel propre + CSV pour import ERP)

Cas d’usage : Catalogues complexes avec médias, conformité réglementaire stricte, imports dans plusieurs systèmes (ERP + E-commerce + PIM).

📊 Comparatif des 3 niveaux :

Critère Niveau 1 Niveau 2 Niveau 3
Temps de traitement 5-10 sec 15-30 sec 1-3 min
Colonnes traitées 15 15-20 30-50
Blocs FAB-DIS utilisés B01 uniquement B01 + B02 Tous blocs
Gain de temps vs manuel 70% 85% 95%

Workflow complet de pré-traitement automatisé

Voici comment intégrer le pré-traitement dans votre processus quotidien de gestion des catalogues fournisseurs :

1

Réception et archivage automatique

Configurez une règle Outlook ou un flux Power Automate qui détecte l’arrivée d’un FAB-DIS par email et le sauvegarde automatiquement dans un dossier OneDrive « Archives/FAB-DIS/[DATE] » en lecture seule.

2

Création automatique de la copie de travail

Un script Office Scripts ou un flux Power Automate crée une copie du fichier dans « Travail/FAB-DIS » avec un nom horodaté : FABDIS_MARQUE_20260125_1430.xlsx

3

Exécution du pré-traitement

Le script de pré-traitement (Niveau 1, 2 ou 3 selon vos besoins) s’exécute automatiquement sur la copie de travail : extraction, nettoyage, validation.

4

Génération du rapport de qualité

Un rapport automatique vous indique : nombre de produits traités, anomalies détectées, score de qualité, colonnes manquantes.

5

Notification et validation

Vous recevez un email avec le rapport. Si score > 90% : validation automatique. Si score < 90% : vous intervenez uniquement sur les anomalies signalées.

6

Suite du traitement (enrichissement, import)

Le fichier pré-traité est prêt pour les étapes suivantes : calcul de tarifs personnalisés, import dans l’ERP, génération de catalogue.

Exemple de structure de dossiers recommandée

📁 OneDrive/FAB-DIS/
│
├── 📁 Archives/               ← LECTURE SEULE, fichiers originaux
│   ├── 📁 2026-01/
│   │   ├── CAME_FABDIS_20260103.xlsx
│   │   ├── CAME_FABDIS_20260110.xlsx
│   │   └── CAME_FABDIS_20260125.xlsx
│   └── 📁 2025-12/
│
├── 📁 Travail/                ← Copies de travail modifiables
│   ├── CAME_FABDIS_20260125_1430_WORK.xlsx
│   └── CAME_FABDIS_20260125_0900_WORK.xlsx
│
├── 📁 Traites/                ← Fichiers finaux validés
│   ├── CAME_Catalogue_2026-01_FINAL.xlsx
│   └── CAME_Import_ERP_2026-01.csv
│
└── 📁 Logs/                   ← Rapports de traitement
    ├── Log_20260125_1430.txt
    └── Rapport_Qualite_20260125.xlsx

Les colonnes critiques du bloc B01_Commerce à pré-traiter

Le bloc B01_Commerce contient 47 colonnes. Toutes ne nécessitent pas le même niveau de traitement. Voici la classification par priorité :

Colonnes critiques (traitement obligatoire)

Colonne Usage Pré-traitement nécessaire
REFCIALE Code article unique ✓ Suppression espaces, validation unicité
LIBELLE80 Description principale ✓ Nettoyage espaces, casse titre, longueur
TARIF Prix d’achat HT ✓ Format décimal, validation > 0
TVA Taux de TVA ✓ Conversion décimal → %, validation valeurs légales
UB Unité de base ✓ Mapping vers codes standards (UN→PCS, EA→PCS)
GTIN Code-barres EAN ✓ Validation format 8/12/13/14 chiffres, checksum
LIBELLE240 Description longue ✓ Nettoyage espaces, vérification longueur max

Colonnes importantes (traitement recommandé)

Colonne Usage Pré-traitement recommandé
MARQUE Marque commerciale Standardisation casse, suppression espaces
FAM1, FAM2, FAM3 Catégories produit Nettoyage, mapping vers codes internes
QT Quantité disponible Validation numérique, détection valeurs négatives
DELAI Délai de livraison Validation numérique, conversion jours
DATETARIF Date du tarif Validation format date, conversion ISO

Colonnes secondaires (traitement optionnel)

Les colonnes comme MKT1-5, GAMME, FONCTION, REFINFOR peuvent être conservées telles quelles ou ignorées selon vos besoins. Le principe du traitement partiel intelligent : ne traitez que ce qui est nécessaire à votre usage.

💡 Règle des 80/20 : Dans 80% des cas, vous n’utilisez que 20% des colonnes d’un FAB-DIS. Identifiez vos 10-15 colonnes essentielles et concentrez votre pré-traitement sur celles-ci. Ignorez le reste.

Script complet Niveau 2 : pré-traitement intelligent

Voici le script Office Scripts complet qui combine extraction + nettoyage automatique sur les colonnes critiques :

function main(workbook: ExcelScript.Workbook) {
  // 1. Identifier la feuille B01_Commerce
  let sourceSheet = workbook.getWorksheet("B01_Commerce");
  
  if (!sourceSheet) {
    console.log("❌ Feuille B01_Commerce introuvable");
    return;
  }
  
  // Vérifier si la feuille a des données
  const usedRange = sourceSheet.getUsedRange();
  if (!usedRange) {
    console.log("❌ La feuille B01_Commerce est vide");
    return;
  }
  
  // 2. Créer ou nettoyer la feuille de travail
  let workSheet = workbook.getWorksheet("Donnees_Travail");
  if (workSheet) {
    workSheet.delete();
  }
  workSheet = workbook.addWorksheet("Donnees_Travail");
  
  // 3. Définir les colonnes essentielles à extraire
  const essentialColumns: string[] = [
    "MARQUE", "REFCIALE", "GTIN", "LIBELLE40", "LIBELLE80", "LIBELLE240",
    "DATETARIF", "TARIF", "QT", "TVA", "UB", "DELAI", 
    "FAM1", "FAM1L", "FAM2", "FAM2L"
  ];
  
  // 4. Trouver dynamiquement la ligne des en-têtes
  const sourceValues = sourceSheet.getUsedRange().getValues();
  let headerRowIndex = -1;
  let sourceHeaders: (string | number)[] = [];
  
  for (let i = 0; i < Math.min(20, sourceValues.length); i++) {
    const row = sourceValues[i];
    const normalizedRow = row.map(cell => String(cell).toUpperCase().trim());
    
    // Vérifier si cette ligne contient au moins 3 des en-têtes essentiels
    let matchCount = 0;
    for (const col of essentialColumns) {
      if (normalizedRow.includes(col)) {
        matchCount++;
      }
    }
    
    if (matchCount >= 3) {
      headerRowIndex = i;
      sourceHeaders = row;
      console.log(`✅ Ligne d'en-tête trouvée à la ligne ${i + 1} avec ${matchCount} colonnes correspondantes`);
      break;
    }
  }
  
  if (headerRowIndex === -1) {
    console.log("❌ Impossible de trouver la ligne d'en-tête");
    return;
  }
  
  // 5. Mapper les colonnes
  const colMapping: {[key: string]: number} = {};
  
  sourceHeaders.forEach((header: string | number, index: number) => {
    const headerStr = String(header).toUpperCase().trim();
    if (essentialColumns.includes(headerStr)) {
      colMapping[headerStr] = index;
    }
  });
  
  // 6. Créer les en-têtes dans la feuille de travail (avec colonne TVA_POURCENT)
  const workHeaders: string[] = [];
  essentialColumns.forEach(col => {
    if (colMapping[col] !== undefined) {
      workHeaders.push(col);
    }
  });
  
  // Ajouter la colonne calculée TVA_POURCENT
  workHeaders.push("TVA_POURCENT");
  
  if (workHeaders.length === 0) {
    console.log("❌ Aucune colonne essentielle trouvée");
    return;
  }
  
  // Écrire les en-têtes
  const headerRange = workSheet.getRangeByIndexes(0, 0, 1, workHeaders.length);
  headerRange.setValues([workHeaders]);
  
  // 7. Fonctions de transformation
  
  // Fonction de nettoyage de texte
  function cleanText(text: string): string {
    if (!text) return "";
    return String(text)
      .replace(/\s+/g, ' ')  // Espaces multiples → 1 espace
      .trim()
      .toLowerCase()
      .split(' ')
      .map(word => word.charAt(0).toUpperCase() + word.slice(1))
      .join(' ');
  }

  // Fonction de validation GTIN
  function cleanGTIN(gtin: string): string {
    const cleaned = String(gtin).replace(/\s/g, '').trim();
    if (/^\d{8}$|^\d{12}$|^\d{13}$|^\d{14}$/.test(cleaned)) {
      return cleaned;
    }
    return ""; // GTIN invalide → vide
  }
  
  // 8. Extraire et transformer les données
  const workData: (string | number)[][] = [];
  
  for (let i = headerRowIndex + 1; i < sourceValues.length; i++) {
    const sourceRow = sourceValues[i];
    
    // Vérifier si la ligne est vide
    const isEmpty = sourceRow.every((cell: string | number) => 
      cell === null || cell === undefined || String(cell).trim() === ""
    );
    if (isEmpty) continue;
    
    const workRow: (string | number)[] = [];
    let hasData = false;
    
    // Traiter chaque colonne essentielle
    essentialColumns.forEach(col => {
      if (colMapping[col] !== undefined) {
        let value: string | number = sourceRow[colMapping[col]] as string | number;
        
        // Nettoyage selon le type de colonne
        if (col.includes("LIBELLE")) {
          value = cleanText(value.toString());
        } else if (col === "GTIN") {
          value = cleanGTIN(value.toString());
        } else if (col === "TARIF") {
          const numValue = Number(value);
          value = !isNaN(numValue) ? parseFloat(numValue.toFixed(2)) : 0;
        } else if (col === "TVA") {
          // Garder le format décimal pour la colonne d'origine
          const numValue = Number(value);
          value = !isNaN(numValue) ? numValue : 0;
        }
        
        workRow.push(value !== null && value !== undefined ? value : "");
        
        // Vérifier si cette cellule contient des données
        if (value !== null && value !== undefined && String(value).trim() !== "") {
          hasData = true;
        }
      } else {
        workRow.push("");
      }
    });
    
    // Ajouter la colonne TVA en pourcentage (calculée)
    if (colMapping["TVA"] !== undefined) {
      const tvaValue = sourceRow[colMapping["TVA"]];
      const tvaNum = Number(tvaValue);
      const tvaPourcent = !isNaN(tvaNum) ? tvaNum * 100 : 0;
      workRow.push(tvaPourcent);
    } else {
      workRow.push(0); // Valeur par défaut si TVA non trouvée
    }
    
    if (hasData) {
      workData.push(workRow);
    }
  }
  
  // 9. Écrire les données dans la feuille de travail
  if (workData.length > 0) {
    console.log(`📊 Préparation de l'écriture de ${workData.length} lignes avec ${workHeaders.length} colonnes`);
    
    // Vérifier que toutes les lignes ont le bon nombre de colonnes
    for (let i = 0; i < workData.length; i++) {
      if (workData[i].length !== workHeaders.length) {
        console.log(`⚠️ Ajustement de la ligne ${i + 2} : ${workData[i].length} → ${workHeaders.length} colonnes`);
        // Ajuster la ligne si nécessaire
        while (workData[i].length < workHeaders.length) {
          workData[i].push("");
        }
        while (workData[i].length > workHeaders.length) {
          workData[i].pop();
        }
      }
    }
    
    // Écrire les données
    const dataRange = workSheet.getRangeByIndexes(1, 0, workData.length, workHeaders.length);
    dataRange.setValues(workData);
    
    // Ajuster la largeur des colonnes pour une meilleure lisibilité
    workSheet.getUsedRange().getFormat().autofitColumns();
    
    console.log("✅ Données écrites avec succès");
  } else {
    console.log("ℹ️ Aucune donnée à extraire après les en-têtes");
  }
  
  console.log("✅ Pré-traitement Niveau 1 terminé !");
  console.log(`📋 ${workHeaders.length} colonnes configurées (dont TVA_POURCENT calculée)`);
  console.log(`📍 Données extraites à partir de la ligne ${headerRowIndex + 2}`);
  
  // Afficher un aperçu des données transformées
  if (workData.length > 0) {
    console.log("👁️ Aperçu de la première ligne transformée :");
    
    // Afficher quelques colonnes clés
    const previewColumns = ["REFCIALE", "GTIN", "LIBELLE40", "TARIF", "TVA", "TVA_POURCENT"];
    const previewData: string[] = [];
    
    previewColumns.forEach(col => {
      const headerIndex = workHeaders.indexOf(col);
      if (headerIndex !== -1 && workData[0][headerIndex] !== undefined) {
        let value = workData[0][headerIndex];
        if (col === "TVA_POURCENT") {
          value = `${value}%`;
        } else if (col === "TARIF") {
          value = `${value} €`;
        }
        previewData.push(`${col}: ${value}`);
      }
    });
    
    console.log(previewData.join(" | "));
  }
}

✅ Avantages de ce script :

  • ⏱️ Traite 5 000 produits en 15-20 secondes
  • 🔒 Préserve le fichier source (travail sur feuille séparée)
  • 🎯 Extrait uniquement les 16 colonnes essentielles
  • ✨ Nettoie automatiquement libellés, GTIN, TVA
  • 📊 Rapport détaillé dans la console

Traitement partiel intelligent : ne touchez que le nécessaire

Le concept de « traitement partiel intelligent » est au cœur d’une automatisation efficace des FAB-DIS. Plutôt que de traiter systématiquement toutes les colonnes, vous identifiez celles qui nécessitent réellement une intervention.

Matrice de décision : faut-il traiter cette colonne ?

Question Si OUI Si NON
Cette colonne est-elle utilisée dans mon système ? → Continuer l’analyse Ignorer
Les données sont-elles souvent mal formatées ? Nettoyer → Copier telles quelles
Des calculs ou transformations sont-ils nécessaires ? Enrichir → Copier telles quelles
La colonne doit-elle être validée (format, cohérence) ? Valider → Copier telles quelles

Exemple concret de traitement partiel

Sur un fichier FAB-DIS de 47 colonnes, voici une répartition typique :

10 colonnes → Traitement actif

REFCIALE, LIBELLE80, TARIF, TVA, GTIN, UB, FAM1, FAM2, QT, DELAI

6 colonnes → Copie simple

MARQUE, DATETARIF, LIBELLE240, FAM1L, FAM2L, TARIFD

31 colonnes → Ignorées

MKT1-5, GAMME, FONCTION, MUL, QMC, QMVT, UC, etc. (non utilisées)

Résultat : Au lieu de traiter 47 colonnes × 5 000 lignes = 235 000 cellules, vous traitez activement 10 colonnes × 5 000 = 50 000 cellules. Gain de temps : 78%.

Retour d’expérience (PME distribution matériel électrique, 25 personnes) :

« Avant l’automatisation du pré-traitement, nous passions 2 heures à préparer chaque FAB-DIS reçu (4 par semaine) : ouvrir le fichier, supprimer les colonnes inutiles, nettoyer les libellés, corriger les formats de prix, vérifier les GTIN… 8 heures par semaine de travail répétitif et fastidieux.

Avec le script de pré-traitement Niveau 2 d’AutoExcel, le process est : déposer le FAB-DIS dans OneDrive → 30 secondes plus tard, fichier prêt à l’emploi dans ‘Donnees_Travail’. Plus aucune manipulation manuelle. Le fichier source reste intact dans ‘Archives’ au cas où.

Gain mesuré : 7h30 par semaine, soit 390 heures par an. Notre responsable catalogue peut maintenant se concentrer sur l’analyse tarifaire et la stratégie commerciale au lieu de faire du copier-coller. »

FAQ : Questions fréquentes sur le pré-traitement FAB-DIS

Pourquoi ne pas directement modifier le fichier FAB-DIS source ?

Pour trois raisons critiques : (1) Traçabilité – vous devez pouvoir prouver que vos données viennent bien du fournisseur tel quel, sans modification, (2) Réversibilité – si une erreur de traitement se produit, vous pouvez repartir de zéro depuis la source, (3) Audit – en cas de litige commercial ou de contrôle fiscal, vous devez présenter le fichier original du fournisseur.

Quelle est la différence entre pré-traitement et nettoyage ?

Le pré-traitement est la phase préparatoire qui inclut : extraction des colonnes utiles, création de la copie de travail, suppression des lignes vides, et mise en format exploitable. Le nettoyage est une des opérations du pré-traitement, qui consiste à corriger les formats (espaces, majuscules, caractères spéciaux). Le pré-traitement est plus large et englobe le nettoyage.

Combien de temps conserver les fichiers FAB-DIS source ?

Minimum 3 ans, idéalement 5 ans. C’est la durée légale de conservation des documents commerciaux en France. Stockez-les dans un dossier « Archives » en lecture seule. Avec OneDrive/SharePoint, le coût de stockage est négligeable (100 Go = environ 500 fichiers FAB-DIS). En cas de litige avec un fournisseur ou un client, ces archives sont votre preuve.

Peut-on automatiser le pré-traitement pour plusieurs fournisseurs différents ?

Oui, absolument. Deux approches : (1) Script générique – un seul script qui détecte automatiquement la structure du FAB-DIS (noms de colonnes, blocs présents) et s’adapte, ou (2) Scripts spécialisés – un script par fournisseur si leurs structures sont très différentes. La première approche est plus maintenable, la seconde plus performante. AutoExcel peut créer les deux types selon vos besoins.

Le pré-traitement peut-il fonctionner avec des fichiers CSV au lieu d’Excel ?

Oui. Office Scripts fonctionne avec des fichiers CSV ouverts dans Excel Online. Le workflow recommandé : (1) Convertir automatiquement le CSV en Excel (.xlsx) lors de l’upload sur OneDrive, (2) Exécuter le script de pré-traitement, (3) Ré-exporter en CSV si nécessaire pour l’import ERP. Power Automate peut orchestrer tout cela automatiquement.

Conclusion : du chaos à la maîtrise par le pré-traitement

Les fichiers FAB-DIS sont par nature complexes, denses et hétérogènes. Tenter de les exploiter directement sans pré-traitement, c’est s’exposer à des heures de travail manuel répétitif, des erreurs coûteuses et une perte de traçabilité dangereuse.

Le pré-traitement automatisé transforme radicalement cette réalité :

  • 🔒 Sécurité totale : vos fichiers source restent intacts, en lecture seule, archivés
  • ⏱️ Gain de temps massif : de 2 heures à 30 secondes par fichier
  • 🎯 Traitement intelligent : ne travaillez que sur les 20% de colonnes réellement utiles
  • 📊 Qualité garantie : nettoyage automatique, validation, détection d’anomalies
  • 🔄 Workflow industriel : reproductible, traçable, auditable

Les 3 niveaux de pré-traitement (basique, intermédiaire, avancé) vous permettent de choisir le niveau d’automatisation adapté à votre maturité et vos besoins. Commencez par le Niveau 1 (extraction simple), puis montez progressivement en sophistication.

📊 ROI du pré-traitement automatisé : Pour une PME recevant 4 FAB-DIS par semaine, le temps de développement initial (20-40 heures) est amorti en 3 à 6 semaines. Sur une année, c’est 300 à 400 heures économisées, soit l’équivalent de 2 mois de travail d’une personne.

AutoExcel crée votre workflow de pré-traitement sur mesure

Nous analysons vos fichiers FAB-DIS, identifions vos colonnes critiques et créons un workflow automatisé complet :

  • ✅ Archivage automatique des fichiers source (lecture seule)
  • ✅ Création automatique des copies de travail horodatées
  • ✅ Scripts de pré-traitement adaptés à vos besoins (Niveau 1, 2 ou 3)
  • ✅ Rapports de qualité automatiques avec alertes
  • ✅ Intégration Power Automate pour workflow 100% automatique
  • ✅ Formation de vos équipes et documentation complète

Solution clé en main, opérationnelle en 2 semaines.

Demander une analyse gratuite de vos FAB-DIS

Pour aller plus loin :
FAB-DIS et automatisation : le guide ultime pour les TPE/PME
Nettoyer et standardiser les libellés produits FAB-DIS automatiquement
Vérifier l’intégrité d’un fichier FAB-DIS : doublons, GTIN manquants, incohérences

Retour en haut