La gestion manuelle des données entre Microsoft Excel et Google Sheets peut rapidement devenir une tâche chronophage et source d'erreurs.
Dans cet article, nous vous guidons à travers les meilleures solutions pour automatiser l'importation de vos fichiers Excel directement dans votre espace Google.
Voici une explication détaillée et structurée, conçue spécifiquement pour s'intégrer dans votre article. Elle est rédigée de manière claire et didactique pour que vos lecteurs, même débutants en code, puissent comprendre la logique derrière l'automatisation.
Comment fonctionne ce script d'automatisation ? Plutôt que de vous fournir un code complexe et illisible, nous avons conçu ce script de manière modulaire. Il se divise en plusieurs étapes logiques, de la création d'un menu dans votre interface jusqu'au transfert intelligent de vos données. Voici le décryptage complet de son fonctionnement.
1. Un panneau de configuration centralisé (Variables Globales)
C'est la grande force de cette version optimisée. Au tout début du script, vous trouverez un objet nommé CONFIG. Considérez-le comme la télécommande de votre automatisation.
Au lieu de devoir fouiller dans des dizaines de lignes de code pour modifier un paramètre, tout se gère à cet endroit :
L'ID du dossier de destination : Pour indiquer à Google Drive où sauvegarder le fichier Excel importé.
Le mapping des feuilles : C'est ici que vous dictez au script : "Prends les données de l'onglet 'EXP' du fichier Excel, et colle-les dans l'onglet 'ETAT LIVRAISON' de mon Google Sheets".
Si votre fichier Excel évolue demain et que vous devez ajouter un nouvel onglet à copier, il suffira d'ajouter une simple ligne dans ce bloc de configuration.
2. La création d'un menu sur-mesure
La fonction onOpen() s'exécute automatiquement à chaque fois que vous ouvrez votre fichier Google Sheets. Son rôle est d'améliorer votre interface utilisateur en ajoutant un menu personnalisé (nommé "MENU" par défaut) dans la barre supérieure.
Grâce à lui, vous n'avez pas besoin d'ouvrir l'éditeur de code pour lancer l'importation. Un simple clic sur "UPLOAD FICHIER" déclenche la fonction showDialog(), qui ouvre une fenêtre pop-up vous permettant de sélectionner votre fichier Excel depuis votre ordinateur.
3. L'importation et la conversion à la volée
Une fois votre fichier sélectionné, deux fonctions entrent en jeu pour le traiter :
La réception du fichier : Le fichier uploadé depuis l'interface HTML est encodé (en Base64) pour voyager en toute sécurité. Le script le décode, reconstitue le fichier et le sauvegarde dans le dossier Google Drive défini dans votre configuration.
La conversion via l'API Drive : C'est ici que la magie opère. La fonction ConvertExcelGsheet() prend le fichier Excel fraîchement importé et demande à Google Drive de le convertir instantanément au format natif Google Sheets. Attention : pour que cette étape fonctionne, il est indispensable d'activer le service avancé "Drive API" dans les paramètres de votre projet Apps Script.
4. Le transfert intelligent et sécurisé des données
C'est la dernière étape, gérée par la fonction importDataFromSpreadsheet(). Contrairement aux codes souvent générés par les "enregistreurs de macros" (qui miment les clics de souris de l'utilisateur avec des commandes lentes comme .activate()), ce script utilise une approche mathématique et invisible.
Voici comment le script procède pour chaque onglet défini dans votre configuration :
Il vérifie que les feuilles source et destination existent bien pour éviter de faire planter le processus.
Il identifie précisément la zone où se trouvent vos données actuelles et les efface proprement, en prenant soin de conserver la ligne d'en-tête et vos éventuelles mises en forme.
Il capture le bloc de données complet du nouveau fichier et le colle d'un seul bloc dans votre document de travail.
Cette méthode est non seulement beaucoup plus rapide, mais elle garantit également que votre interface ne "clignote" pas pendant la mise à jour de vos rapports. Vous obtenez un fichier propre, à jour et prêt à être analysé !
5. Conclusion : Dites adieu aux tâches répétitives !
L'importation manuelle de données d'Excel vers Google Sheets appartient désormais au passé. Grâce à ce script personnalisé, vous disposez d'une solution robuste, rapide et entièrement automatisée pour synchroniser vos tableaux de bord et centraliser vos informations.
Bien que l'utilisation de Google Apps Script puisse impressionner au premier abord, l'approche modulaire que nous avons adoptée (via le panneau de configuration CONFIG) rend ce code accessible, même si vous n'êtes pas un développeur chevronné. Vous n'avez plus qu'à copier-coller ce script, ajuster vos propres paramètres (ID de dossier, nom des onglets), et laisser la machine travailler à votre place.
Vos avantages immédiats en mettant en place cette solution :
Un gain de temps considérable : Fini les copier-coller interminables et chronophages.
Zéro erreur de saisie : Les données sont transférées à l'identique, sans risque de manipulation accidentelle.
Une collaboration simplifiée : Vos équipes travaillent toujours sur la version la plus récente et à jour de vos reportings.
Il ne vous reste plus qu'à l'implémenter dans votre propre espace de travail pour transformer votre façon de gérer vos fichiers au quotidien. À vous de jouer !
/**
* ==========================================
* CONFIGURATION GLOBALE
* ==========================================
* Modifiez ces variables pour adapter le script
* sans avoir à toucher au reste du code.
*/
const CONFIG = {
FOLDER_ID: "1MJyiZ1_XukFpPhWet_EuZ74u9TkofMZs", // ID du dossier Drive où sauvegarder le fichier
HTML_FILENAME: "popmsg", // Nom du fichier HTML contenant l'interface (sans .html)
MENU_NAME: "MENU", // Nom du menu qui apparaîtra dans Google Sheets
NEW_FILE_TITLE: "[GSHEET][PREVISION]", // Nom donné au fichier une fois converti
DIALOG_TITLE: "MAJ OPERATION", // Titre de la fenêtre Pop-up
// Correspondance des feuilles à importer (Source -> Destination)
SHEETS_MAPPING: [
{ sourceName: "CLASSEUR_SOURCE", destName: "CLASSEUR_DESTINATION" },
// vous pouvez ajouté d'autre classeur en suivant le même modèle)
]
};
/**
* ==========================================
* FONCTIONS DU SCRIPT
* ==========================================
*/
/**
* Création du menu à l'ouverture du fichier
*/
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu(CONFIG.MENU_NAME)
.addItem('UPLOAD FICHIER', 'showDialog')
.addToUi();
}
/**
* Affiche la boîte de dialogue HTML pour l'upload
*/
function showDialog(){
var template = HtmlService.createTemplateFromFile(CONFIG.HTML_FILENAME).evaluate();
SpreadsheetApp.getUi().showModalDialog(template, CONFIG.DIALOG_TITLE);
}
/**
* Reçoit les données encodées en Base64 depuis le HTML, crée le fichier Excel et lance la conversion
*/
function uploadFilesToGoogleDrive(data, name, type) {
var datafile = Utilities.base64Decode(data);
var blob = Utilities.newBlob(datafile, type, name);
var folder = DriveApp.getFolderById(CONFIG.FOLDER_ID);
var newFile = folder.createFile(blob);
ConvertExcelGsheet(newFile.getId());
}
/**
* Convertit le fichier Excel en fichier Google Sheets via l'API Drive ( vous devez activé la bibliothèque )
*/
function ConvertExcelGsheet(idfichier) {
let file = DriveApp.getFileById(idfichier);
let blob = file.getBlob();
let configInsert = {
title : CONFIG.NEW_FILE_TITLE,
parents : [{id: file.getParents().next().getId()}],
mimeType: MimeType.GOOGLE_SHEETS
};
// ATTENTION : Nécessite l'activation du service avancé "Drive API" (v2)
let newSpreadsheet = Drive.Files.insert(configInsert, blob);
importDataFromSpreadsheet(newSpreadsheet.id);
}
/**
* Importe les données du nouveau fichier vers le fichier actuel en fonction de la configuration
*/
function importDataFromSpreadsheet(spreadsheetId) {
let sourceSpreadsheet = SpreadsheetApp.openById(spreadsheetId);
let currentSpreadsheet = SpreadsheetApp.getActive();
// Boucle sur toutes les feuilles définies dans CONFIG.SHEETS_MAPPING
CONFIG.SHEETS_MAPPING.forEach(function(mapping) {
let sourceSheet = sourceSpreadsheet.getSheetByName(mapping.sourceName);
let destSheet = currentSpreadsheet.getSheetByName(mapping.destName);
if (sourceSheet && destSheet) {
let dataRange = sourceSheet.getDataRange();
let values = dataRange.getValues();
// 1. Nettoyage de la feuille de destination (conserve la mise en forme)
// On efface à partir de la ligne 2 pour éviter des bugs si la feuille est vide
let lastRow = destSheet.getLastRow();
let lastCol = destSheet.getLastColumn();
if (lastRow > 1) {
destSheet.getRange(2, 1, lastRow - 1, lastCol).clear({contentsOnly: true, skipFilteredRows: true});
}
// 2. Copie des nouvelles données (depuis la ligne 1, ce qui écrase/remet les en-têtes)
let targetRange = destSheet.getRange(1, 1, dataRange.getNumRows(), dataRange.getNumColumns());
targetRange.setValues(values);
} else {
Logger.log("Erreur : La feuille source '" + mapping.sourceName + "' ou la destination '" + mapping.destName + "' est introuvable.");
}
});
}
Fichier Html
HTML
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<style>
body {
font-family: 'Roboto', Arial, sans-serif;
padding: 20px;
text-align: center;
background-color: #f8f9fa;
}
.container {
background: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);
}
input[type="file"] {
margin-bottom: 20px;
font-size: 14px;
}
button {
background-color: #1a73e8;
color: white;
border: none;
padding: 10px 24px;
border-radius: 4px;
cursor: pointer;
font-weight: 500;
font-size: 14px;
transition: background-color 0.3s;
}
button:hover {
background-color: #1557b0;
}
button:disabled {
background-color: #cccccc;
cursor: not-allowed;
}
#status {
margin-top: 15px;
font-size: 14px;
font-weight: 500;
}
</style>
</head>
<body>
<div class="container">
<input type="file" id="fileInput" accept=".xls,.xlsx,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />
<br>
<button id="uploadBtn" onclick="uploadFile()">Importer le fichier</button>
<div id="status"></div>
</div>
<script>
function uploadFile() {
const fileInput = document.getElementById('fileInput');
const statusDiv = document.getElementById('status');
const btn = document.getElementById('uploadBtn');
// Vérification si un fichier est sélectionné
if (fileInput.files.length === 0) {
statusDiv.innerHTML = "<span style='color:#d93025;'>Veuillez sélectionner un fichier Excel.</span>";
return;
}
const file = fileInput.files[0];
// Mise à jour de l'interface pendant le chargement
statusDiv.innerHTML = "<span style='color:#1a73e8;'>Importation et conversion en cours... Cela peut prendre quelques secondes.</span>";
btn.disabled = true;
// Lecture du fichier pour l'envoyer au script
const reader = new FileReader();
reader.onload = function(e) {
// Extraction de la base64
const data = e.target.result.split(',')[1];
// Appel de la fonction côté Apps Script
google.script.run
.withSuccessHandler(function() {
statusDiv.innerHTML = "<span style='color:#188038;'>Importation terminée avec succès !</span>";
// Fermeture automatique de la fenêtre après 2 secondes
setTimeout(function() {
google.script.host.close();
}, 2000);
})
.withFailureHandler(function(error) {
statusDiv.innerHTML = "<span style='color:#d93025;'>Erreur : " + error.message + "</span>";
btn.disabled = false;
})
.uploadFilesToGoogleDrive(data, file.name, file.type);
};
// Lecture du fichier sous forme d'URL de données (Base64)
reader.readAsDataURL(file);
}
</script>
</body>
</html>
Aucun commentaire pour le moment.