Convertir des fichiers Excel en CSV UTF-8 avec Google Apps Script : un gain de temps et d’efficacité

Lorsque vous travaillez avec des fichiers CSV pour un traitement automatisé ou une intégration dans d’autres systèmes, deux problématiques majeures peuvent se poser :

  1. Le formatage du fichier CSV : passer à l’encodage UTF-8 pour une compatibilité universelle.
  2. Le traitement en masse : récupérer automatiquement tous les fichiers d’un dossier Google Drive.

Dans cet article, nous allons explorer un script Google Apps Script conçu pour répondre à ces besoins, avec un focus particulier sur :

  • L’encodage UTF-8 des fichiers CSV générés.
  • La gestion automatique de tous les fichiers d’un dossier Drive.
  • Le formatage adapté pour les environnements francophones (virgule comme séparateur décimal et point-virgule pour les colonnes).

Pourquoi choisir l’encodage UTF-8 ?

L’UTF-8 est le standard mondial pour l’encodage des fichiers texte. Il garantit :

  • Une compatibilité optimale avec les applications modernes.
  • La prise en charge des caractères spéciaux, comme les accents (é, è, à) essentiels pour le français.
  • L’absence de conflits lors de l’importation dans des bases de données ou d’autres logiciels.

Fonctionnalités principales du script

Notre script permet de :

  1. Récupérer tous les fichiers Excel d’un dossier Drive et les traiter automatiquement.
  2. Convertir les fichiers Excel en CSV encodés en UTF-8.
  3. Nettoyer et formater les données :
    • Suppression des espaces inutiles.
    • Remplacement du point par une virgule comme séparateur décimal.
  4. Générer des fichiers CSV adaptés aux environnements francophones avec un séparateur de colonnes point-virgule.
  5. Marquer les fichiers Excel traités pour éviter les doublons.

Le code du script

Voici le script complet et détaillé :

function convertirExcelEnCSV() {
  const dossierId = "ID_DU_DOSSIER"; // Remplacez par l'ID de votre dossier Google Drive
  const dossier = DriveApp.getFolderById(dossierId);
  const fichiers = dossier.getFiles();

  Logger.log("Début de la conversion des fichiers Excel en CSV dans le dossier ID : " + dossierId);

  while (fichiers.hasNext()) {
    const fichier = fichiers.next();
    const fichierNom = fichier.getName();

    Logger.log("Traitement du fichier : " + fichierNom);

    // Vérifiez si le fichier a déjà été traité
    if (fichierNom.startsWith("TRAITÉ_")) {
      Logger.log("Fichier déjà traité : " + fichierNom);
      continue; // Passer au fichier suivant
    }

    // Vérifier si le fichier est un Excel
    const mimeType = fichier.getMimeType();
    Logger.log("MIME type du fichier : " + mimeType);

    if (mimeType === MimeType.MICROSOFT_EXCEL || 
        mimeType === "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") {

      try {
        const fichierBlob = fichier.getBlob();
        Logger.log("Blob du fichier récupéré avec succès : " + fichierNom);

        // Convertir le fichier Excel en Google Sheets
        const fichierSheets = convertirEnGoogleSheetAvecAPIv3(fichierBlob, fichierNom);
        Logger.log("Fichier converti en Google Sheets : " + fichierSheets.getName());

        // Lire les données de la première feuille
        const feuille = fichierSheets.getSheets()[0];
        const donnees = feuille.getDataRange().getValues();
        Logger.log("Données brutes lues : " + JSON.stringify(donnees));

        // Nettoyer les données
        const donneesNettoyees = donnees.map(ligne => 
          ligne.map(cellule => {
            if (typeof cellule === "number") {
              // Convertir les nombres au format français (virgule comme séparateur décimal)
              return cellule.toFixed(2).replace(".", ",");
            } else if (typeof cellule === "string") {
              return cellule.trim().replace(/\s+/g, " "); // Supprimer les espaces excessifs
            } else {
              return cellule || ""; // Remplacer null/undefined par une chaîne vide
            }
          })
        );
        Logger.log("Données nettoyées : " + JSON.stringify(donneesNettoyees));

        // Créer un contenu CSV avec point-virgule comme séparateur
        const contenuCSV = donneesNettoyees.map(ligne => ligne.join(";")).join("\n");
        Logger.log("Contenu CSV généré :\n" + contenuCSV);

        const nouveauFichierNom = fichierNom.replace(/\.\w+$/, "") + ".csv";

        // Créer et sauvegarder le fichier CSV
        const nouveauFichier = dossier.createFile(nouveauFichierNom, contenuCSV, MimeType.CSV);
        Logger.log("Fichier CSV créé : " + nouveauFichier.getName() + " (ID : " + nouveauFichier.getId() + ")");

        // Supprimer le fichier temporaire Google Sheets
        DriveApp.getFileById(fichierSheets.getId()).setTrashed(true);
        Logger.log("Fichier temporaire supprimé : " + fichierSheets.getName());

        // Renommer le fichier Excel pour marquer qu'il a été traité
        fichier.setName("TRAITÉ_" + fichierNom);
        Logger.log("Fichier original renommé : " + fichier.getName());

      } catch (e) {
        Logger.log("Erreur lors du traitement du fichier " + fichierNom + " : " + e.message);
      }
    } else {
      Logger.log("Fichier ignoré : " + fichierNom + " (type non supporté)");
    }
  }

  Logger.log("Fin de la conversion des fichiers Excel en CSV.");
}

// Fonction pour convertir un fichier Blob en Google Sheets via l'API Drive v3
function convertirEnGoogleSheetAvecAPIv3(blob, nomFichier) {
  const boundary = "-------314159265358979323846";
  const delimiter = "\r\n--" + boundary + "\r\n";
  const closeDelimiter = "\r\n--" + boundary + "--";

  const metadata = {
    name: nomFichier,
    mimeType: MimeType.GOOGLE_SHEETS
  };

  const multipartRequestBody =
    delimiter +
    "Content-Type: application/json; charset=UTF-8\r\n\r\n" +
    JSON.stringify(metadata) +
    delimiter +
    "Content-Type: " +
    blob.getContentType() +
    "\r\n" +
    "Content-Transfer-Encoding: base64\r\n\r\n" +
    Utilities.base64Encode(blob.getBytes()) +
    closeDelimiter;

  const options = {
    method: "post",
    contentType: "multipart/related; boundary=" + boundary,
    payload: multipartRequestBody,
    headers: {
      Authorization: "Bearer " + ScriptApp.getOAuthToken()
    }
  };

  const response = UrlFetchApp.fetch(
    "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&supportsAllDrives=true",
    options
  );
  const file = JSON.parse(response.getContentText());
  return SpreadsheetApp.openById(file.id);
}

Personnalisation du script

  1. ID du dossier Drive : Remplacez ID_DU_DOSSIER par l’ID du dossier contenant vos fichiers Excel.
  2. Formatage des données : Adaptez le nettoyage ou le formatage en fonction des besoins spécifiques.

Avantages de ce script

  1. Encodage UTF-8 natif : Garantit la compatibilité internationale.
  2. Automatisation totale : Convertit tous les fichiers Excel d’un dossier sans intervention manuelle.
  3. Adaptation au contexte francophone : Utilisation d’une virgule comme séparateur décimal et d’un point-virgule pour les colonnes.

Ce script est une solution puissante pour gérer efficacement vos fichiers Excel et les convertir en CSV formatés pour des systèmes exigeants. L’encodage UTF-8 et l’automatisation de la gestion des fichiers en font un outil essentiel pour les professionnels.

Essayez-le, et n’hésitez pas à partager vos retours ou à demander des ajustements spécifiques ! 😊