MetalAPI
XAU3 997,89−1,54 %XAG53,936−1,51 %XPT1 554,47−0,83 %XPD1 047,03−0,44 %XCU6,5080+2,29 %WTI103,27+3,82 %BRENT111,70−1,30 %EUR1,120400−0,01 %GBP1,337500−0,01 %JPY0,0063761+0,14 %CHF1,213445−0,25 %TRY0,020125−0,12 %BTC80 654,70−0,15 %ETH2 354,50−0,06 %
Tous les articles
OrTableursTutoriel

Cours de l'or dans Google Sheets et Excel : prix en direct via API

Le cours de l'or en direct dans Google Sheets avec une fonction Apps Script et dans Excel avec Power Query, actualisé automatiquement, clé API protégée.

Par MetalAPI Team··12 min de lecture

Le cours de l'or en direct dans un tableur

Une grande partie de la tarification de l'or se fait encore dans des tableurs : la liste de prix d'un bijoutier, un inventaire de lingots, une grille de rachat d'or ou un suivi de portefeuille. Avec le cours de l'or en direct dans Google Sheets ou Excel, ces chiffres se mettent à jour d'eux-mêmes au lieu d'être recopiés depuis un site web. Ce guide construit les deux : une fonction personnalisée =GOLDPRICE("EUR"; "gram") dans Google Sheets avec Apps Script, et une table Power Query dans Excel, chacune actualisée automatiquement et avec la clé API tenue à l'écart des cellules.

Les deux demandent un peu de code. MetalAPI renvoie du JSON, et aucun des deux tableurs ne propose de formule qui analyse le JSON d'une URL tout en envoyant une clé API dans un en-tête. Apps Script et Power Query savent faire les deux.

Il vous faut une clé MetalAPI : créez un compte gratuit, sans carte bancaire, avec 100 requêtes par mois et des prix mis à jour quotidiennement. Pour Excel, il vous faut aussi une version avec Power Query (Récupérer et transformer, ou Get & Transform), comme Excel pour Microsoft 365 ou Excel 2016 et versions ultérieures sous Windows. Les prix sont aussi frais que votre plan le permet : une fois par jour sur Free, toutes les 30 minutes sur Lite, toutes les 10 minutes sur Standard et jusqu'à toutes les 5 secondes sur Enterprise.

Chaque réponse liste chaque symbole deux fois : USDXAU (ou EURXAU avec base=EUR) est le prix d'une once troy d'or, et la clé simple XAU en est l'inverse. Le code de cet article lit toujours la clé préfixée.

Obtenir le cours de l'or en direct dans Google Sheets

La mise en place consiste en un petit projet Apps Script lié à votre feuille de calcul : il lit la clé dans une propriété de script, récupère les prix avec UrlFetchApp, les met en cache avec CacheService et expose des fonctions personnalisées pour vos cellules. Un déclencheur horaire les maintient à jour.

  1. Ouvrez la feuille de calcul et choisissez Extensions → Apps Script. Cela crée un projet de script lié à ce fichier.
  2. Dans l'éditeur Apps Script, ouvrez Paramètres du projet (Project Settings, l'icône en forme de roue dentée), faites défiler jusqu'à Propriétés du script (Script Properties) et cliquez sur Ajouter une propriété de script (Add script property). Saisissez METALAPI_KEY comme propriété, collez votre clé comme valeur et cliquez sur Enregistrer les propriétés de script (Save script properties).
  3. De retour dans l'Éditeur (Editor), remplacez le contenu de Code.gs par les deux blocs de code ci-dessous et enregistrez.
  4. Choisissez refreshPrices dans le menu des fonctions et cliquez sur Exécuter (Run). Google vous demande une seule fois d'autoriser le script à se connecter à un service externe et à modifier la feuille de calcul.

Gardez votre clé API hors des cellules

Ne collez pas la clé dans une cellule pour construire l'URL avec une formule. Une clé placée dans une cellule est visible par toute personne qui peut ouvrir la feuille de calcul, voyage avec chaque copie et chaque export, et reste dans l'historique des versions après sa suppression. Quiconque la détient peut consommer votre quota.

Les propriétés de script sont un meilleur emplacement : elles ne font pas partie de la grille et n'apparaissent donc ni dans les cellules, ni dans les exports, ni dans l'historique des versions. Ce n'est pas pour autant un coffre-fort : toute personne disposant d'un accès en modification à la feuille de calcul peut ouvrir Extensions → Apps Script et les lire. Par conséquent :

  • Utilisez une clé distincte par feuille de calcul, afin de pouvoir la révoquer sans casser d'autres intégrations. Le guide d'authentification explique comment créer des clés et les renouveler.
  • Ne donnez un accès en modification qu'aux personnes à qui vous confieriez la clé. Les lecteurs et les commentateurs ne peuvent pas ouvrir l'éditeur de script, mais une copie de la feuille de calcul inclut une copie de son script lié. Pour les fichiers largement partagés, désactivez la copie pour les lecteurs et les commentateurs dans les paramètres de partage.
  • Envoyez la clé dans un en-tête. Le script utilise X-API-Key plutôt que le paramètre api_key, pour que la clé ne se retrouve pas dans des URL journalisées.
  • Renouvelez la clé au moindre doute : créez une nouvelle clé, mettez à jour la propriété de script, puis révoquez l'ancienne clé dans le tableau de bord.

Une fonction personnalisée GOLDPRICE pour Google Sheets

Collez ce code dans Code.gs. METALPRICE couvre les quatre métaux précieux et GOLDPRICE est un raccourci pour l'or. Une requête renvoie les quatre métaux : l'or et l'argent dans la même devise et la même unité partagent donc une seule réponse en cache.

Code.gs (partie 1)
// Prix MetalAPI pour Google Sheets. La clé API est lue dans la propriété
// de script METALAPI_KEY (Paramètres du projet), jamais dans une cellule.
const API = "https://metalapi.com/api/v1";
const SYMBOLS = ["XAU", "XAG", "XPT", "XPD"];
const CACHE_SECONDS = 3600; // 1 heure ; Apps Script autorise jusqu'à 21600

function fetchLatest_(base, unit) {
  const key = PropertiesService.getScriptProperties().getProperty("METALAPI_KEY");
  if (!key) throw new Error("Add the script property METALAPI_KEY first.");
  const url = API + "/latest?base=" + encodeURIComponent(base) +
    "&currencies=" + SYMBOLS.join(",") + "&unit=" + encodeURIComponent(unit);
  const res = UrlFetchApp.fetch(url, {
    headers: { "X-API-Key": key },
    muteHttpExceptions: true, // renvoie les réponses d'erreur au lieu de lever une exception
  });
  let data;
  try {
    data = JSON.parse(res.getContentText());
  } catch (e) {
    throw new Error("MetalAPI: unexpected HTTP " + res.getResponseCode() + " response");
  }
  if (!data.success) {
    throw new Error("MetalAPI " + data.error.code + " (" + data.error.type + "): " + data.error.info);
  }
  return data;
}

function cachedLatest_(base, unit, refresh) {
  const cache = CacheService.getScriptCache();
  const cacheKey = ["latest", base, unit, refresh].join("|");
  const hit = cache.get(cacheKey);
  if (hit) return JSON.parse(hit);
  const data = fetchLatest_(base, unit);
  cache.put(cacheKey, JSON.stringify(data), CACHE_SECONDS);
  return data;
}

/**
 * Dernier prix d'un métal précieux selon MetalAPI.
 *
 * @param {string} symbol XAU (or), XAG (argent), XPT (platine) ou XPD (palladium).
 * @param {string} currency Code de devise comme USD, EUR ou GBP. USD par défaut.
 * @param {string} unit troy_oz (par défaut), gram ou kilogram.
 * @param {any} refresh Cellule facultative comme Prices!B1. Quand elle change, les prix sont récupérés à nouveau.
 * @return Le prix d'une unité du métal dans la devise.
 * @customfunction
 */
function METALPRICE(symbol, currency, unit, refresh) {
  const s = String(symbol || "XAU").trim().toUpperCase();
  const base = String(currency || "USD").trim().toUpperCase();
  const u = String(unit || "troy_oz").trim().toLowerCase();
  const data = cachedLatest_(base, u, String(refresh || ""));
  const price = data.rates[data.base + s];
  if (price === undefined) throw new Error("No " + s + " price in " + base + ".");
  return price;
}

/**
 * Dernier cours de l'or selon MetalAPI, par exemple =GOLDPRICE("EUR"; "gram").
 *
 * @param {string} currency Code de devise comme USD, EUR ou GBP. USD par défaut.
 * @param {string} unit troy_oz (par défaut), gram ou kilogram.
 * @param {any} refresh Cellule facultative comme Prices!B1. Quand elle change, les prix sont récupérés à nouveau.
 * @return Le cours de l'or dans la devise, par unité.
 * @customfunction
 */
function GOLDPRICE(currency, unit, refresh) {
  return METALPRICE("XAU", currency, unit, refresh);
}

Saisissez maintenant une formule dans n'importe quelle cellule. Avec des paramètres régionaux français, les arguments sont séparés par des points-virgules (par des virgules avec des paramètres régionaux anglais) :

FormuleRenvoie
=GOLDPRICE()L'or en dollars américains par once troy
=GOLDPRICE("EUR"; "gram")L'or en euros par gramme
=GOLDPRICE("GBP"; "kilogram")L'or en livres sterling par kilogramme
=METALPRICE("XAG"; "USD"; "troy_oz")L'argent en dollars américains par once troy

Sous le capot :

  • @customfunction ajoute les fonctions à la saisie semi-automatique des formules, avec le commentaire comme texte d'aide.
  • muteHttpExceptions: true renvoie les réponses d'erreur au lieu de lever une exception : la cellule affiche alors #ERROR! avec, au survol, le code et le message de MetalAPI, comme 201 (invalid_base) pour une devise inconnue.
  • CacheService conserve chaque réponse pendant CACHE_SECONDS, six heures au maximum. Les cellules qui ont la même devise, la même unité et la même valeur d'actualisation la partagent.
  • Chaque devise et unité absente du cache coûte une requête, et chaque cellule de formule est un appel distinct aux serveurs de Google. Pour les feuilles qui contiennent des centaines de cellules de prix, faites plutôt référence à la feuille Prices présentée plus bas.

Les erreurs de validation, comme une devise inconnue, sont facturées : corrigez rapidement les formules défaillantes. Le guide des limites de débit liste ce qui est décompté.

Actualiser le cours de l'or dans Google Sheets avec un déclencheur horaire

Google Sheets réexécute une fonction personnalisée lorsque ses arguments changent, pas selon une horloge ; le paramètre de recalcul sous Fichier → Paramètres → Calcul (File → Settings → Calculation) ne concerne que des fonctions comme MAINTENANT (NOW) et ALEA (RAND). Pour des mises à jour planifiées, laissez un déclencheur horaire écrire les prix dans une feuille. Ajoutez ceci sous la partie 1 :

Code.gs (partie 2)
/** Écrit les derniers prix dans une feuille nommée "Prices". À lancer depuis un déclencheur horaire. */
function refreshPrices() {
  const data = fetchLatest_("USD", "troy_oz");
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = ss.getSheetByName("Prices") || ss.insertSheet("Prices");
  const rows = [
    ["Updated", new Date(data.timestamp * 1000)],
    ["Symbol", data.base + " per troy oz"],
  ];
  SYMBOLS.forEach(function (s) {
    rows.push([s, data.rates[data.base + s]]);
  });
  sheet.getRange(1, 1, rows.length, 2).setValues(rows);
}

/** À exécuter une fois depuis l'éditeur. Remplace toute planification existante de refreshPrices. */
function installTrigger() {
  ScriptApp.getProjectTriggers().forEach(function (t) {
    if (t.getHandlerFunction() === "refreshPrices") ScriptApp.deleteTrigger(t);
  });
  ScriptApp.newTrigger("refreshPrices").timeBased().everyHours(1).create();
}

Exécutez installTrigger une fois depuis l'éditeur, ou ajoutez le déclencheur à la main sous Déclencheurs (Triggers, l'icône en forme d'horloge) → Ajouter un déclencheur (Add Trigger) avec refreshPrices, Déclencheur horaire (Time-driven) et un intervalle.

Chaque exécution coûte une requête et écrit l'heure des données dans Prices!B1, puis une ligne par métal en dessous ; Prices!B3 contient l'or en dollars américains par once troy. Faites directement référence à ces cellules, ou passez Prices!B1 comme argument d'actualisation : =GOLDPRICE("EUR"; "gram"; Prices!B1) récupère à nouveau les prix chaque fois que le déclencheur écrit une nouvelle heure de données, une fois par devise et par unité, et jamais pendant le week-end, quand cette heure ne change pas. Pour obtenir la feuille Prices dans une autre devise ou unité, modifiez les arguments de fetchLatest_ dans refreshPrices.

Adaptez l'intervalle à votre plan ; actualiser plus vite que les mises à jour des prix ne fait que les répéter :

PlanMises à jour des prixDéclencheurRequêtes du déclencheur / mois
Free (100 requêtes)Quotidiennes.everyDays(1).atHour(6)Environ 31
Lite (1 000 requêtes)Toutes les 30 minutes.everyHours(1)Environ 744
Standard (10 000 requêtes)Toutes les 10 minutes.everyMinutes(10)Environ 4 500

Les fonctions personnalisées avec l'argument d'actualisation ajoutent une requête par actualisation pour chaque devise et unité. Sur Lite, un déclencheur toutes les heures plus GOLDPRICE("EUR"; "gram"; Prices!B1) peut atteindre environ 1 500 requêtes par mois, au-delà des 1 000 du plan ; utilisez .everyHours(2) ou la feuille Prices seule. Les déclencheurs s'exécutent à peu près, et non exactement, à l'heure prévue, et atHour utilise le fuseau horaire du script.

Le cours de l'or dans Excel avec Power Query

Dans Excel, Power Query appelle l'API, analyse le JSON et charge une table qui s'actualise selon un calendrier :

  1. Dans l'onglet Données (Data), choisissez Obtenir des données → À partir d'autres sources → Requête vide (Get Data → From Other Sources → Blank Query).
  2. Dans l'éditeur Power Query, choisissez Accueil → Éditeur avancé (Home → Advanced Editor), collez la requête ci-dessous et cliquez sur Terminé (Done).
  3. Lorsqu'Excel vous demande comment vous connecter à https://metalapi.com/, cliquez sur Modifier les informations d'identification (Edit Credentials), choisissez API Web (Web API), collez votre clé dans Clé (Key) et cliquez sur Se connecter (Connect).
  4. Renommez la requête GoldPrices et choisissez Accueil → Fermer et charger (Home → Close & Load). Excel la charge dans une nouvelle feuille, sous forme de table portant le nom de la requête.
GoldPrices (Power Query M)
let
    BaseCurrency = "EUR",
    MassUnit = "gram",
    Symbols = {"XAU", "XAG", "XPT", "XPD"},
    Response = Json.Document(
        Web.Contents(
            "https://metalapi.com/api/v1/latest",
            [
                Query = [base = BaseCurrency, currencies = Text.Combine(Symbols, ","), unit = MassUnit],
                ApiKeyName = "api_key"
            ]
        )
    ),
    Updated = #datetime(1970, 1, 1, 0, 0, 0) + #duration(0, 0, 0, Response[timestamp]),
    Prices = Table.FromRecords(
        List.Transform(
            Symbols,
            (symbol) => [
                Symbol = symbol,
                Price = Record.Field(Response[rates], Response[base] & symbol),
                Currency = Response[base],
                Unit = MassUnit,
                #"Updated (UTC)" = Updated
            ]
        )
    ),
    Typed = Table.TransformColumnTypes(
        Prices,
        {{"Symbol", type text}, {"Price", type number}, {"Currency", type text},
         {"Unit", type text}, {"Updated (UTC)", type datetime}}
    )
in
    Typed

La requête lit la clé préfixée par le base de la réponse (EURXAU pour EUR) et convertit le timestamp Unix en UTC. Adaptez BaseCurrency et MassUnit à vos besoins.

ApiKeyName = "api_key" garde la clé hors du fichier : Power Query la prend dans les informations d'identification API Web et l'ajoute comme paramètre de requête api_key, l'une des trois façons dont MetalAPI accepte une clé. Ces informations d'identification sont stockées dans les paramètres de source de données d'Excel sur votre ordinateur, pas dans le classeur : un collègue qui ouvre le fichier doit donc fournir sa propre clé. Modifiez-les ou supprimez-les sous Données → Obtenir des données → Paramètres de la source de données (Data → Get Data → Data Source Settings).

Web.Contents accepte aussi Headers = [#"X-API-Key" = "..."], mais la clé est alors enregistrée dans le classeur. Réservez cette option aux fichiers qui ne quittent jamais votre ordinateur.

Dans les formules, recherchez les prix dans la table : =RECHERCHEX("XAU"; GoldPrices[Symbol]; GoldPrices[Price]) (XLOOKUP dans un Excel en anglais) renvoie l'or en euros par gramme, et INDEX avec EQUIV (MATCH) fait de même dans les versions plus anciennes.

Actualiser automatiquement le cours de l'or dans Excel

Une table Power Query ne s'actualise pas d'elle-même. Ouvrez Données → Requêtes et connexions (Data → Queries & Connections), faites un clic droit sur la requête GoldPrices et choisissez Propriétés (Properties). Sous Contrôle de l'actualisation (Refresh control) :

  • Actualiser toutes les N minutes (Refresh every N minutes) réexécute la requête à intervalle régulier.
  • Actualiser les données lors de l'ouverture du fichier (Refresh data when opening the file) récupère des prix frais à chaque ouverture du classeur.
  • Activer l'actualisation en arrière-plan (Enable background refresh) permet de continuer à utiliser Excel pendant l'exécution de la requête.

Données → Actualiser tout (Data → Refresh All, Ctrl+Alt+F5) actualise à la demande. Le minuteur ne fonctionne que lorsque le classeur est ouvert.

Chaque actualisation correspond à une requête. Une actualisation par heure pendant une journée de travail de huit heures représente environ 180 requêtes par mois, et une toutes les 10 minutes environ 1 050. Sur Free, où les prix sont mis à jour une fois par jour, actualiser à l'ouverture du fichier suffit.

Cours historiques de l'or dans Sheets et Excel

Les cours de clôture passés proviennent de /timeframe : une entrée par jour de cotation entre start_date et end_date, jusqu'à 30 jours par requête sur Free et 365 sur les plans payants. Dans Excel, une seconde requête fournit une colonne de dates et une colonne par métal :

GoldHistory (Power Query M)
let
    Response = Json.Document(
        Web.Contents(
            "https://metalapi.com/api/v1/timeframe",
            [
                Query = [start_date = "2026-09-24", end_date = "2026-10-23", currencies = "XAU,XAG"],
                ApiKeyName = "api_key"
            ]
        )
    ),
    Days = Record.ToTable(Response[rates]),
    History = Table.FromRecords(
        List.Transform(
            Table.ToRecords(Days),
            (row) => [
                Date = Date.FromText(row[Name]),
                Gold = Record.FieldOrDefault(row[Value], Response[base] & "XAU", null),
                Silver = Record.FieldOrDefault(row[Value], Response[base] & "XAG", null)
            ]
        )
    ),
    Typed = Table.TransformColumnTypes(History, {{"Date", type date}, {"Gold", type number}, {"Silver", type number}})
in
    Typed

Les week-ends et les jours fériés des marchés sont absents : attendez-vous à moins de lignes que de jours calendaires. Dans Apps Script, appelez /timeframe avec UrlFetchApp comme fetchLatest_ appelle /latest, et écrivez toutes les lignes en un seul appel à setValues.

Les clôtures passées ne changent jamais : chargez une période une fois et conservez-la. Cours historiques de l'or et de l'argent par API traite des longs rattrapages d'historique, du stockage et des graphiques.

Étapes suivantes

Créez un compte gratuit, ajoutez la clé comme propriété de script ou comme informations d'identification API Web, et vous aurez le cours de l'or dans votre tableur en une dizaine de minutes. Les prix quotidiens du plan Free conviennent à une liste de prix ou à un suivi de portefeuille quotidiens ; pour des prix plus frais ou davantage d'actualisations, comparez les plans sur la page des tarifs. La documentation de l'API liste chaque endpoint que vous pouvez appeler de la même façon, y compris /convert, ainsi que /carat pour les prix de l'or par carat sur les plans payants.

Questions fréquentes

Puis-je plutôt importer le cours de l'or avec IMPORTDATA ou IMPORTXML ?

Pas depuis MetalAPI. Ces fonctions lisent du CSV, du TSV, du XML ou du HTML, alors que l'API renvoie du JSON, et elles ne peuvent pas envoyer d'en-tête : la clé figurerait donc dans la formule, à la vue de tous les lecteurs.

À quelle fréquence le cours de l'or est-il mis à jour dans mon tableur ?

Aussi souvent que vous l'actualisez et que votre plan le permet : une fois par jour sur Free, toutes les 30 minutes sur Lite, toutes les 10 minutes sur Standard et plus vite sur les plans supérieurs. Du vendredi 17:00 au dimanche 17:00, heure de New York, le marché au comptant est fermé et le prix reste à la clôture du vendredi.

Combien de requêtes API mon tableur va-t-il consommer ?

Une par actualisation de la feuille Prices ou de la table Power Query, plus une par devise et par unité lorsque les fonctions personnalisées récupèrent des prix frais. Un déclencheur toutes les heures représente environ 744 requêtes par mois, un déclencheur quotidien environ 31. /usage indique votre consommation sans être décompté du quota.

Puis-je partager sans risque une feuille de calcul qui récupère le cours de l'or ?

Oui, si la clé reste hors des cellules : une propriété de script dans Google Sheets, avec un accès en modification réservé aux personnes à qui vous confiez la clé, et les informations d'identification API Web dans Excel. Utilisez une clé distincte par fichier partagé pour pouvoir la révoquer isolément.

Puis-je obtenir le cours de l'or au gramme ou dans ma devise locale ?

Oui. Passez un code de devise et gram ou kilogram, comme dans =GOLDPRICE("INR"; "gram"), ou modifiez BaseCurrency et MassUnit dans la requête Power Query. L'API convertit les deux à partir du même instantané.

Essayez avec vos propres données

Créez un compte gratuit et envoyez votre première requête en moins de deux minutes. 100 requêtes par mois, sans carte bancaire.

À lire aussi