Copiez-collez ces scripts professionnels configurés étape par étape pour automatiser Google Sheets, Gmail, Drive et Agenda instantanément.
💡 Comment installer ces codes chez vous ?
1
Dans votre Google Sheets, cliquez sur Extensions > Apps Script.
2
Effacez le code existant et collez l'un de nos exemples ci-dessous.
3
Personnalisez les paramètres (comme les identifiants de dossiers), enregistrez et cliquez sur Exécuter.
Sélectionnez un automatisme à installer :
Relance automatique d'impayés par e-mail
Sheets + Gmail
Parcourt vos lignes de facturation dans Google Sheets, identifie les clients dont le statut est « Non Payé », leur envoie un rappel par e-mail professionnel au format HTML, puis inscrit la date d'envoi pour éviter les doublons.
Configuration de votre document :
Structure des colonnes recommandée :
Colonne A (index 0) : Nom du client (ex: Entreprise ABC)
Colonne B (index 1) : Adresse e-mail du client
Colonne C (index 2) : Montant de la facture (ex: 1500)
Colonne D (index 3) : Date d'échéance (au format Date)
Colonne E (index 4) : Statut de la facture (entrez Non Payé pour déclencher le rappel)
Colonne F (index 5) : Statut du rappel (laisser vide, le script y écrira Envoyé le DD/MM/YYYY HH:MM)
Instructions de mise en œuvre :
Préparez votre feuille Google Sheets avec la structure de colonnes ci-dessus.
Ajoutez quelques lignes de test avec votre propre adresse e-mail dans la colonne B.
Collez le code ci-contre dans l'éditeur Google Apps Script.
Cliquez sur Exécuter. Lors du premier lancement, autorisez les autorisations de sécurité requises (voir les étapes d'autorisation plus bas si nécessaire).
relance_impayes.gs
function relancerFacturesImpayees() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const dataRange = sheet.getDataRange();
const values = dataRange.getValues();
// Index des colonnes (0 = Colonne A, 1 = B, etc.)
const COL_NOM = 0;
const COL_EMAIL = 1;
const COL_MONTANT = 2;
const COL_ECHEANCE = 3;
const COL_STATUT = 4;
const COL_RAPPEL = 5;
let rappelsEnvoyes = 0;
// Parcourir à partir de la ligne 2 (index 1) pour ignorer les en-têtes
for (let i = 1; i < values.length; i++) {
const row = values[i];
const nom = row[COL_NOM];
const email = row[COL_EMAIL];
const montant = row[COL_MONTANT];
const echeance = row[COL_ECHEANCE];
const statut = row[COL_STATUT];
const rappelEnvoye = row[COL_RAPPEL];
// Vérifier si la facture n'est pas payée et qu'aucun rappel n'a été envoyé
if ((statut === "Non Payé" || statut === "Unpaid") && !rappelEnvoye) {
if (email && email.indexOf("@") !== -1) {
// Formater la date d'échéance
const dateFormatee = echeance instanceof Date ? Utilities.formatDate(echeance, Session.getScriptTimeZone(), "dd/MM/yyyy") : echeance;
// Template d'e-mail HTML personnalisé
const sujet = "Rappel de paiement : Facture en attente - " + nom;
const corpsHtml = `
Rappel de paiement
Bonjour ${nom},
Sauf erreur de notre part, le règlement de votre facture d'un montant de ${montant} €, qui était attendu pour le ${dateFormatee}, ne nous est pas parvenu.
Nous vous demandons de bien vouloir régulariser cette situation dans les plus brefs délais.
Ceci est un message automatique envoyé depuis notre gestionnaire de facturation.
`;
try {
// Envoyer l'email
MailApp.sendEmail({
to: email,
subject: sujet,
htmlBody: corpsHtml
});
// Mettre à jour le statut du rappel dans la feuille de calcul
const dateAujourdhui = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd/MM/yyyy HH:mm");
sheet.getRange(i + 1, COL_RAPPEL + 1).setValue("Envoyé le " + dateAujourdhui);
rappelsEnvoyes++;
Logger.log("Rappel envoyé à " + nom + " (" + email + ")");
} catch (erreur) {
Logger.log("Erreur lors de l'envoi de l'e-mail à " + email + " : " + erreur.message);
}
}
}
}
Browser.msgBox("Traitement terminé : " + rappelsEnvoyes + " rappel(s) envoyé(s).");
}
Générateur de factures PDF et stockage Drive
Sheets + Docs + Drive
Crée des factures PDF personnalisées à partir de vos données Google Sheets. Le script duplique un modèle Google Doc (servant de template), remplace les tags comme {{ClientNom}} par les valeurs du tableau, génère le PDF dans un dossier Drive spécifique, puis enregistre le lien URL de téléchargement dans votre tableau.
Configuration de votre document :
Structure des colonnes recommandée :
Colonne A (index 0) : Numéro de facture (ex: FAC-2026-001)
Colonne B (index 1) : Nom du client (remplace {{ClientNom}})
Colonne C (index 2) : Adresse du client (remplace {{ClientAdresse}})
Colonne D (index 3) : Description de la prestation (remplace {{Description}})
Colonne E (index 4) : Montant Total (remplace {{MontantTotal}})
Colonne F (index 5) : Lien du PDF généré (laisser vide, le script y inscrira automatiquement l'URL du fichier PDF dans Google Drive)
Instructions de mise en œuvre :
Créez un modèle Google Doc avec les balises textuelles exactes (ex: {{FactureNumero}}, {{ClientNom}}, {{ClientAdresse}}, {{Description}}, {{MontantTotal}}, {{DateEmission}}). Copiez l'ID de ce document de modèle (présent dans l'URL entre /d/ et /edit).
Créez un nouveau dossier vide dans votre Google Drive pour stocker les PDF et copiez son ID (présent dans l'URL du dossier après /folders/).
Dans le code Apps Script ci-contre, remplacez les valeurs des constantes TEMPLATE_DOC_ID et DOSSIER_PDF_ID (lignes 11 et 12) par vos identifiants copiés.
Remplissez une ligne dans votre tableur sans remplir la colonne F, puis exécutez le script. Le PDF sera généré et son lien apparaîtra dans votre cellule !
generate_pdf.gs
// ⚠️ À MODIFIER : L'identifiant du modèle Google Doc et du dossier Drive de destination
const TEMPLATE_DOC_ID = "VOTRE_ID_DE_DOCUMENT_TEMPLATE";
const DOSSIER_PDF_ID = "VOTRE_ID_DE_DOSSIER_DRIVE";
function genererFacturesPDF() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const values = sheet.getDataRange().getValues();
// Index des colonnes (0 = A, 1 = B, etc.)
const COL_NUMERO = 0;
const COL_NOM = 1;
const COL_ADRESSE = 2;
const COL_DESCRIPTION = 3;
const COL_MONTANT = 4;
const COL_LIEN_PDF = 5;
const templateDoc = DriveApp.getFileById(TEMPLATE_DOC_ID);
const dossierDestination = DriveApp.getFolderById(DOSSIER_PDF_ID);
let documentsGeneres = 0;
// Parcourir les lignes du tableau (ignorer l'en-tête)
for (let i = 1; i < values.length; i++) {
const row = values[i];
const numero = row[COL_NUMERO];
const nom = row[COL_NOM];
const adresse = row[COL_ADRESSE];
const description = row[COL_DESCRIPTION];
const montant = row[COL_MONTANT];
const lienPdfExistante = row[COL_LIEN_PDF];
// Générer uniquement si le numéro de facture existe et qu'il n'y a pas encore de PDF généré
if (numero && !lienPdfExistante) {
// 1. Créer une copie temporaire du Google Doc dans le dossier de destination
const nomFichierTemp = "Facture_" + numero + "_Temp";
const fichierTemp = templateDoc.makeCopy(nomFichierTemp, dossierDestination);
const docTempId = fichierTemp.getId();
const docTempInstance = DocumentApp.openById(docTempId);
const body = docTempInstance.getBody();
// 2. Remplacer les balises textuelles dans le modèle de document
body.replaceText("{{FactureNumero}}", numero);
body.replaceText("{{ClientNom}}", nom || "");
body.replaceText("{{ClientAdresse}}", adresse || "");
body.replaceText("{{Description}}", description || "");
body.replaceText("{{MontantTotal}}", parseFloat(montant || 0).toFixed(2) + " €");
body.replaceText("{{DateEmission}}", Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "dd/MM/yyyy"));
// Enregistrer et fermer la copie temporaire
docTempInstance.saveAndClose();
// 3. Convertir le document temporaire en PDF
const pdfBlob = fichierTemp.getAs(MimeType.PDF);
pdfBlob.setName("Facture_" + numero + "_" + (nom || "Client") + ".pdf");
// 4. Enregistrer le fichier PDF définitif et récupérer son URL publique
const fichierPdf = dossierDestination.createFile(pdfBlob);
const lienPdf = fichierPdf.getUrl();
// 5. Supprimer le fichier temporaire Google Doc
fichierTemp.setTrashed(true);
// 6. Écrire le lien du PDF dans le tableau Sheets
sheet.getRange(i + 1, COL_LIEN_PDF + 1).setValue(lienPdf);
documentsGeneres++;
Logger.log("Facture PDF générée pour " + nom + " : " + lienPdf);
}
}
Browser.msgBox("Succès : " + documentsGeneres + " facture(s) PDF générée(s).");
}
Planificateur d'événements Google Agenda
Sheets + Calendar
Lit vos lignes de réunions, tâches ou chantiers dans Google Sheets et crée automatiquement les événements associés dans votre agenda Google principal. Le script invite le client si son adresse e-mail est renseignée, et stocke l'identifiant de l'événement créé pour éviter de créer des doublons lors de la prochaine exécution.
Configuration de votre document :
Structure des colonnes recommandée :
Colonne A (index 0) : Titre de l'événement (ex: Rendez-vous client)
Colonne B (index 1) : Date et heure de début (ex: 04/06/2026 14:00:00)
Colonne C (index 2) : Date et heure de fin (ex: 04/06/2026 15:30:00)
Colonne D (index 3) : Description ou note de l'événement
Colonne E (index 4) : E-mail de l'invité (optionnel, recevra une invitation de l'agenda)
Colonne F (index 5) : Identifiant de l'événement Google Agenda (laisser vide, le script y inscrira l'ID technique unique de l'événement créé)
Instructions de mise en œuvre :
Préparez votre feuille Google Sheets en configurant la structure ci-dessus et veillez à formater les colonnes B et C au format "Date et heure" dans Sheets (Format > Nombre > Date et heure).
Collez le code ci-contre dans Apps Script.
Sélectionnez la fonction synchroniserCalendrier et cliquez sur Exécuter.
Ouvrez votre Google Agenda : vos événements ont été ajoutés et les identifiants ont été inscrits dans la colonne F.
sync_calendar.gs
function synchroniserCalendrier() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const values = sheet.getDataRange().getValues();
// Index des colonnes (0 = A, 1 = B, etc.)
const COL_TITRE = 0;
const COL_DEBUT = 1;
const COL_FIN = 2;
const COL_DESC = 3;
const COL_INVITE = 4;
const COL_EVENT_ID = 5;
// Récupérer l'agenda principal de l'utilisateur
const calendar = CalendarApp.getDefaultCalendar();
let evenementsCrees = 0;
// Parcourir à partir de la ligne 2
for (let i = 1; i < values.length; i++) {
const row = values[i];
const titre = row[COL_TITRE];
const dateDebut = row[COL_DEBUT];
const dateFin = row[COL_FIN];
const description = row[COL_DESC];
const emailInvite = row[COL_INVITE];
const eventIdExistant = row[COL_EVENT_ID];
// Créer uniquement si le titre et les dates sont valides, et s'il n'y a pas d'ID déjà stocké (doublons)
if (titre && dateDebut instanceof Date && dateFin instanceof Date && !eventIdExistant) {
try {
// Options de création de l'événement (description + invité)
const options = {
description: description || ""
};
// Ajouter un invité si présent
if (emailInvite && emailInvite.indexOf("@") !== -1) {
options.guests = emailInvite;
options.sendInvites = true;
}
// Créer l'événement dans Google Calendar
const event = calendar.createEvent(titre, dateDebut, dateFin, options);
const eventId = event.getId();
// Enregistrer l'identifiant de l'événement dans Sheets pour éviter de le recréer
sheet.getRange(i + 1, COL_EVENT_ID + 1).setValue(eventId);
evenementsCrees++;
Logger.log("Événement créé : " + titre + " (ID: " + eventId + ")");
} catch (erreur) {
Logger.log("Erreur lors de la création de l'événement '" + titre + "' : " + erreur.message);
}
}
}
Browser.msgBox("Terminé : " + evenementsCrees + " événement(s) ajouté(s) à votre agenda.");
}
🛡️ Alerte de sécurité Google : Pas de panique !
Lorsque vous lancez un script pour la toute première fois, Google affiche un grand écran rouge indiquant que l'application n'est pas validée. C'est une protection standard pour tous les scripts que vous écrivez vous-même en privé. Voici comment passer cette étape en toute sécurité :
1. Paramètres avancés
Sur l'écran d'alerte rouge, cliquez sur le lien Paramètres avancés en bas à gauche.
2. Forcer l'accès
Cliquez ensuite sur le petit lien Accéder au projet (non sécurisé). Pas d'inquiétude, votre code reste privé et ne tourne que chez vous.
3. Autoriser
Une fenêtre récapitule ce à quoi le script va accéder (lire vos Sheets, envoyer des e-mails). Cliquez sur Autoriser. Vos données restent en sécurité dans votre compte Google.