Et si le responsable devait aussi recevoir l'e-mail ? Ce pipeline de base n'écrit qu'au demandeur. L'Annexe D — Améliorer le flux explique comment le chef de service, la cellule parc auto et le chauffeur reçoivent aussi l'information (CC, annuaire par service, groupe de distribution), puis passe en revue 6 autres axes : formulaire enrichi, intégrité des données, engagements de délai, bon de sortie PDF, pilotage Power BI et gouvernance.
Créer ou accéder à votre compte Microsoft gratuit
⏱ 5 minSi vous n'avez pas de compte : ouvrez votre navigateur → allez sur outlook.com → cliquez Créer un compte gratuit → choisissez une adresse @outlook.com → remplissez le formulaire.
Si vous avez déjà un compte @outlook.com, @hotmail.com ou @live.com : connectez-vous directement sur outlook.com.
Après connexion, testez l'accès aux outils : ouvrez un nouvel onglet → tapez forms.office.com → vous devez voir "Mes formulaires". Puis make.powerautomate.com → vous devez voir la page "Créer".
Avec un compte Microsoft gratuit, vous avez accès à Forms illimité + Power Automate 750 exécutions/mois + OneDrive 5 Go + Excel Online basique. Suffisant pour tous vos exercices.
Compte professionnel vs personnel : Si vous avez un email de bureau (ex: votreprenom@ministere.ci), ce compte a peut-être déjà accès à Power Automate avec plus de fonctionnalités. Dans ce cas, utilisez votre email professionnel — les étapes sont identiques.
POINT CRITIQUE (à lire avant de créer le formulaire) : la documentation officielle Microsoft du connecteur Microsoft Forms indique : « The connector only works with organizational accounts » → le connecteur ne fonctionne qu'avec des comptes d'organisation (professionnel/scolaire). Avec un simple compte personnel @outlook.com, le déclencheur « Lorsqu'une nouvelle réponse est envoyée » peut ne jamais apparaître ou ne proposer aucun formulaire.
👉 Recommandation : construisez tout l'exercice avec un même compte professionnel/scolaire (toutes les ressources — formulaire + Excel + flux — doivent être dans ce compte). Si vous n'en avez pas : activez un essai Microsoft 365 Business de 30 jours pour obtenir un compte d'organisation, ou passez par le compte de votre structure. Un test de diagnostic de 60 secondes est fourni en sous-étape 4.0.
Construire le formulaire dans Microsoft Forms
⏱ 15 minAllez sur forms.office.com → cliquez + Nouveau formulaire (ou bouton +).
Titre du formulaire : cliquez "Titre sans titre" → tapez "Demande de Véhicule — Moyens Généraux". Description : "Remplissez ce formulaire pour demander un véhicule de service. Réponse sous 24h."
Ajoutez les questions en cliquant + Ajouter une nouvelle question :
📋 Demande de Véhicule — Moyens Généraux
Remplissez ce formulaire pour demander un véhicule de service.
Rendre les questions obligatoires : Pour chaque question, cliquez les 3 points ··· en haut à droite → cochez Obligatoire. Toutes sauf "Niveau d'urgence" (qui a une valeur par défaut).
Récupérer le lien du formulaire : Cliquez Collecter les réponses (bouton bleu en haut à droite) → copiez le lien. Gardez ce lien — vous en aurez besoin dans Power Automate.
QR Code automatique : Dans la même fenêtre "Partager", cliquez Code QR → Télécharger. Vous obtenez immédiatement un QR code pour votre formulaire — imprimez-le !
Chaque question du formulaire deviendra une colonne dans Excel. Le nom de la question = le nom de la colonne. Choisissez des noms clairs et sans accents si possible.
Question 8 obligatoire — « Votre adresse e-mail » : le formulaire d'origine n'en contenait pas, donc le flux ne pouvait écrire à personne. Ajoutez-la (type Texte, obligatoire) et vérifiez qu'elle s'affiche bien dans le plan « Aperçu du formulaire ». Le mapping des colonnes de l'Étape 4.5 s'appuie sur cette question (Q8).
Créer le fichier Excel sur OneDrive (gratuit)
⏱ 10 minAllez sur onedrive.live.com → connectez-vous → cliquez + Nouveau → Classeur Excel. Un Excel Online s'ouvre dans votre navigateur.
Renommez le fichier : cliquez "Classeur" en haut → tapez REGISTRE_VEHICULES_AUTO → Entrée. Le fichier est automatiquement sauvegardé sur OneDrive.
Créez les en-têtes en ligne 1. Tapez dans chaque cellule les noms de colonnes :
📊 Colonnes à créer dans Excel (ligne 1)
Convertir en tableau (CRUCIAL) : Sélectionnez toute la ligne 1 (A1 à K1) + une ligne vide en dessous (A1:K2) → Insertion → Tableau → cochez "Mon tableau a des en-têtes" → OK. Sans tableau structuré, Power Automate ne peut pas ajouter de lignes.
Nommez le tableau : cliquez dans le tableau → onglet Tableau → "Nom du tableau" → tapez DemandesVehicules → Entrée.
Important : Le fichier Excel DOIT être sur OneDrive (pas sur votre PC local) pour que Power Automate puisse y accéder. C'est la raison pour laquelle on l'a créé directement dans OneDrive.
Construire le flux automatique — 9 sous-étapes (4.0 → 4.9)
⏱ 35 min4.0 Avant de commencer — quel compte, quel outil ?
Power Automate a beaucoup changé (nouveau concepteur par défaut, assistant Copilot, renommage de certaines actions). Ce contrôle de 2 minutes élimine la cause n°1 de blocage à l'Étape 4 : le type de compte.
| Votre compte Microsoft | Connecteur « Microsoft Forms » | Que faire |
|---|---|---|
| Professionnel / scolaire prenom@ministere.ci, prenom@entreprise.com… |
✅ Disponible — chemin officiel | Continuez normalement, c'est le cas recommandé. |
| Personnel gratuit @outlook.com, @hotmail.com, @live.com |
⚠️ Non garanti Doc Microsoft : « the connector only works with organizational accounts » |
Faites le test ci-dessous. S'il échoue : compte professionnel, ou essai Microsoft 365 Business (30 jours). |
Test de 60 secondes : ouvrez make.powerautomate.com → + Créer → Flux cloud automatisé → dans la zone « Choisir le déclencheur de votre flux », tapez forms.
✅ Si le connecteur « Microsoft Forms » apparaît : c'est bon. Créez le flux (voir 4.1) puis vérifiez que votre formulaire est bien proposé dans le champ ID du formulaire (voir 4.2).
❌ S'il n'apparaît pas, ou si la liste des formulaires est vide : votre compte n'est pas « organisationnel ». Déconnectez-vous, reconnectez-vous avec un compte professionnel, puis refaites l'Étape 2 (formulaire) et l'Étape 3 (Excel) avec ce compte.
Astuce : ne mélangez jamais deux comptes — formulaire, classeur Excel et flux doivent appartenir au même compte.
Vérifiez enfin l'environnement affiché en haut à droite (ex. Contoso (default)). Un formulaire créé dans un environnement n'est pas visible depuis un autre.
Côté Excel : l'action Excel Online (Business) (utilisée en 4.4) travaille avec les classeurs hébergés sur OneDrive for Business, SharePoint ou un groupe Microsoft 365. Si votre classeur est sur un OneDrive personnel, l'action ne le trouvera pas : c'est le second signal qu'il faut basculer sur un compte professionnel.
4.1 Créer le flux cloud automatisé (nouveau concepteur 2026)
Ouvrez make.powerautomate.com → connectez-vous avec le compte validé en 4.0 (vérifiez l'avatar en haut à droite).
Menu de gauche → + Créer. La page propose : Flux cloud automatisé, instantané, planifié, flux de bureau, Copilote…
Choisissez Flux cloud automatisé (Automated cloud flow) → un panneau s'ouvre avec 2 champs : Nom du flux et Choisir le déclencheur de votre flux.
Nom du flux : tapez Formulaire Véhicule → Excel (évitez les caractères spéciaux en début de nom).
Recherchez forms → connecteur Microsoft Forms → déclencheur « Lorsqu'une nouvelle réponse est envoyée » (When a new response is submitted) → Créer.
⚠️ Ne prenez pas la variante marquée [DÉPRÉCIÉ] / DEPRECATED si elle est proposée : elle ne sert qu'aux anciens flux et sera retirée.
Le nouveau concepteur s'ouvre : canevas au centre (les cartes du flux), volet de configuration à gauche, volet Copilot à droite, barre d'outils en haut (Enregistrer, Vérificateur de flux, Tester). Cliquez ≫ pour replier Copilot et gagner de la place.
4.2 Configurer le déclencheur Microsoft Forms
Sur le canevas, cliquez la carte du déclencheur : son volet de configuration s'ouvre à gauche.
Champ ID du formulaire → liste déroulante → choisissez « Demande de Véhicule — Moyens Généraux ».
À la première utilisation, une connexion est demandée : Se connecter → compte de 4.0 → Autoriser. Le bandeau de la carte devient vert « Connecté » : c'est cette autorisation qui permet au flux de lire vos formulaires.
Le formulaire est absent de la liste ? Copiez son ID à la main : ouvrez le formulaire, prenez la valeur après FormId= dans l'URL (elle s'arrête au prochain &).
Ne touchez pas au bloc « Contrôle d'accès concurrentiel » : le désactiver n'est pas réversible depuis l'interface (erreur CannotDisableTriggerConcurrency, voir 4.9).
4.3 Action 1 — « Obtenir les détails de la réponse » (indispensable)
Le déclencheur ne transmet que le numéro de la réponse, pas son contenu : cette action va chercher les réponses question par question.
Sous la carte du déclencheur, cliquez + Nouvelle étape.
Recherchez forms → Microsoft Forms → action Obtenir les détails de la réponse (Get response details).
ID du formulaire : le même formulaire qu'en 4.2 (la connexion est déjà en place).
ID de réponse : cliquez dans le champ → panneau Contenu dynamique (icône ⚡) → bloc du déclencheur → ID de réponse. Un « jeton » bleu apparaît : ne le saisissez jamais à la main.
Renommez l'action 1. Lire la réponse (cliquez son titre) : l'historique des exécutions devient lisible (voir 4.7).
Point de contrôle : vous devez avoir 2 cartes sur le canevas. Cliquez Enregistrer : aucune erreur rouge dans le Vérificateur de flux, puis passez à 4.4.
DÉCLENCHEUR — Quand une réponse est soumise
Connecteur : Microsoft Forms
Formulaire ID : Demande de Véhicule — Moyens Généraux
Se déclenche : à chaque soumission du formulaire
ACTION 1 — Obtenir les détails de la réponse
Connecteur : Microsoft Forms
Formulaire ID : (même formulaire)
ID de réponse : ID de réponse (du déclencheur)
→ Ceci récupère les réponses de chaque question
ACTION 2 — Ajouter une ligne dans le tableau Excel
Connecteur : Excel Online (Business) ← choisir BUSINESS pas Standard
Emplacement : OneDrive for Business (ou SharePoint)
Bibliothèque de documents : OneDrive
Fichier : REGISTRE_VEHICULES_AUTO.xlsx
Tableau : DemandesVehicules
Valeurs à mapper (tableau complet en 4.4) :
ID_Demande : concat('VEH-', formatDateTime(utcNow(),'yyyyMMdd-HHmmss'))
Date_Soumission : utcNow()
Nom_Demandeur : Réponse à Q1 — Votre nom complet
Service : Réponse à Q2 — Votre service
… de Q3 à Q7 : les 5 autres jetons dynamiques du formulaire
Statut : En attente (valeur fixe)
ACTION 3 — Envoyer un email de confirmation
Connecteur : Office 365 Outlook (ou Gmail si compte Google)
À : Réponse à Q8 — Votre adresse e-mail (ou votre adresse pour tester)
Objet : Demande véhicule reçue — En attente de traitement
Corps : Votre demande pour [Destination] le [Date_Mission] a bien été enregistrée. Référence : [ID_Demande]. Réponse sous 24h.
4.4 Tableau de correspondance — les 11 colonnes à remplir
Le tableau ci-dessous est votre feuille de route : gardez-le sous les yeux pendant la sous-étape 4.5, où vous remplirez un par un les champs de l'action « 2. Écrire dans Excel ». Pour chaque champ : cliquez dedans → le panneau Contenu dynamique (icône ⚡) s'ouvre ; l'onglet Expression (icône fx) sert aux formules. Vous pouvez aussi taper / pour insérer du contenu dynamique au clavier.
| Champ Excel | Valeur à insérer | Comment |
|---|---|---|
| A — ID_Demande | concat('VEH-', formatDateTime(utcNow(),'yyyyMMdd-HHmmss')) | Onglet Expression |
| B — Date_Soumission | utcNow() | Expression (Abidjan = UTC+0 : l'heure est juste) |
| C — Nom_Demandeur | ⚡ Réponse à Q1 — Votre nom complet | Contenu dynamique |
| D — Service | ⚡ Réponse à Q2 — Votre service | Contenu dynamique |
| E — Date_Mission | ⚡ Réponse à Q3 — Date et heure souhaitées | Contenu dynamique |
| F — Destination | ⚡ Réponse à Q4 — Destination | Contenu dynamique |
| G — Nb_Passagers | ⚡ Réponse à Q5 — Nombre de passagers | Contenu dynamique |
| H — Motif | ⚡ Réponse à Q6 — Motif de la mission | Contenu dynamique |
| I — Urgence | ⚡ Réponse à Q7 — Niveau d'urgence | Contenu dynamique |
| J — Statut | En attente — texte fixe, à saisir tel quel | Clavier |
| K — Vehicule_Assigne | Laisser vide (sera rempli plus tard par le gestionnaire) | — |
Saisir une expression : cliquez dans le champ → onglet Expression (fx) → collez la formule sans les guillemets d'affichage → validez. Vérifiez chaque parenthèse : une seule manquante fait échouer l'action Excel (voir 4.9).
👉 Toutes les formules utiles — aide-mémoire des fonctions, 12 recettes classées par niveau, banc d'essai « Composer » et dépannage des messages d'erreur — sont dans l'Annexe A — Expressions (fx).
4.5 Action 2 — « Ajouter une ligne dans un tableau » (Excel Online (Business))
Cliquez + Nouvelle étape sous l'action « 1. Lire la réponse ».
Recherchez excel → choisissez Excel Online (Business) et surtout pas « Excel Online » seul (version limitée, qui souvent ne voit pas vos fichiers) → action Ajouter une ligne dans un tableau (Add a row into a table).
Connectez le connecteur si demandé : Se connecter → compte de 4.0 → Autoriser.
Emplacement : choisissez OneDrive for Business (ou SharePoint si votre registre y est hébergé). Bibliothèque de documents : laissez la valeur proposée (généralement OneDrive).
Fichier : cliquez l'icône dossier 📁 → naviguez jusqu'à REGISTRE_VEHICULES_AUTO.xlsx → sélectionnez-le. S'il est introuvable : mauvais compte, ou classeur resté en local (revoir l'Étape 3).
Tableau : la liste déroulante doit afficher DemandesVehicules. Si elle est vide, le classeur ne contient pas de tableau structuré nommé : retour à l'Étape 3 → sélectionnez A1:K1 (+ une ligne vide) → Insertion → Tableau → cochez « Mon tableau a des en-têtes » → onglet Conception de tableau → Nom du tableau = DemandesVehicules.
Bonne nouvelle visible immédiatement : les 11 colonnes du tableau apparaissent comme champs à remplir (A → K). C'est la preuve que Power Automate a bien reconnu votre tableau structuré. Renommez l'action 2. Écrire dans Excel.
Piège classique (documenté par Microsoft) : si vous ajoutez/modifiez une colonne dans Excel après avoir créé l'action, le nouveau champ n'apparaît pas tout seul dans le flux. Solution : supprimez l'action Excel et rajoutez-la (elle relit le tableau), ou remplissez le champ à la main si vous êtes sûr du nom exact de la colonne.
4.6 Action 3 — « Envoyer un e-mail (V2) » (confirmation au demandeur)
Lacune corrigée : dans la version précédente de cet exercice, le formulaire ne demandait aucune adresse e-mail — il était donc impossible d'écrire au demandeur ! Deux solutions : (a) ajoutez la question « Votre adresse e-mail * » (type Texte) à l'Étape 2 — recommandé ; (b) envoyez l'e-mail à une adresse fixe (la vôtre, ou celle de la cellule Moyens Généraux).
+ Nouvelle étape → recherchez outlook → Office 365 Outlook → action Envoyer un e-mail (V2) (Send an email (V2)). Avec un compte Gmail, prenez le connecteur Gmail.
À : cliquez dans le champ → ⚡ Contenu dynamique → Réponse à Q8 — Votre adresse e-mail. (Solution b : saisissez votre adresse en dur.)
Objet : tapez Demande véhicule reçue — puis insérez le jeton ⚡ Réponse à Q1 — Votre nom complet.
Corps : recopiez le modèle ci-dessous en remplaçant chaque « … » par son jeton ⚡. Un jeton s'insère d'un clic : aucune faute de frappe, et la valeur s'adapte à chaque demandeur.
Votre demande de véhicule pour « Réponse à Q4 — Destination » le « Réponse à Q3 — Date et heure souhaitées » a bien été enregistrée.
Motif : « Réponse à Q6 — Motif de la mission » — Passagers : « Réponse à Q5 — Nombre de passagers »
Niveau d'urgence déclaré : « Réponse à Q7 — Niveau d'urgence »
Statut actuel : En attente — réponse du service Moyens Généraux sous 24h.
Cordialement,
Service Moyens Généraux
Ouvrez Options avancées : ajoutez une CC vers votre responsable (utile en cas d'urgence) et réglez l'importance. Puis renommez l'action 3. Confirmer au demandeur.
4.7 Enregistrer, vérifier, activer et tester
Nommez vos 4 cartes : le déclencheur, 1. Lire la réponse, 2. Écrire dans Excel, 3. Confirmer au demandeur.
Enregistrer → le flux est activé automatiquement : vérifiez l'interrupteur ON dans Mes flux.
Vérificateur de flux : corrigez toute erreur rouge AVANT de tester (parenthèse manquante, champ obligatoire vide, connexion absente).
Tester → Manuellement : avec un déclencheur Forms, le test reste « en cours » jusqu'à la prochaine soumission réelle — c'est normal, ne recommencez pas dix fois.
Le vrai test : ouvrez le formulaire dans un autre onglet, envoyez une réponse (détail en Étape 5), puis Mes flux → votre flux → « Exécutions sur les 28 derniers jours » → l'exécution doit être verte ✓. Cliquez-la : chaque carte affiche son entrée/sortie JSON — c'est là qu'on voit la valeur réellement écrite dans Excel.
4.8 Concepteur 2026 vs classique — 6 astuces qui font gagner du temps
| Astuce | Pourquoi c'est utile |
|---|---|
| Bascule « Nouveau concepteur » (en haut à droite) | Si une action refuse de s'ouvrir dans le nouveau concepteur, basculez une minute en mode classique, configurez, puis revenez. |
| Épingler un volet (menu ⋯ → Épingler) | Affiche 2 volets de configuration côte à côte : idéal pour recopier un jeton dynamique d'une carte à l'autre. |
| Ajouter une note (menu ⋯ de la carte) | Le nouveau concepteur ne gère pas encore les commentaires : les notes les remplacent. |
| Copier / dupliquer une action | Réutilise la connexion et l'emplacement Excel : parfait pour écrire ensuite dans une 2ᵉ feuille ou un 2ᵉ registre. |
| Taper / dans un champ | Insère le contenu dynamique au clavier, sans ouvrir le panneau ⚡. |
| Peek code (menu ⋯ d'une action) | Affiche le JSON réel de l'action : le meilleur moyen de comprendre une erreur d'expression ou de connecteur. |
Copilot : le volet de droite accepte des phrases comme « ajoute une action pour écrire une ligne dans Excel » ou « pourquoi mon flux a échoué ? ». Pratique pour démarrer vite, mais vérifiez systématiquement le résultat : rien ne remplace le mapping manuel des colonnes (4.4).
4.9 Dépannage — les 8 erreurs les plus fréquentes de l'Étape 4
| Symptôme | Cause probable | Correction |
|---|---|---|
| Le connecteur Microsoft Forms n'apparaît pas, ou aucun formulaire n'est proposé | Compte personnel (@outlook.com) alors que la doc Microsoft réserve le connecteur aux comptes d'organisation | Reconnectez-vous avec un compte professionnel/scolaire (ou un essai Microsoft 365 Business 30 j) puis refaites les Étapes 2 et 3 avec ce compte |
| L'action Excel ne trouve pas REGISTRE_VEHICULES_AUTO.xlsx | Classeur sur un OneDrive personnel, ou connexion du connecteur associée à un autre compte | Menu ⋯ de la carte → Se reconnecter avec le bon compte ; hébergez le classeur sur OneDrive for Business ou SharePoint |
| La liste déroulante Tableau est vide | Aucun tableau structuré dans le classeur, ou tableau mal nommé | Étape 3 : sélectionnez A1:K1 → Insertion → Tableau → cochez « Mon tableau a des en-têtes » → Conception de tableau → Nom = DemandesVehicules |
| Erreur InvalidTemplate / unable to parse expression | Expression recopiée avec une parenthèse ou un guillemet manquant | Rouvrez le champ → onglet Expression → recollez concat('VEH-', formatDateTime(utcNow(),'yyyyMMdd-HHmmss')) sans rien modifier |
| Une colonne ajoutée dans Excel n'apparaît pas dans le flux | Comportement normal et documenté : le concepteur ne relit pas les colonnes à chaud | Supprimez l'action Excel et rajoutez-la (le tableau est relu), puis remappez les champs |
| Le flux ne se déclenche pas du tout | Flux désactivé, mauvais formulaire sélectionné, ou déclencheur [DÉPRÉCIÉ] utilisé | Mes flux → interrupteur ON ; contrôlez l'ID du formulaire ; recréez le déclencheur avec la version non dépréciée |
| Erreur CannotDisableTriggerConcurrency | Le contrôle d'accès concurrentiel du déclencheur Forms a été désactivé | Irreversible dans l'interface : exportez le flux, retirez la section runtimeConfiguration / concurrency du JSON, puis réimportez-le |
| Exécution verte mais aucun e-mail reçu | Champ « À » vide (question e-mail absente du formulaire) ou message classé indésirable | Ajoutez la question Q8 (Étape 2), vérifiez le dossier Courrier indésirable, renseignez l'adresse d'expéditeur |
Fin de l'Étape 4 — vous devez pouvoir cocher : le flux contient 4 cartes (1 déclencheur + 3 actions) · les connexions sont vertes « Connecté » · le Vérificateur de flux ne remonte aucune erreur rouge · le flux est activé. Sinon, reprenez la ligne correspondante du tableau ci-dessus avant de passer à l'Étape 5.
Test complet du pipeline Forms → Excel → Email
⏱ 10 minOuvrez votre formulaire : allez sur forms.office.com → cliquez votre formulaire → bouton Aperçu (œil en haut à droite) pour l'ouvrir comme un utilisateur le verrait.
Remplissez le formulaire avec des données fictives :
Nom : Test Automatisation
Service : DAF
Date : demain
Destination : Abidjan Plateau — Test
Passagers : 2
Motif : Réunion institutionnelle
E-mail : votre propre adresse (pour recevoir la confirmation)
Urgence : Normal
→ Cliquez Envoyer.
Vérifier Power Automate : Allez sur make.powerautomate.com → Mes flux → cliquez votre flux → dans "Exécutions de flux sur les 28 derniers jours", vous devez voir une exécution verte ✓ Réussie. Si rouge, cliquez pour voir l'erreur.
Vérifier Excel : Ouvrez onedrive.live.com → ouvrez REGISTRE_VEHICULES_AUTO.xlsx → la ligne de test doit être présente avec toutes les colonnes remplies et le statut "En attente".
Vérifier l'email : Ouvrez outlook.com → vous devez avoir reçu l'email de confirmation automatique.
Test QR Code : Sur votre téléphone, scannez le QR code téléchargé depuis Forms → le formulaire doit s'ouvrir → soumettez une 2ème ligne → vérifiez que la 2ème ligne apparaît dans Excel.
Si les 3 vérifications passent (exécution verte, ligne Excel, email reçu) : votre pipeline automatique est opérationnel ! Vous pouvez maintenant partager le lien du formulaire ou le QR code à vos collègues.
Maîtriser les expressions : du simple collage au calcul conditionnel
📚 Référence permanenteA.1 Où et comment écrire une expression
Cliquez dans n'importe quel champ d'une carte (ID_Demande, Objet de l'e-mail, valeur d'une condition…). Un panneau s'ouvre sous le champ avec 2 onglets : Contenu dynamique (⚡) et Expression (fx).
Onglet Expression → tapez ou collez la formule → Mettre à jour / Ajouter. Le champ affiche alors la formule, jamais son résultat.
Pour mélanger texte + valeur (le cas le plus fréquent), l'expression est inutile : tapez le texte, puis cliquez le jeton ⚡ au milieu du champ. Power Automate fabrique un concat tout seul en arrière-plan.
Pour envelopper un jeton dans une fonction (toUpper, trim…) : dans le panneau Expression, tapez toUpper(), placez le curseur entre les parenthèses, puis revenez sur l'onglet Contenu dynamique et cliquez le jeton. Vous obtenez toUpper(«jeton»).
Jamais de = au début (contrairement à Excel) et jamais de guillemets doubles : on écrit concat('VEH-', …) avec des apostrophes simples.
Le résultat n'est pas prévisualisé : il faut exécuter le flux pour connaître la valeur. D'où le banc d'essai (A.6) et l'usage de Peek code (A.7).
A.2 Les 12 règles du langage d'expression
Power Automate n'invente rien : il utilise le Workflow Definition Language (le même qu'Azure Logic Apps). Cela n'a donc rien à voir avec Excel, DAX ou Python — c'est la première source de confusion.
| Règle | Bon / Mauvais |
|---|---|
1. Pas de = au début | ✅ concat('A','B') — ❌ =concat('A','B') |
| 2. Apostrophes simples uniquement | ✅ 'En attente' — ❌ "En attente" |
| 3. Nom des fonctions sensible à la casse | ✅ utcNow() — ❌ utcnow() |
| 4. Arguments séparés par des virgules, tout entre parenthèses | ✅ formatDateTime(utcNow(),'dd/MM/yyyy') |
5. Pas de @ dans l'éditeur fx (le @ n'apparaît que dans le code JSON sous la forme @{…}) | L'éditeur l'ajoute pour vous |
| 6. Apostrophe dans un texte → doublée | ✅ 'Demande d''achat' |
| 7. Texte et nombre : conversion explicite | string(int('2') + 3) → « 5 » |
| 8. Les dates se manipulent avec des fonctions dédiées | ✅ addDays(utcNow(),2) — ❌ utcNow()+2 |
| 9. Un jeton de formulaire ne se tape jamais à la main | Son vrai nom est technique : outputs('…')?['body/rxxxxxxxx'] |
| 10. Une expression renvoie une seule valeur (texte, nombre, tableau ou objet) | Pour repasser en texte : string(…) |
| 11. Booléens en minuscules | ✅ if(true, …) — ❌ if(True, …) |
| 12. Pas d'enchaînement pointé : on imbrique | ✅ toUpper(trim(x)) — ❌ x.trim().toUpper() |
À retenir : si votre formule ressemble à du DAX ou à une formule Excel, elle ne fonctionnera pas. Une expression Power Automate est un appel de fonction, pas un calcul de cellule.
A.3 Aide-mémoire : les fonctions les plus utiles
| Fonction | Exemple | Résultat |
|---|---|---|
| concat | concat('VEH-','2026',42) | VEH-202642 |
| utcNow | utcNow() | 2026-09-12T08:46:12.3456789Z |
| utcNow + format | utcNow('yyyyMMdd') | 20260912 |
| addDays / addHours / addMinutes | addDays(utcNow(),2) | même heure, + 2 jours |
| addToTime | addToTime(utcNow(),3,'hour') | + 3 heures |
| formatDateTime | formatDateTime(utcNow(),'dd/MM/yyyy HH:mm') | 12/09/2026 08:46 |
| convertFromUtc | convertFromUtc(utcNow(),'Africa/Abidjan') | heure d'Abidjan (UTC+0, pas de décalage) |
| ticks | ticks('2026-09-14T00:00:00Z') | nombre de « ticks » (1 tick = 100 ns) |
| dayOfWeek / dayOfMonth / dayOfYear | dayOfWeek('2026-09-14') | 1 → dimanche = 0, lundi = 1, … samedi = 6 |
| toUpper / toLower / trim | toUpper(trim(' ama ')) | AMA |
| replace | replace('A/B','/','-') | A-B |
| substring | substring('VEH-20260912',0,8) | VEH-2026 |
| split · first · last · length | last(split('ama@ministere.ci','@')) | ministere.ci |
| join | join(createArray('A','B'),' / ') | A / B |
| startsWith / endsWith / contains | startsWith('VEH-12','VEH') | true |
| indexOf | indexOf('Terrain/Inspection','/') | 7 |
| empty / coalesce | coalesce(«jeton», '—') | « — » si la question est vide |
| if / equals | if(equals(«jeton»,'Critique'),'🔴','🔵') | 🔴 ou 🔵 |
| and / or / not | and(equals(x,'Oui'),greater(n,2)) | true / false |
| greater / less / greaterOrEquals / lessOrEquals | greater(int(n),5) | true si n > 5 |
| add · sub · mul · div · mod | div(mul(2,3),4) | 1 (division entière) |
| int / float / string | string(int('07')) | 7 |
| guid (ou newGuid) | substring(guid(),0,6) | a3f91c (code court unique) |
| base64ToString | base64ToString('QWJpZGphbg==') | Abidjan |
| uriComponent | uriComponent('Abidjan Plateau') | Abidjan%20Plateau |
| item / items | items('Appliquer_à_chacun')?['Destination'] | valeur de la ligne en cours de boucle |
Liste volontairement partielle : la référence complète (~140 fonctions) est la page Microsoft « Reference guide to workflow expression functions ». Tout ce qui fonctionne dans Azure Logic Apps fonctionne ici, à l'identique.
A.4 12 recettes prêtes à copier pour CE projet
Remplacez les «jeton» par les jetons ⚡ obtenus via l'onglet Contenu dynamique du panneau Expression (méthode A.1, étape 4). Les recettes marquées Expert ajoutent des colonnes hors registre de base : vous pouvez les tester sans toucher à vos 11 colonnes.
| À produire | Niveau | Expression |
|---|---|---|
| ID unique lisible (colonne A) | Simple | concat('VEH-', formatDateTime(utcNow(),'yyyyMMdd-HHmmss')) |
| ID court anti-doublon | Pro | toUpper(concat('VEH-', formatDateTime(utcNow(),'yyMMdd'), '-', substring(guid(),0,4))) |
| Horodatage lisible (colonne B) | Pro | formatDateTime(convertFromUtc(utcNow(),'Africa/Abidjan'),'dd/MM/yyyy HH:mm') |
| Jour en français | Pro | formatDateTime(utcNow(),'dddd','fr-FR') — si votre version refuse le 3ᵉ argument, faites un if sur dayOfWeek |
| Nom normalisé | Simple | toUpper(trim(«jeton nom»)) |
| Statut enrichi (colonne J) | Pro | if(equals(«jeton urgence»,'Critique'),'URGENT — à traiter','En attente') |
| Priorité numérique (nouvelle colonne L) | Expert | if(equals(«jeton urgence»,'Critique'),1,if(equals(«jeton urgence»,'Urgent (24h)'),2,3)) |
| Échéance de traitement (colonne M) | Expert | addHours(utcNow(), if(equals(«jeton urgence»,'Critique'),4,24)) |
| Domaine de l'adresse e-mail (colonne N) | Pro | last(split(«jeton e-mail»,'@')) |
| Jours restants avant la mission | Expert | div(sub(ticks(«jeton date»), ticks(utcNow())), 864000000000) |
| Formule de politesse selon le service | Simple | if(equals(«jeton service»,'DAF'),'Madame, Monsieur le Directeur','Bonjour') |
| Objet d'e-mail dynamique | Pro | concat('Demande véhicule — ', «jeton destination», ' — ', if(equals(«jeton urgence»,'Critique'),'🔴 CRITIQUE','normale')) |
Trois précautions : (1) la fonction ticks attend un horodatage ISO complet — si le format renvoyé par Forms la fait échouer, intercalez un formatDateTime ; (2) une recette qui renvoie null n'empêche pas les autres colonnes de s'écrire : elle vide seulement la sienne ; (3) attention à l'unicité de l'ID — la recette « simple » n'a que la précision de la seconde : deux demandes envoyées dans la même seconde produisent le même identifiant, et tout mécanisme d'anti-doublon (B.4) ou de mise à jour par clé (B.3) en perdra une silencieusement. Ajoutez un suffixe aléatoire, comme dans la recette « ID court anti-doublon » ci-dessus, ou utilisez triggerOutputs()?['body/responseId'] qui est unique par construction.
A.5 Jeton ⚡ ou expression fx : que choisir ?
| Situation | À utiliser | Pourquoi |
|---|---|---|
| Écrire une réponse telle quelle | Jeton ⚡ seul | Zéro faute possible, valeur brute fiable |
| Ajouter du texte autour d'une réponse | Jeton + texte tapé dans le même champ | Le concepteur génère le concat automatiquement |
| Transformer une réponse (majuscules, nettoyage, découpage, calcul) | Fonction fx + jeton entre parenthèses | Seule façon d'appliquer un traitement |
| Réutiliser la même valeur calculée dans 3 champs | Action Composer (A.6) + jeton « Sorties » | Calculée une fois, réutilisée partout, lisible dans l'historique |
| Prendre une décision (si / sinon) | Action Condition (Annexe B.1) | Bien plus clair que des if imbriqués |
Voir la vraie syntaxe : menu ⋯ d'une carte → Peek code. Vous y lisez le JSON réel, par exemple "Statut": "@{if(equals(triggerOutputs()?['body/r1a2b'],'Critique'),'URGENT','En attente')}". C'est le meilleur outil de diagnostic et de copie d'expression.
A.6 Banc d'essai : tester une expression avec l'action « Composer »
Le concepteur n'affiche jamais le résultat d'une expression : il faut exécuter le flux. Voici la méthode rapide, sans polluer votre flux final.
Dans votre flux (ou un flux de test), + Nouvelle étape → recherchez composer → connecteur Données → action Composer.
Cliquez le champ Entrées → onglet Expression (fx) → collez la formule à tester, par exemple div(sub(ticks('2026-09-20T00:00:00Z'),ticks(utcNow())),864000000000) → Mettre à jour.
Renommez le Composer TEST — jours restants. Vous pouvez le déplacer librement sur le canevas (clic-glisser) : il ne perturbe pas le reste du flux.
Déclenchez le flux (une soumission de test) → ouvrez l'exécution → cliquez la carte du Composer → le bloc Sorties affiche le corps : c'est la valeur calculée, exactement ce qui partira dans Excel.
Recette validée ? Deux options : (a) garder le Composer et réutiliser son jeton Sorties partout où la valeur est nécessaire ; (b) copier la formule validée directement dans le champ de destination puis supprimer le Composer.
Trois usages supplémentaires du Composer : documenter un calcul au milieu du flux ; sécuriser les champs vides avec coalesce(«jeton», '') ; et fabriquer une clé unique réutilisée ensuite par l'action « Mettre à jour une ligne » (Annexe B.3).
A.7 Dépanner une expression : les 9 messages d'erreur et leur cause
| Message affiché | Cause réelle | Correction |
|---|---|---|
Unable to parse expression / InvalidTemplate | Parenthèse, apostrophe ou virgule manquante ; guillemets doubles employés | Recopiez la formule depuis cette annexe, comptez les ( et ), remplacez " par ' |
The function 'utcnow' is not defined | Casse incorrecte dans le nom de la fonction | Écrivez exactement utcNow, concat, formatDateTime |
… expects its parameter X to be of type 'Int' | Du texte est passé là où un nombre est attendu | Enveloppez la source : int(«jeton passagers») avant l'opération |
La colonne Excel est vide / contient null | Question facultative non remplie, ou jeton provenant d'un autre formulaire | coalesce(«jeton»,'—') et vérifiez l'ID du formulaire dans le déclencheur |
The template language expression … cannot be evaluated | Un jeton a été tapé à la main au lieu d'être inséré au clic | Videz le champ, puis réinsérez le jeton depuis ⚡ (règle 9 de A.2) |
| La date s'affiche en anglais ou est décalée | Aucun format spécifié, ou fuseau UTC affiché brut | formatDateTime(…,'dd/MM/yyyy') et convertFromUtc(…,'Africa/Abidjan') |
| Le nombre de passagers devient « 2,0 » ou « 02 » | Type flottant conservé, ou zéro de tête | string(int(«jeton passagers»)) |
Une condition renvoie true au mauvais moment | Comparaison de types différents ou espaces/accents parasites | Normalisez les deux côtés : toLower(trim(x)) |
| Tout fonctionne mais une carte rouge « Composer » apparaît | Le Composer de test contient une formule erronée | Corrigez-le ou supprimez-le avant de remettre le flux en production |
Ordre de diagnostic recommandé : 1) Vérificateur de flux (erreurs de structure) → 2) exécuter et lire la carte rouge (message + entrées/sorties) → 3) Peek code pour comparer la formule écrite et la formule exécutée → 4) Réexécuter l'action seule après correction (les jetons sont rejoués à l'identique, ce qui accélère énormément les essais).
Alerte urgence → B.1
Ajoutez une condition dans le flux : si Urgence = "Critique" → envoyer aussi un SMS ou email à votre responsable.
Connecter à Power BI → B.7
Dans Power BI Desktop → Obtenir des données → Excel → sélectionnez REGISTRE_VEHICULES_AUTO.xlsx → votre dashboard se met à jour à chaque nouvelle demande.
2ème formulaire Fournitures
Répétez exactement le même processus pour un formulaire "Demande Fournitures" → Excel REGISTRE_FOURNITURES. Vous maîtrisez maintenant la méthode.
Relance auto J+2 → B.5
Créez un 2ème flux planifié (chaque matin à 9h) qui vérifie Excel → lignes "En attente" depuis plus de 2 jours → envoie une relance automatique.
De l'exercice à une vraie application métier
📚 À faire dans l'ordre de votre choixB.1 Escalade automatique : si Urgence = « Critique »
Entre l'action Excel (4.5) et l'e-mail (4.6), cliquez + Nouvelle étape → recherchez condition → action Condition (catégorie Contrôle).
Choisir une valeur : cliquez le champ → ⚡ → jeton Réponse à Q7 — Niveau d'urgence. Opérateur : est égal à. Valeur : tapez Critique (respectez la casse du formulaire).
Branche Si oui → Ajouter une action → Envoyer un e-mail (V2) au responsable, avec un objet construit par expression : concat('🔴 URGENT — ', «jeton destination»).
Branche Si non : laissez-la vide — l'e-mail standard de 4.6 part de toute façon. Une branche vide est un choix valide et lisible.
Variante 3 niveaux : remplacez la Condition par l'action Basculer (Switch) sur le même jeton, avec 2 cas (Critique, Urgent (24h)) et le Cas par défaut pour Normal.
Pourquoi une Condition plutôt qu'une expression if : la Condition crée un bloc visible dans l'historique (la branche empruntée s'affiche en vert), accepte plusieurs actions, et reste lisible par un collègue. Règle d'or : les expressions pour les valeurs, les conditions pour les décisions.
B.2 Notifier l'équipe dans Microsoft Teams
Placez-vous dans la branche « Si oui » (B.1) ou juste après l'action Excel : + Nouvelle étape → Microsoft Teams → action Publier un message dans une conversation ou un canal (anciennement « Publier un message (V3) »). Vous devez être membre de l'équipe/canal visé.
Choisissez Équipe et Canal dans les listes, puis composez le Message en mélangeant texte et jetons ⚡ :
🚗 Nouvelle demande de véhicule
Demandeur : «jeton Q1» — Service : «jeton Q2»
Destination : «jeton Q4» — Passagers : «jeton Q5»
Motif : «jeton Q6» — Urgence : «jeton Q7»
Statut : En attente de validationVariante moderne : action Publier une carte adaptative (Adaptive Card) — rendu cliquable dans Teams (boutons Approuver / Voir le registre) au lieu d'un simple texte.
Anti-bruit : n'envoyez dans Teams que l'essentiel — enveloppez la publication dans une Condition « Urgence = Critique » (B.1) et laissez l'e-mail gérer le reste.
Si l'action Teams n'apparaît pas : Teams doit être autorisé pour votre compte (même logique qu'en 4.0). Le connecteur « Teams » a plusieurs actions similaires selon les versions — cherchez simplement teams puis message et choisissez celle qui demande Équipe + Canal.
B.3 Circuit d'approbation : valider, puis mettre à jour la ligne Excel
C'est LE scénario qui transforme l'exercice en véritable application métier : le gestionnaire reçoit la demande, clique Approuver, et Excel se met à jour tout seul.
Pré-requis Excel : la colonne A — ID_Demande doit contenir des valeurs uniques. L'action Mettre à jour une ligne exige une colonne clé et le nom de champ est sensible à la casse.
Dans le flux : + Nouvelle étape → connecteur Approbations → action Démarrer et attendre une approbation.
Type : Approuver/Refuser. Titre : concat('Véhicule — ', «jeton destination»). Affecté à : l'e-mail du responsable. Détails : collez les jetons Q1 → Q8 + l'ID de demande créé en 4.5.
Ajoutez ensuite Excel Online (Business) → Mettre à jour une ligne : même fichier, même tableau, Colonne clé = ID_Demande, Valeur de clé = le jeton du Composer (A.6) qui porte l'ID. Pour le champ Statut :
if(equals(«jeton décision»,'Approuver'),'Approuvé','Refusé')Terminez par un e-mail de décision au demandeur, objet concat('Votre demande est ', «jeton décision»). Le flux reste « en cours » plusieurs jours : c'est normal, l'approbation arrive par Teams / e-mail / application mobile.
Piège fréquent : si la colonne clé contient deux fois la même valeur, seule la première ligne est modifiée — sans message d'erreur. D'où l'intérêt de la recette « ID court anti-doublon » (A.4) et de son unicité garantie.
B.4 Refuser les doublons (contrôle avant écriture)
Placez-vous avant l'action « Ajouter une ligne » : + Nouvelle étape → Excel Online (Business) → Répertorier les lignes présentes dans un tableau.
Sélectionnez le fichier et le tableau, puis ouvrez Options avancées → Filtrer la requête :
Destination eq '@{«jeton destination»}'(Filtre OData : un seul opérateur par colonne — eq, ne, contains, startswith, endswith — et le nom de colonne doit être exact.) Ajoutez ensuite une Condition sur la longueur du résultat : Longueur de valeur est égal à 0, ou l'expression empty(«Sorties du Répertorier»?['value']).
Branche Si oui (aucune ligne trouvée) : l'écriture normale dans Excel. Branche Si non : e-mail « doublon détecté » et arrêt du flux — ou poursuite, à vous de décider selon le métier.
Limites à connaître : « Répertorier les lignes présentes dans un tableau » renvoie 256 lignes par défaut (activez la pagination dans les paramètres de l'action pour tout obtenir), et le filtrage peut être légèrement différé par rapport à l'affichage Excel. Au-delà de quelques milliers de lignes, migrez vers SharePoint ou Dataverse.
B.5 Relance automatique J+2 (deuxième flux, planifié)
Créez un nouveau flux : + Créer → Flux cloud planifié → nom Relance véhicules en attente.
Déclencheur « Récurrence » : Intervalle = 1, Fréquence = Jour, Heure = 09:00, Fuseau = UTC (Abidjan = UTC+0, donc 09:00 = 09:00 locale). Pour ne tourner que du lundi au vendredi, ajoutez une Condition :
and(greater(dayOfWeek(utcNow()),0), less(dayOfWeek(utcNow()),6))
// dimanche = 0 … samedi = 6 → vrai du lundi (1) au vendredi (5)Action Répertorier les lignes présentes dans un tableau avec le filtre Statut eq 'En attente'.
Appliquer à chacun sur la valeur retournée, puis une Condition « la demande date de plus de 2 jours ». Deux méthodes :
// a) comparaison directe de la date d'échéance calculée par le 1er flux
less(«jeton Date_Relance de la ligne», utcNow())
// b) ou calcul à la volée sur la date de soumission de la ligne
less(addDays(items('Appliquer_à_chacun')?['Date_Soumission'], 2), utcNow())Si oui : Envoyer un e-mail (V2) de relance. Récupérez les valeurs de la ligne en cours de boucle : items('Appliquer_à_chacun')?['Nom_Demandeur'], items('Appliquer_à_chacun')?['Destination']… (Dans la boucle elle-même, item()?['Colonne'] suffit ; items('Nom de la boucle') fonctionne partout, même imbriqué.)
Évitez les relances en double : après l'envoi, faites une action Mettre à jour une ligne pour passer un champ Relance_Envoyee à Oui (clé = ID_Demande), et filtrez Relance_Envoyee ne 'Oui'.
Variante « datée » plus simple : faites remplir par le premier flux une colonne Date_Relance = addDays(utcNow(),2), puis filtrez directement dans le flux planifié : Date_Relance eq '@{formatDateTime(utcNow(),'yyyy-MM-dd')}' — plus besoin de boucle ni de calcul.
B.6 Aller plus loin avec Excel : exécuter un script Office
Le connecteur Excel Online (Business) propose aussi l'action Exécuter le script : elle lance un Office Script (TypeScript) enregistré dans le classeur. C'est la manière propre de faire ce qu'une formule ou une expression ne permettent pas.
Ouvrez le classeur dans Excel pour le web → onglet Automatiser → Nouveau script → nommez-le MiseEnForme → collez le code ci-dessous → Enregistrer.
// Office Script : met en évidence la dernière ligne ajoutée au tableau
function main(workbook: ExcelScript.Workbook) {
const table = workbook.getTable("DemandesVehicules");
const nb = table.getRowCount();
const derniere = table.getRangeBetweenHeaderAndTotal().getRow(nb - 1);
derniere.getFormat().setFillColor("#FEF3C7"); // fond ambre
table.getRangeBetweenHeaderAndTotal().getFormat().setColumnWidth(140);
}Dans le flux : Excel Online (Business) → action Exécuter le script → Fichier = votre classeur, Script = MiseEnForme. Placez-la juste après « Ajouter une ligne ».
Autres scripts utiles : appliquer une couleur selon l'urgence, ajuster/figer les colonnes, calculer un vrai numéro séquentiel, protéger la feuille, générer un récapitulatif quotidien, exporter un PDF.
Conditions d'emploi : le classeur doit rester sur OneDrive/SharePoint, l'action n'existe que là où Office Scripts est disponible, et chaque appel consomme du temps de flux. Le format .xlsm est également accepté par cette action.
B.7 Fermer la boucle : rafraîchir Power BI à chaque demande
Dans Power BI Desktop : Accueil → Obtenir des données → Excel (ou OneDrive / Web) → sélectionnez REGISTRE_VEHICULES_AUTO.xlsx → chargez la table DemandesVehicules.
Publiez le rapport dans un espace de travail, puis Paramètres du jeu de données → Actualisation planifiée (2 fois par jour suffisent souvent). C'est la voie la plus robuste. (Rappel : cette étape est l'Exercice 02 de ce parcours.)
Pour une actualisation à la demande, juste après l'écriture Excel, ajoutez dans le flux l'action Power BI → Actualiser un jeu de données (Espace de travail + Jeu de données + notification d'échec). Cette action dépend de votre licence Power BI (Pro/Premium pour le propriétaire du jeu de données).
Mesures DAX prêtes à coller sur ce registre :
Demandes = COUNTROWS(DemandesVehicules)
EnAttente = CALCULATE([Demandes], DemandesVehicules[Statut] = "En attente")
Critiques = CALCULATE([Demandes], DemandesVehicules[Urgence] = "Critique")
TauxOK = DIVIDE(CALCULATE([Demandes], DemandesVehicules[Statut] = "Approuvé"), [Demandes])
DelaiMoyen = AVERAGEX(DemandesVehicules,
DATEDIFF(DemandesVehicules[Date_Soumission],
DemandesVehicules[Date_Mission], HOUR))Vous venez de fermer la boucle complète : Forms (saisie, même depuis un QR code) → Power Automate (contrôle, écriture, notification, approbation) → Excel (source de vérité) → Power BI (pilotage) → Teams / e-mail (restitution). C'est une architecture d'entreprise réalisée avec des outils gratuits.
B.8 Rendre le flux incassable : portée + « configurer l'exécution après »
Portée (Scope) : + Nouvelle étape → catégorie Contrôle → Portée. Glissez-y (clic-glisser) les actions 4.3 → 4.6. Vous obtenez un bloc qui réussit ou échoue « en un seul point ».
Branche de secours : ajoutez une seconde Portée nommée Gestion d'erreur, puis sur sa première action → menu ⋯ → Configurer l'exécution après → cochez a échoué, a été ignoré et expiré (décochez « a réussi »).
Dans cette branche : un Envoyer un e-mail (ou Teams) d'alerte, l'expression result('Portée') pour détailler les erreurs, puis l'action Arrêter (Terminate) en statut Échec pour que l'exécution reste visible en rouge dans le tableau de bord.
Stratégie de nouvelle tentative : sur l'action Excel → Paramètres → Stratégie de nouvelle tentative → 4 essais, intervalle fixe 20 s. Indispensable quand OneDrive répond lentement (pannes temporaires très fréquentes).
Résultat : plus de demandes « perdues en silence ». Chaque échec produit une alerte lisible et l'historique conserve la trace complète (entrées/sorties JSON de chaque carte) — la base de tout audit.
B.9 Passer de l'exercice à la production : 8 bonnes pratiques
| Pratique | Pourquoi |
|---|---|
| Nommer chaque carte (1. Lire la réponse, 2. Écrire dans Excel…) | Historique lisible, expressions outputs('…') compréhensibles, reprise possible par un collègue |
| Tout dans le même compte (formulaire + classeur + flux) | Évite l'immense majorité des erreurs « fichier introuvable » et « formulaire non listé » |
| Colonnes sans accents ni espaces (ID_Demande) | Le nom de colonne devient une clé technique dans l'API Excel : il doit être stable |
| Un flux = un objectif | 5 flux clairs de 6 actions valent mieux qu'un flux de 40 actions impossible à dépanner |
| Solutions + références de connexion (mode pro) | Transportez vos flux d'un environnement à l'autre sans reconfigurer adresses et comptes |
| Documenter (notes de carte, Composer « documentation ») | Vous comprendrez encore votre flux dans six mois — et quelqu'un d'autre aussi |
| Surveiller les échecs (analytique des flux, alerte d'échec) | Un flux qui échoue sans alerte est plus dangereux qu'une tâche manuelle oubliée |
| Vérifier les quotas et licences (Paramètres → Afficher mes licences) | La licence gratuite est plafonnée (≈ 750 exécutions/mois selon les conditions en vigueur) ; au-delà, prévoyez une licence adaptée |
Décliner la méthode : demande de fournitures, réservation de salle, note de frais, fiche d'incident informatique, suivi de marchés, collecte de rapports terrain, signalement d'incident environnemental… Chaque fois le même squelette : Forms → contrôle → Excel/SharePoint → notification → tableau de bord.
Consulter l'exercice et collecter des données sans connexion
📚 Selon les besoinsLa vérité d'abord : Microsoft Forms et Power Automate sont des services cloud — ils ne fonctionnent pas sans Internet, quelles que soient vos licences. « Mode hors-ligne » signifie donc ici deux choses concrètes : (1) pouvoir consulter ces exercices sans connexion, et (2) continuer à collecter des demandes avec une application locale, puis rejoindre le registre en ligne au retour du réseau.
👉 Pour les alternatives natives de Microsoft 365 (Power Apps mobile, application Microsoft Lists, Excel mobile, Outlook hors ligne) et pour brancher cette collecte hors-ligne directement dans Power Automate, voir l'Annexe E — Hors-ligne dans Microsoft 365.
C.1 Ce qui marche hors ligne et ce qui ne marche pas
| Besoin | Hors ligne ? | Solution |
|---|---|---|
| Consulter ces 3 exercices (cette page incluse) | ✅ Oui | Visitez la page une fois en ligne : le service worker la garde en cache. Ou enregistrez le fichier (Ctrl+S) — chaque page est autonome (aucun CDN). |
| Saisir et enregistrer une demande de véhicule | ✅ Oui | Application hors-ligne (voir C.2) : formulaire, registre, récépissé. |
| Suivre, valider, affecter un véhicule, éditer des statistiques | ✅ Oui | Registre intégré de l'application hors-ligne (statut, véhicule, indicateurs). |
| Exporter vers Excel / Power BI | ✅ Oui | Export CSV, copier-coller, sauvegarde JSON — puis import au retour du réseau. |
| Imprimer un formulaire ou un récépissé | ✅ Oui | Formulaire papier et récépissé imprimables intégrés. |
| Microsoft Forms (créer un formulaire, recevoir des réponses) | ❌ Non | Service cloud : forms.office.com exige une connexion. |
| Power Automate (créer ou exécuter un flux) | ❌ Non | Le déclencheur lui-même est hébergé dans le cloud. |
| Excel Online / OneDrive (le registre partagé) | ❌ Non | Cloud — mais Excel Desktop fonctionne hors ligne et se resynchronise ensuite. |
| Envoi automatique de l'e-mail de confirmation | ❌ Non | Outlook Desktop peut préparer les messages hors ligne ; l'envoi part au retour du réseau. |
| Power BI Desktop (modélisation, rendu du rapport) | ✅ Oui | Le document local s'ouvre hors ligne ; seule l'actualisation des données demande le réseau. |
| Power Automate Desktop (automatisation du poste) | ⚠️ Partiel | Automatise des tâches locales, mais la licence et les flux sont vérifiés en ligne régulièrement. |
C.2 L'application hors-ligne : formulaire, registre, export Excel
Une application autonome (un seul fichier, sans compte, sans connexion) qui reproduit l'essentiel du pipeline : formulaire Q1→Q8, registre local modifiable, indicateurs, export CSV/Excel, récépissé imprimable et formulaire papier.
Ouvrez l'application (bouton ci-dessus). Elle fonctionne aussi depuis une clé USB : un seul fichier HORS_LIGNE_VEHICULE.html à double-cliquer, aucun serveur, aucune installation.
Saisissez les demandes dans l'onglet « Nouvelle demande » : les champs obligatoires sont contrôlés et la date par défaut est proposée (J+1). À la validation, l'application calcule l'ID (VEH-AAAAMMJJ-hhmmss), la priorité, l'échéance et le domaine e-mail — exactement les recettes de l'Annexe A.4.
Travaillez le registre dans le 2ᵉ onglet : recherche, filtres par statut et par urgence, changement de statut (En attente / Approuvé / Refusé), attribution d'un véhicule, suppression d'une ligne et 6 indicateurs en haut de page.
Exportez (3ᵉ onglet) : CSV avec point-virgule et BOM UTF-8 (s'ouvre directement dans Excel, accents compris), copier-coller vers un tableau Excel ouvert, ou sauvegarde JSON (archivage et restauration).
Rejoignez le registre en ligne au retour du réseau : dans Excel Online, Données → À partir d'un texte/CSV → déposez le fichier, puis faites rejoindre la table DemandesVehicules. Les colonnes A→K portent exactement les mêmes noms : aucun retraitement.
Où vont les données ? Nulle part : elles restent dans le stockage local du navigateur, sur votre poste. Aucune requête réseau. Conséquence : elles ne se synchronisent pas entre collègues et disparaissent si l'on vide le cache — exportez le CSV en fin de journée.
C.3 Variante 100 % locale, sans aucun compte Microsoft
Si vous ne pouvez utiliser ni Forms ni Power Automate (pas de compte, pas de connexion, ou contrainte administrative), le même résultat s'obtient uniquement avec des outils de bureau :
| Brique | Rôle | Équivalent en ligne |
|---|---|---|
| Application hors-ligne (cette annexe) | Saisie du formulaire, registre, indicateurs, export | Forms + Power Automate |
| Excel Desktop + tableau structuré DemandesVehicules | Registre officiel, formules, listes déroulantes de validation | Excel Online |
| Power Query (Excel) | Consolider plusieurs CSV, nettoyer accents/casse, fusionner les doublons d'ID | Power Automate (partie transformation) |
| Tableaux croisés dynamiques | Indicateurs : demandes par service, par urgence, délais moyens | Power BI (version simple) |
| Power BI Desktop | Tableau de bord et graphiques (Exercice 02) | Power BI Service |
| Outlook Desktop | Préparer le récépissé à partir du texte copié ; envoi au retour du réseau | Envoyer un e-mail (V2) |
| Power Automate Desktop | Automatiser les tâches du poste : ouvrir Excel, renommer, imprimer, archiver | Flux cloud planifié |
Bonne nouvelle : les Exercices 01 (Excel/TCD) et 02 (Power BI) de ce parcours se font déjà entièrement hors ligne. Cette annexe ne fait que compléter la chaîne avec la collecte des demandes.
C.4 Vérifier que le mode hors-ligne fonctionne (3 tests)
Test visuel : un badge apparaît en bas à gauche de chaque page d'exercice — « 🌐 En ligne — version hors-ligne prête » en vert. S'il reste absent, vérifiez que la page est bien ouverte en https:// (le service worker est refusé en file://) puis rechargez une fois.
Test de cache : F12 → onglet Application (Chrome/Edge) → Service Workers : sw.js doit être activated and is running. Dans Cache Storage, le cache demo-exercices-v1 contient les 5 pages.
Test réel (le seul qui compte) : coupez le Wi-Fi, puis appuyez sur F5. La page doit s'afficher et le badge passer en orange « ✈️ Hors-ligne — consultation possible ». Refaites le test sur les 3 exercices et sur l'application hors-ligne.
Sur téléphone / tablette : ouvrez la page puis, dans le menu du navigateur, Ajouter à l'écran d'accueil. L'icône ouvre l'exercice ou l'application même sans réseau.
Limites du cache : (1) la première visite doit se faire en ligne, sinon il n'y a rien à mettre en cache ; (2) en navigation privée, cache et service worker sont effacés à la fermeture ; (3) si une page est modifiée sur le serveur, la version en ligne gagne toujours dès que le réseau est disponible (stratégie « réseau d'abord ») — aucun risque de contenu figé.
Encore plus simple, sans service worker : chaque page est un fichier autonome (aucun CDN, aucune police externe). Ctrl+S sur une page, et vous obtenez un fichier consultable hors ligne partout, même depuis une clé USB, sans aucun réglage navigateur.
C.5 L'envoi des données : synchronisation automatique au retour du réseau
C'est la brique qui manquait. Saisir hors ligne ne sert à rien si l'information reste prisonnière du poste : voici le mécanisme offline-first complet, tel qu'il est implémenté dans l'application hors-ligne et testé de bout en bout.
Le principe en 4 temps
| Temps | Ce qui se passe |
|---|---|
| 1. Saisie hors ligne | La demande est enregistrée localement avec l'état 🕓 en attente. Le registre reste complet, modifiable et exportable. |
| 2. File d'attente | Le nombre de demandes non transmises est affiché : compteur dans l'onglet Synchronisation, pastille sur chaque ligne du registre, indicateur en haut du registre local. |
| 3. Retour du réseau | L'application détecte la reconnexion (événement du navigateur + sonde de connectivité réelle) et envoie toute la file en une seule requête JSON. |
| 4. Accusé du serveur | Le service répond la liste des identifiants acceptés ; l'application marque ces demandes ✅ envoyé. Ce qui n'a pas été accepté reste en file : rien n'est perdu, et rien n'est envoyé deux fois. |
Ce que fait le service de réception (sync.php sur ce serveur)
| Contrôle | Détail |
|---|---|
| Jeton partagé | Requête rejetée en 403 si le jeton ne correspond pas (envoi comme test de connexion). |
| Contrôle de volume | 256 Ko maximum par envoi, 200 demandes maximum par requête. |
| Nettoyage des champs | Longueurs plafonnées, suppression des caractères de contrôle, normalisation des espaces — aucune donnée brute n'est écrite telle quelle. |
| Anti-doublon | Index persistant des identifiants : une demande déjà reçue est ignorée et signalée comme telle. C'est précisément pour cela que l'identifiant doit être unique : l'application y ajoute un suffixe aléatoire, sinon deux demandes saisies dans la même seconde en auraient perdu une silencieusement. |
| Écriture fiable | Ajout en CSV (les 15 mêmes colonnes, séparateur « ; », BOM UTF-8) avec verrouillage de fichier pour résister aux envois simultanés. |
| Confidentialité | Le fichier est conservé hors de la racine web : il n'est pas téléchargeable depuis Internet (vérifié : réponse 404). |
| Traçabilité | Journal d'audit horodaté : adresse IP, nombre de lignes reçues / acceptées / ignorées, refus. |
| Anti-abus | 60 envois par heure et par adresse IP ; au-delà, réponse 429. |
Mise en route : 2 champs, 2 minutes
Ouvrez l'application hors-ligne et cliquez l'onglet 🔄 Synchronisation. Sans adresse configurée, l'application reste 100 % locale : rien n'est envoyé, vous utilisez l'export CSV.
Adresse du service : tapez sync.php (relatif : fonctionne quand l'application est ouverte depuis le site). Sur une clé USB, saisissez l'adresse complète https://zeinabdigitlab.ddns.net/Demo_Exercices/sync.php.
Jeton partagé : recopiez exactement la valeur de la constante JETON_ATTENDU du fichier sync.php sur le serveur — changez-la avant tout usage réel.
Cochez « Envoyer automatiquement au retour du réseau », cliquez 💾 Enregistrer, puis 🔌 Tester la connexion : le serveur répond le nombre de demandes qu'il détient déjà. C'est prêt.
Récupérer et exploiter les demandes reçues
| Fichier créé sur le serveur | Rôle |
|---|---|
…/vehicules/registre_hors_ligne.csv | Les données — mêmes 15 colonnes que le registre en ligne. S'ouvre en double-clic dans Excel. |
…/vehicules/index_ids.json | Index des identifiants déjà reçus (mécanisme anti-doublon). |
…/vehicules/sync_log.jsonl | Journal d'audit : un enregistrement par envoi (heure UTC, IP, compteurs). |
…/vehicules/limite_ip.json | Compteurs de la limitation anti-abus par adresse IP. |
Récupération : le dossier est hors de la racine web, donc non téléchargeable par navigateur. Copiez-le par SSH — scp -i «votre clé» root@76.13.39.30:/var/www/mg-digitalisation-data/vehicules/registre_hors_ligne.csv . — puis ouvrez-le dans Excel, ou chargez-le dans Power BI, ou fusionnez-le dans la table DemandesVehicules déjà utilisée par l'Exercice 03.
Ce que cette solution ne couvre pas (à savoir avant la production)
| Limite | Conséquence / parade |
|---|---|
| Le jeton n'est pas un secret | Il est visible dans le code de la page : il bloque les envois accidentels, pas un attaquant. En production, préférez un déclencheur HTTP Power Automate (authentifié) ou une authentification par compte. |
| Pas de fusion de modifications concurrentes | Si un même identifiant est modifié à la fois hors ligne et côté serveur, le serveur conserve la première version reçue. Pour un travail à plusieurs rédacteurs, passez à SharePoint ou Dataverse. |
| Les files d'attente sont par poste | Deux agents sur deux ordinateurs = deux files séparées, fusionnées à l'arrivée grâce à l'unicité des identifiants. C'est le comportement attendu, mais cela implique de ne pas saisir deux fois la même demande. |
| Pas de chiffrement applicatif | Le HTTPS protège le transport ; les données sont en clair dans le navigateur et dans le CSV. Sur un poste partagé : exporter puis vider le registre en fin de journée. |
| Pas d'e-mail automatique | Cette brique remplace l'envoi vers Excel, pas les notifications : combinez-la avec l'Annexe B (Teams, approbations) ou un flux Power Automate qui lit le CSV. |
Vérifié en conditions réelles : l'ensemble de cette mécanique (file d'attente, envoi manuel et automatique, anti-doublon, identifiants uniques, pertes de réseau, jeton invalide, service injoignable, reprise après correction) est couvert par 27 tests automatisés sur un vrai navigateur, tous au vert, sans aucune erreur JavaScript. Le service PHP a de son côté été testé directement (envoi, doublon, 403, fichiers écrits, 404 depuis Internet).
Faire passer le pipeline du « ça marche » au « c'est professionnel »
📚 À appliquer par vaguesBonne nouvelle : votre pipeline fonctionne déjà. Il n'y a donc rien à refaire, seulement des choses à ajouter. Chaque amélioration ci-dessous est autonome : vous pouvez n'en appliquer qu'une seule, sans toucher au reste.
D.1 Diagnostic : les 5 limites du pipeline de base
| Limite actuelle | Conséquence concrète sur le terrain | Traitée en |
|---|---|---|
| Un seul destinataire : le demandeur | Le chef de service et la cellule parc auto ignorent la demande tant qu'ils n'ouvrent pas Excel — d'où les retards et les « je n'étais pas au courant ». | D.2 |
| Aucune notification du gestionnaire | Le registre se remplit tout seul, mais personne n'est poussé à agir : le suivi repose sur la vigilance humaine. | D.2 + B.2 |
| Pas de cycle de vie après la demande | L'e-mail promet « réponse sous 24h » alors que rien ne gère l'affectation, le bon de sortie, le retour de mission ni la clôture. | B.3 + D.3 |
| Aucun contrôle d'intégrité | Doublons, adresse e-mail vide, destination fantaisiste : des lignes inexploitables et des confirmations impossibles à envoyer. | 4.9 + B.4 + D.3 |
| Rien ne mesure l'activité | Impossible de justifier le nombre de véhicules, les coûts, les délais ou les services les plus demandeurs. | B.7 + D.3 |
La question à se poser pour chaque amélioration : « Qui a besoin de cette information, à quel moment, par quel canal ? ». C'est exactement l'objet de la partie suivante.
D.2 « Et si l'autre devait aussi recevoir l'e-mail ? » — 5 façons de faire
Tout se joue dans l'action Envoyer un e-mail (V2) : elle possède les champs À, CC et Cci, et chacun accepte plusieurs adresses séparées par un point-virgule. Reste à choisir d'où viennent ces adresses.
| Solution | Comment faire | Quand l'utiliser |
|---|---|---|
| 1. CC fixe le plus rapide | Champ CC : tapez les adresses en dur — moyens.generaux@ministere.ci; parc.auto@ministere.ci | Démarrage immédiat, une ou deux adresses d'unité qui ne changent pas |
| 2. Groupe de distribution recommandé | Créez un groupe Microsoft 365 (ex. Parc Automobile) et mettez cette seule adresse en CC | Plusieurs personnes doivent être informées et elles changent : on gère le groupe, pas le flux |
| 3. Annuaire dans Excel le plus « métier » | Une 2ᵉ table Annuaire (Service → E-mail responsable, E-mail parc) relue par le flux, puis injectée dans le CC | Un valideur différent par service (DAF, DRH, DGE…) et vous voulez tout piloter depuis Excel |
| 4. Basculer (Switch) sur le service | Une action Basculer, un cas par service, qui remplit une variable « Destinataires_CC » | Peu de services (≤ 6) et pas d'annuaire à maintenir |
| 5. Le demandeur désigne son responsable | Question facultative « E-mail de votre responsable » (Q9) injectée en CC | Les responsables tournent souvent, ou le demandeur sait mieux qui informer |
À ne jamais faire : fabriquer une adresse par concaténation — par exemple concat('chef.', «jeton service», '@ministere.ci'). Si la convention de nommage n'est pas respectée à la lettre, l'e-mail part dans le vide sans aucun message d'erreur : le flux reste « vert » alors que personne n'a été prévenu. Utilisez un annuaire, un groupe de distribution ou une question du formulaire.
Qui doit recevoir quoi ? (le tableau à faire valider par votre hiérarchie)
| Destinataire | Ce qu'il doit savoir | Champ | Moment |
|---|---|---|---|
| 👤 Demandeur | Sa demande est prise en compte, avec sa référence et le délai annoncé | À | Soumission |
| 👔 Chef de service | Un agent de son service engage un véhicule (contrôle, visa) | CC | Soumission |
| 🚗 Cellule parc auto | Une demande à traiter, avec tous les éléments pour affecter un véhicule | CC + Teams | Soumission |
| 🗄️ Secrétariat / archives | Copie pour classement, sans encombrer la conversation | Cci | Soumission |
| 🧑✈️ Chauffeur assigné | Sa mission : heure, prise en charge, destination, passagers | À (autre e-mail) | À l'affectation, pas à la soumission |
| 💰 DAF / contrôle de gestion | Volumes, coûts et délais (vue agrégée, pas demande par demande) | Rapport | Hebdomadaire ou mensuel (axe 5) |
Deux règles d'or : ① 2 destinataires maximum en « À », tout le reste en CC ou Cci ; ② on n'informe pas tout le monde au même moment — le chauffeur n'a que faire d'une demande non encore affectée, et 60 e-mails à tout le ministère pour une voiture, c'est le meilleur moyen de faire classer votre flux en indésirable.
D.2+ Mode opératoire : le CC « responsable du service » via un annuaire Excel
C'est la variante la plus utile en administration : chaque direction a son propre valideur. Comptez 20 minutes, sans rien casser de ce qui existe.
Dans le même classeur, ajoutez une 2ᵉ feuille Annuaire avec 3 colonnes : Service, Email_Responsable, Email_Parc. Une ligne par service (DAF, DRH, DEEE, DGE, DTM, Direction). Convertissez la plage en tableau structuré (Insertion → Tableau) et nommez-le Annuaire — exactement la méthode de l'Étape 3.
Dans le flux, après « Obtenir les détails de la réponse » (4.3) : + Nouvelle étape → Excel Online (Business) → action Obtenir une ligne (Get a row).
Fichier : le même classeur · Tableau : Annuaire · Colonne clé : Service · Valeur de clé : le jeton ⚡ Réponse à Q2 — Votre service. (« Obtenir une ligne » exige une clé unique : ici chaque service n'apparaît qu'une fois, c'est parfait. Si votre annuaire contient plusieurs lignes par service, utilisez plutôt « Répertorier les lignes présentes dans un tableau » avec le filtre Service eq '@{«jeton Q2»}'.)
Renommez l'action 3. Annuaire du service : elle expose aussitôt 2 nouveaux jetons ⚡, Email_Responsable et Email_Parc.
Dans l'action e-mail : À = jeton Q8 (le demandeur) ; CC = les deux nouveaux jetons. Comme un annuaire contient parfois une case vide, construisez le CC « propre » via l'onglet Expression (fx) :
// CC robuste : le séparateur n'est ajouté que si l'adresse existe
concat(
if(empty(«Email_Responsable»), '', concat(«Email_Responsable», ';')),
if(empty(«Email_Parc»), '', «Email_Parc»)
)Cci (facultatif) : une boîte d'archivage, par exemple vehicules-archives@ministere.ci. Elle sert de preuve d'envoi et conserve la trace même si le demandeur supprime le message.
Testez avec 2 services différents — dont un avec une case vide — et vérifiez dans l'historique que le CC ne contient ni ;; ni adresse fantôme. Terminez par la démonstration inverse : ouvrez la boîte du chef de service, la copie doit être là.
Variante sans annuaire : s'il n'y a que 2 ou 3 destinataires stables, utilisez directement la solution 1 (CC fixe) ou la solution 2 (groupe de distribution). Moins élégant, aussi efficace — et 20 minutes de gagnées. On n'ajoute l'annuaire que lorsqu'il existe réellement un valideur par service.
Bonus : regrouper toute la conversation. Placez une référence stable dans l'objet — concat('[', «ID du Composer», '] Demande véhicule — ', «jeton destination») → [VEH-20260912-084612] Demande véhicule — Abidjan Plateau. Accusé de réception, approbation, affectation, retour de mission : tous les messages se regroupent en une seule conversation dans Outlook, et une recherche sur l'ID retrouve l'historique complet.
D.3 6 autres axes d'amélioration (au-delà de l'e-mail)
Classés par thème. La colonne « effort » indique le temps de mise en œuvre — vous pouvez piocher uniquement ce qui vous rapporte le plus.
Axe 1 — Le formulaire (avant même le flux)
| Amélioration | Pourquoi | Effort |
|---|---|---|
| Ajouter matricule, téléphone, lieu de prise en charge, heure de retour prévue | Le parc affecte plus vite et le chauffeur sait où aller : ce sont de toute façon les questions posées par téléphone | 10 min |
| Ajouter « Avec chauffeur » (Oui/Non) et « Véhicule souhaité » | Toutes les demandes n'ont pas besoin d'un chauffeur : évite les allers-retours | 5 min |
| Transformer « Destination » en liste (destinations fréquentes + « Autre ») | Fini les « Abidjan », « abj plateau », « Plateau Abidjan » qui rendent les statistiques inutilisables | 10 min |
| Branchement conditionnel (sections Forms) | Si « Avec chauffeur = Non », on masque les questions inutiles : formulaire plus court, mieux rempli | 15 min |
| Message de confirmation personnalisé dans Forms | Rassure immédiatement le demandeur et annonce le délai (« vous recevrez un e-mail… ») | 2 min |
| Tester depuis un téléphone (QR code) et remplir 3 vraies demandes | La moitié des surprises d'ergonomie se découvrent sur mobile | 10 min |
Règle d'or du formulaire : chaque question ajoutée doit avoir un usage automatique (une colonne, une règle, un e-mail) — sinon elle sera mal remplie. Les questions « pour information » finissent vides.
Axe 2 — Intégrité et fiabilité des données
| Amélioration | Pourquoi | Effort |
|---|---|---|
| Anti-doublon avant écriture (B.4) | Un double clic ou un rafraîchissement ne crée pas deux lignes | 20 min |
| Contrôle de l'adresse e-mail : si elle est vide → alerte au parc au lieu de la confirmation | Évite l'e-mail « envoyé à personne » — le pire des cas, car il passe totalement inaperçu | 10 min |
| Colonne Source (Web / QR / papier saisi) | Savoir d'où viennent réellement les demandes, et si le QR code est utilisé | 5 min |
Colonne Version_Flux (ex. v2.1) | Savoir quelle règle a produit quelle ligne, et comparer avant/après une évolution | 5 min |
| Stratégie de nouvelle tentative sur l'action Excel (4 essais, 20 s) | Absorbe les micro-coupures d'OneDrive, très fréquentes (B.8) | 2 min |
| Écrire l'heure UTC et l'heure locale d'Abidjan | Les tris et les calculs restent justes même si le fuseau du serveur change | 5 min |
Axe 3 — Tenir les engagements de délai (« réponse sous 24h »)
| Amélioration | Pourquoi | Effort |
|---|---|---|
| Échéance calculée dès la soumission (recette A.4 : +4 h si Critique, sinon +24 h) | Rend l'engagement vérifiable et permet la relance automatique | 10 min |
| Relance automatique J+2 (B.5) | Aucune demande ne reste « en attente » sans suite | 30 min |
Alerte « non affecté 4 h avant la mission » : flux planifié horaire, filtre Statut eq 'En attente' puis comparaison de Date_Mission | Évite le pire scénario : le véhicule manque le jour du déplacement | 30 min |
| Escalade immédiate si Critique (B.1 + B.2) | Cohérent avec le niveau d'urgence déclaré par le demandeur | 20 min |
| Colonne Delai_Traitement_H, renseignée à l'affectation | Alimente votre engagement de qualité et le pilotage (axe 5) | 10 min |
| Aligner le texte du formulaire sur le délai réellement tenu | Un SLA annoncé et non tenu décrédibilise tout le dispositif | 2 min |
Axe 4 — Le cycle de vie complet (le plus gros gain)
Aujourd'hui le flux s'arrête à la confirmation : il couvre 20 % du processus. Voici les 6 étapes qui manquent.
| Étape du cycle | Mise en œuvre | Effort |
|---|---|---|
| 1. Approbation par le chef de service | Action « Démarrer et attendre une approbation » (B.3), décision écrite et horodatée | 30 min |
| 2. Affectation du véhicule | « Mettre à jour une ligne » (clé = ID_Demande) + e-mail au demandeur : n° de véhicule, chauffeur, heure de prise en charge | 20 min |
| 3. Bon de sortie PDF numéroté | Word Online (Business) → Remplir un modèle puis Convertir un fichier en PDF → joint à l'e-mail. Le modèle Word contient des contrôles de contenu nommés, que l'action remplit par leur nom. | 45 min |
| 4. Briefing du chauffeur | E-mail (ou SMS) à son adresse avec heure, lieu de prise en charge, destination, passagers | 15 min |
| 5. Retour de mission | Petit formulaire Forms (km parcourus, carburant, remarques, incident) → colonnes supplémentaires ou 2ᵉ table | 30 min |
| 6. Clôture et coût | Statut « Terminée », calcul du coût (km × tarif), archivage du bon | 20 min |
Effet levier : avec l'étape 3, le demandeur ne reçoit plus un simple accusé de réception mais un bon de sortie PDF numéroté, prêt à présenter au poste de garde. C'est ce détail qui fait basculer un exercice de démonstration en véritable application de gestion du parc.
Axe 5 — Pilotage : transformer les lignes en décisions
| Amélioration | Pourquoi | Effort |
|---|---|---|
| Power BI sur le registre (B.7) : demandes/mois, taux d'approbation, délai moyen, top destinations | Répond en un clic à « combien de véhicules nous faut-il ? » | 1 h |
| Taux d'utilisation par véhicule (jours de mission / jours ouvrés) | Identifie les véhicules sous-utilisés et ceux sur-sollicités | 30 min |
| Rapport hebdomadaire automatique à la direction : flux planifié + action Créer un tableau HTML (connecteur Données) + e-mail | La direction est informée sans que personne ne rédige de note | 45 min |
| Coût par service (km × tarif) et coût moyen par mission | Argumente le budget carburant/entretien avec des chiffres | 30 min |
| Tableau des refus et de leurs motifs | Révèle les demandes hors périmètre (utile pour former les services) | 20 min |
| Export mensuel archivé (Excel + PDF figé) | Traçabilité comptable et audit | 20 min |
Axe 6 — Gouvernance, sécurité, coûts
| Amélioration | Pourquoi | Effort |
|---|---|---|
| Aucune adresse en dur : table Parametres ou variables d'environnement (mode solution) | Changer un destinataire ne doit pas obliger à ouvrir et republier le flux | 30 min |
| Permissions du classeur : le flux écrit, les humains lisent | Fin des fausses lignes et des formules écrasées : la donnée devient fiable | 15 min |
| Protéger la feuille et les colonnes calculées | Évite qu'un utilisateur casse une formule ou renomme un tableau | 10 min |
| Minimisation des données : ne collecter que le nécessaire, avec une information dans le formulaire | Conformité (données personnelles) et confiance des agents | 20 min |
| Documenter et sauvegarder : notes de carte, export du flux, export de l'environnement | Vous pouvez reconstruire en cas d'erreur, et un collègue peut reprendre le dossier | 30 min |
| Anticiper les limites d'Excel : au-delà de ~5 000 à 10 000 lignes ou de plusieurs rédacteurs → SharePoint ou Dataverse | Excel n'est pas une base de données : concurrence, verrous, performances | selon projet |
Le bon réflexe : chaque amélioration doit répondre à un problème constaté, jamais à une envie technique. Commencez par mesurer (axe 5) : vous saurez alors précisément quoi améliorer en premier.
D.4 Le pipeline « version 2 » et l'ordre de mise en œuvre
Voici la cible. Chaque maillon correspond à une amélioration déjà décrite dans cette annexe ou dans les annexes A, B et C — aucun n'invente un nouvel outil.
Ordre de mise en œuvre recommandé (3 vagues)
| Vague | Travaux | Temps total |
|---|---|---|
| Vague 1 effet immédiat | ① CC fixe ou groupe de distribution pour le chef de service et le parc (D.2) · ② anti-doublon (B.4) · ③ colonne Source · ④ stratégie de nouvelle tentative (B.8) | ≈ 40 min |
| Vague 2 le cœur métier | ⑤ annuaire Service → responsable (D.2+) · ⑥ contrôle de l'adresse e-mail · ⑦ alerte Teams si Critique (B.2) · ⑧ relance J+2 (B.5) | ≈ 1 h 30 |
| Vague 3 le cycle complet | ⑨ approbation (B.3) · ⑩ affectation + e-mail de mission au chauffeur · ⑪ bon de sortie PDF · ⑫ tableau de bord Power BI (B.7) · ⑬ rapport hebdomadaire automatique | ≈ 3 h |
Conseil de conduite : livrez la vague 1 aujourd'hui même, faites-la valider sur 5 demandes réelles, puis passez à la vague 2. Chaque vague est démontrable en réunion — c'est ainsi qu'un projet d'automatisation obtient les moyens de continuer.
D.5 Les 7 anti-patterns à éviter
| Anti-pattern | Conséquence observée | À faire plutôt |
|---|---|---|
Fabriquer des adresses par concat() | E-mail perdu en silence, flux « vert » trompeur | Annuaire, groupe de distribution ou question du formulaire (D.2) |
| Tout le monde en « À » | Personne ne se sent responsable, et votre flux finit en courrier indésirable | 2 destinataires maximum en À, le reste en CC ou Cci |
| Le chauffeur prévenu dès la soumission | Il reçoit une mission non encore affectée, puis un second message : confusion | L'informer à l'affectation uniquement (axe 4, étape 4) |
| Adresses et noms en dur dans six actions | Chaque changement d'organigramme impose d'ouvrir et republier le flux | Table Parametres ou variables d'environnement (axe 6) |
| Boucler sur « Répertorier les lignes » avec une action Excel par tour | Lent, gourmand en requêtes, échoue sur de gros volumes | Filtrer en une seule requête (OData), puis traiter l'ensemble |
| Un seul flux de 40 actions | Impossible à tester et à dépanner | Un flux = un objectif ; découper en flux enfant ou planifié |
| Excel utilisé comme base de données pour des milliers de lignes et plusieurs rédacteurs | Conflits d'écriture, lenteurs, lignes perdues | SharePoint List ou Dataverse dès que le volume grandit |
Un dernier mot : l'amélioration la plus rentable n'est presque jamais technique. C'est de se mettre d'accord sur qui doit être informé, de quoi, quand et par quel canal. Faites valider le tableau « Qui doit recevoir quoi ? » (D.2) par votre hiérarchie : tout le reste en découle naturellement.
Ce qui fonctionne hors connexion dans la suite Microsoft, et comment collecter quand même
📚 Référence · selon votre licenceLa réponse directe à la question : Microsoft Forms n'a pas de mode hors-ligne, et il n'y en aura pas — le formulaire est une page web servie par forms.office.com, et les réponses sont centralisées dans le cloud. Idem pour Power Automate : le déclencheur vit dans le cloud. En revanche, Microsoft propose bel et bien des outils de collecte hors ligne — c'est l'objet de cette annexe — et l'on peut faire converger une saisie hors ligne vers Power Automate, Excel, Teams et Outlook (E.5).
E.1 Qui est hors ligne et qui ne l'est pas, dans la suite Microsoft
| Composant | Hors ligne ? | Ce que cela donne en pratique |
|---|---|---|
| Microsoft Forms — répondre à un formulaire | ❌ Non | La page est servie par forms.office.com : sans connexion, elle ne s'ouvre pas. Aucun cache hors ligne n'est prévu par Microsoft. |
| Microsoft Forms — créer ou modifier | ❌ Non | Même service cloud. Un formulaire déjà ouvert peut rester affiché, mais l'envoi échouera. |
| Power Automate — flux cloud | ❌ Non | Le déclencheur et les actions s'exécutent dans le cloud : sans réseau, rien ne se déclenche et rien ne part. |
| Power Automate Desktop | ⚠️ Partiel | Le robot agit sur votre poste, mais les flux, la licence et les données vivent dans le cloud : pas de collecte autonome hors ligne. |
| Excel (application de bureau) | ✅ Oui | Aucune restriction : c'est votre exercice 01, entièrement hors ligne. |
| Excel (mobile / tablette) | ✅ Oui | Édition hors ligne, synchronisation OneDrive à la reconnexion (conflits gérés par la co-édition). |
| Word / PowerPoint | ✅ Oui | Bureau et mobile : création et modification hors ligne, synchronisation ensuite. |
| Outlook (bureau et mobile) | ⚠️ Partiel | Lecture et rédaction hors ligne ; les messages partent au retour du réseau — c'est déjà une forme de collecte différée (voir E.2, voie 4). |
| OneDrive | ✅ Oui | Fichiers marqués « Toujours conserver sur cet appareil » : accessibles et modifiables hors connexion. |
| Teams | ❌ Non | Messages, canaux et fichiers indisponibles hors connexion (hors notifications déjà reçues). |
| SharePoint / Lists (navigateur) | ❌ Non | Version web uniquement : pas de cache local. |
| Microsoft Lists (application mobile) | ✅ Oui | La liste est mise en cache sur le téléphone : consultation et modification hors connexion, remontée des changements à la reconnexion. |
| Power Apps (application mobile) | ✅ Oui — c'est LA réponse Microsoft | Application de saisie sans code, avec stockage local et envoi au retour du réseau. Fonctionne aussi avec un profil hors connexion Dataverse. |
| Dataverse | ✅ Oui (profil hors connexion) | Configuration côté plateforme : les enregistrements sont téléchargés puis resynchronisés. |
| Power BI Desktop | ✅ Oui | Modélisation et rapports hors ligne ; seule l'actualisation des données demande le réseau. |
| Power BI Service / Copilot | ❌ Non | Services en ligne uniquement. |
À retenir : dans Microsoft 365, le poste de travail sait travailler hors ligne (Excel, Word, OneDrive, Outlook) ; c'est la partie « formulaire + automatisation » qui ne le sait pas. La parade Microsoft s'appelle Power Apps mobile.
E.2 Les 4 voies Microsoft pour collecter des données hors ligne
| Voie | Comment ça fonctionne | Licence | Effort |
|---|---|---|---|
| 1. Power Apps (application mobile) La voie native |
Vous construisez une application de saisie sans code (les 8 questions deviennent des champs). À la validation, la demande est stockée dans l'appareil (SaveData()) puis affichée dans une « file d'attente ». Un bouton Envoyer appelle le flux Power Automate quand le réseau est là (LoadData() + envoi), ou vous laissez Dataverse resynchroniser tout seul via un profil hors connexion. |
Power Apps inclus dans Microsoft 365 pour les connecteurs standard (SharePoint, Excel, Outlook) ; licence premium pour Dataverse ou les connecteurs premium. Inclus dans un essai de 30 jours. | 1 à 2 h |
| 2. Microsoft Lists (application mobile) |
Vous créez la liste DemandesVehicules dans SharePoint (colonnes identiques à votre registre). Sur téléphone, l'application Lists met la liste en cache : vous saisissez hors connexion, les modifications remontent à la reconnexion. Les automatisations restent assurées par Power Automate, déclenché par l'ajout d'un élément. |
Inclus dans Microsoft 365 (SharePoint). | 30 min |
| 3. Excel mobile + OneDrive (le plus simple) |
Un classeur partagé sur OneDrive avec un onglet de saisie et votre tableau DemandesVehicules. Chacun modifie hors ligne, OneDrive synchronise à la reconnexion (co-édition). Moins de contrôle de saisie qu'un formulaire, mais aucun développement. |
Inclus dans Microsoft 365 (ou compte gratuit : version limitée). | 10 min |
| 4. Outlook hors ligne (l'astuce gratuite) |
Vous préparez un modèle d'e-mail structuré (Nom / Service / Destination / Date / Passagers / Urgence / E-mail). L'agent le remplit hors ligne ; le message part au retour du réseau. Un flux Power Automate « Quand un nouvel e-mail arrive » lit le corps du message, en extrait les champs et écrit la ligne dans Excel, puis confirme au demandeur. | Inclus (Outlook + Power Automate standard). | 1 h |
Si vous ne devez en retenir qu'une : la voie 1 (Power Apps mobile) est l'équivalent Microsoft officiel de ce que nous avons construit ici — formulaire, file d'attente locale, envoi automatique, base de données Dataverse. C'est aussi, et de loin, la plus industrialisable (gestion des rôles, historique, mode hors ligne administré).
Ce que vous perdez dans les voies 1 et 2 : la simplicité d'un formulaire Forms. Un formulaire Forms se crée en 15 minutes sans compétence technique ; une application Power Apps demande de penser les écrans, les collections et l'envoi. Ne basculez que si le besoin hors ligne est réellement permanent.
E.3 Comparatif : quelle voie pour quel besoin ?
| Critère | Forms + Power Automate (notre exercice) |
Power Apps mobile | Lists mobile | Excel mobile |
|---|---|---|---|---|
| Hors ligne | ❌ Non | ✅ File locale + envoi auto | ✅ Cache + synchronisation | ✅ Synchronisation OneDrive |
| Effort | 1 h | 1 à 2 h | 30 min | 10 min |
| Compétence | Aucune | Logique d'application (sans code) | Aucune | Aucune |
| Contrôle de saisie | ✅ Fort (champs obligatoires, listes) | ✅ Très fort (règles, messages) | ⚠️ Moyen (colonnes typées) | ❌ Faible |
| QR code mobile | ✅ Natif dans Forms | ➖ Lien vers l'application | ➖ Lien vers la liste | ➖ Lien vers le classeur |
| E-mail automatique | ✅ | ✅ Via un flux | ✅ Via un flux | ⚠️ Via un flux |
| Utilisateurs simultanés | ⚠️ Limité par Excel | ✅ Dataverse | ✅ SharePoint | ⚠️ Conflits de co-édition |
| Pilotage / Power BI | ✅ | ✅ | ✅ | ✅ |
| Ce qu'on y gagne | La simplicité et la rapidité | Le hors ligne robuste et industrialisable | L'intégration SharePoint immédiate | La mise en œuvre en 10 minutes |
Comment choisir : besoin hors ligne occasionnel (coupures, déplacements ponctuels) → gardez Forms + Power Automate et ajoutez la collecte de secours (Annexe C). Besoin hors ligne structurel (agents de terrain, zones blanches permanentes) → Power Apps mobile. Besoin d'un registre partagé modifiable par plusieurs personnes → Lists.
E.4 La voie hybride : notre collecte hors ligne branchée sur Microsoft
C'est la réponse la plus pragmatique à votre question : on ne rend pas Forms hors ligne, on fait converger la saisie hors ligne vers Power Automate. Le terrain garde un outil qui fonctionne partout ; tout le reste vit dans Microsoft 365.
| Variante de convergence | Comment | Quand |
|---|---|---|
| 1. Requête HTTP directe la plus aboutie | L'application envoie sa file d'attente vers un déclencheur HTTP Power Automate, qui écrit dans Excel Online, envoie les e-mails, notifie Teams et déclenche l'approbation. Recette complète en E.5. | Dès qu'une connexion, même brève, est disponible |
| 2. Import du CSV | On exporte le CSV depuis l'application et on l'importe dans la table DemandesVehicules (Annexe C.2). Aucun développement. | Une fois par jour, au retour au bureau |
| 3. E-mail structuré | Une demande = un e-mail rempli hors ligne dans Outlook, parti au retour du réseau ; un flux « Quand un nouvel e-mail arrive » l'analyse et écrit la ligne. (Voie 4 de E.2.) | Quand on ne dispose que d'Outlook |
Ce que cette hybridation apporte : vous conservez la simplicité d'un formulaire côté terrain et vous récupérez tout l'écosystème Microsoft : lignes dans Excel Online, e-mails automatiques (avec le CC du responsable de l'Annexe D.2), alertes Teams, circuit d'approbation, tableau de bord Power BI, traçabilité et sauvegardes — sans administrer vous-même un serveur.
E.5 Recette : recevoir la file d'attente hors ligne dans Power Automate
Objectif : quand le réseau revient, les demandes saisies hors ligne arrivent dans Excel Online, les e-mails partent, Teams est notifié — le tout sans écrire une ligne de code. Comptez 30 minutes.
Sur make.powerautomate.com : + Créer → Flux cloud instantané → nom : Réception des demandes hors ligne → déclencheur « Lorsqu'une requête HTTP est reçue » (When an HTTP request is received) → Créer.
Dans la carte du déclencheur, cliquez Utiliser l'exemple de charge utile pour générer le schéma et collez exactement le JSON ci-dessous (c'est ce que l'application envoie) :
{
"jeton": "NDRI-VEHICULES-2026",
"demandes": [
{
"id": "VEH-20260913-205401-fdff",
"ts": "2026-09-13 20:54:01",
"nom": "Kouassi Ama",
"service": "DAF",
"dateMission": "2026-09-20 08:30",
"destination": "Anyama — Ébène",
"passagers": 3,
"motif": "Terrain/Inspection",
"urgence": "Critique",
"statut": "En attente",
"vehicule": "",
"email": "kouassi.ama@ministere.ci",
"priorite": 1,
"echeance": "2026-09-14 00:54",
"domaine": "ministere.ci"
}
]
}+ Nouvelle étape → Appliquer à chacun (Apply to each) → champ : demandes (proposé dans le contenu dynamique du déclencheur). Toute la suite se place dans la boucle.
Dans la boucle : Excel Online (Business) → Ajouter une ligne dans un tableau → même classeur et même tableau que l'Étape 3. Chaque champ reçoit le jeton correspondant de l'élément courant : id → ID_Demande, nom → Nom_Demandeur, priorite → Priorite, etc.
Dans la même boucle : Envoyer un e-mail (V2) → À = email, Objet et Corps = le modèle de la sous-étape 4.6. Ajoutez le CC du responsable de service (Annexe D.2).
(Facultatif) Condition sur urgence = « Critique » → Publier un message dans un canal Teams (Annexe B.2). Et si vous voulez l'approbation : « Démarrer et attendre une approbation » puis « Mettre à jour une ligne » (Annexe B.3).
Après la boucle, ajoutez l'action Réponse (Response) du connecteur Requête → corps : { "ok": true }. C'est cet accusé qui fait passer les demandes à ✅ envoyé dans l'application.
Enregistrer : l'URL du déclencheur apparaît dans la première carte (elle contient une signature ?sig=…). Copiez-la.
Dans l'application hors-ligne → onglet 🔄 Synchronisation → collez cette URL dans Adresse du service, videz le champ Jeton (le flux n'en a pas besoin), cochez l'envoi automatique, 💾 Enregistrer puis 🔌 Tester la connexion.
Sécurité : l'URL du déclencheur est un secret (elle porte une signature) — ne la publiez pas, et régénérez-la si elle fuite. Ce déclencheur n'a pas d'authentification Azure AD native : pour durcir, ajoutez une Condition qui compare le champ jeton à la valeur attendue, et si elle échoue, répondez 403 avec l'action Réponse + Arrêter (statut Échec). Pour aller plus loin : passerelle API Management ou connecteur personnalisé.
Test de bout en bout : coupez le Wi-Fi, saisissez 2 demandes (elles restent 🕓 en attente), rebranchez le réseau. En moins d'une minute : le flux s'exécute, Excel se remplit, les e-mails partent et les deux pastilles passent à ✅ envoyé. Si une demande reste en attente, ouvrez Historique des exécutions du flux : chaque carte montre l'entrée et la sortie réelles.
Vous avez alors les deux mondes : la robustesse d'un formulaire qui fonctionne sans réseau, et la puissance de Power Automate côté Microsoft (Excel Online, e-mail, Teams, approbation, Power BI). C'est exactement l'architecture que l'on retrouve dans les applications de collecte terrain professionnelles.
J'ai un compte Microsoft gratuit et je peux accéder à forms.office.com et make.powerautomate.com
J'ai contrôlé le type de compte (sous-étape 4.0) : le connecteur Microsoft Forms voit bien mon formulaire et Excel Online (Business) voit bien mon classeur
J'ai ajouté la question 8 « Votre adresse e-mail » et mon formulaire « Demande de Véhicule » compte 8 questions
J'ai téléchargé le QR code de mon formulaire depuis Forms → "Partager" → "Code QR"
Le fichier Excel est sur OneDrive (pas sur le PC local) et contient un tableau nommé "DemandesVehicules"
Le flux Power Automate a 4 cartes : 1 déclencheur Forms → 1. Lire la réponse → 2. Écrire dans Excel → 3. Confirmer au demandeur (voir sous-étapes 4.1 à 4.6)
Test réussi : soumission formulaire → exécution verte dans PA → ligne dans Excel → email reçu
Test QR Code depuis téléphone : le scan ouvre le formulaire et la soumission crée une nouvelle ligne Excel