20 % de remise sur toutes les offres payantes avec le code

Google Sheets · Apps Script · Zalando · Otto

Importer les données produits Zalando et Otto dans Google Sheets

Beaucoup de suivis de prix commencent dans un tableur : une liste de produits, le prix du jour, celui de la semaine dernière. Recopier ces chiffres à la main depuis Zalando ou Otto devient vite fastidieux. Google Sheets dispose d'un outil de script intégré, Apps Script, capable de récupérer des données sur le web – la feuille peut donc se remplir toute seule.

Dans ce guide, vous ajoutez un petit script à une feuille Google Sheets. Un bouton actualise le titre, la marque, le prix et la disponibilité d'une liste de liens produits Zalando ; un autre remplit un second onglet avec les résultats de recherche Otto pour un terme donné. Un déclencheur quotidien maintient les prix à jour. Tout s'exécute chez Google – pas besoin de serveur ni d'ordinateur allumé en permanence.

Mis à jour le · par everydata.io

Ce que vous aurez à la fin

  • Un onglet « Zalando » qui actualise les prix et la disponibilité de vos liens produits.
  • Un onglet « Otto » qui liste la première page de résultats de recherche pour n'importe quel terme.
  • Un menu everydata dans la feuille et une actualisation quotidienne facultative.

Ce dont vous avez besoin

  • Un compte Google et une nouvelle feuille Google Sheets.
  • Une clé API everydata.io gratuite – créez-la ici.
  • Quelques liens de produits Zalando (par exemple sur zalando.de) et un terme de recherche pour Otto.

01Préparez les deux onglets

  • Renommez le premier onglet en Zalando. Saisissez ces en-têtes en ligne 1 : URL, Titre, Marque, Prix, Prix normal, Disponibilité, Vérifié le. Collez vos liens produits Zalando dans la colonne A à partir de la ligne 2.
  • Ajoutez un second onglet nommé Otto. Écrivez « Terme de recherche » en A1 et votre terme (par exemple « highboard ») en B1. Saisissez les en-têtes Produit, Marque, Prix, Prix normal, Note, Lien en ligne 3.

02Stockez votre clé API dans le script, pas dans une cellule

Ouvrez Extensions → Apps Script. Dans l'éditeur, allez dans Paramètres du projet → Propriétés du script et ajoutez une propriété nommée EVERYDATA_API_KEY avec votre clé pour valeur. Les personnes avec qui vous partagez la feuille voient ses cellules, mais pas les propriétés du script.

03Collez le script

Remplacez le contenu de Code.gs par le script ci-dessous et enregistrez. refreshZalando envoie chaque lien produit à l'endpoint Zalando et écrit le résultat à côté. searchOtto envoie le terme de recherche à l'endpoint de recherche Otto et écrit une ligne par produit.

Code.gs
const API = "https://api.everydata.io";

/**
 * One GET request to everydata.io. The key lives in the script properties, not in the sheet.
 * Waits when rate limited (429) and retries a failed page load (5xx) once; other errors come back as { error }.
 */
function apiGet(path, params) {
  const key = PropertiesService.getScriptProperties().getProperty("EVERYDATA_API_KEY");
  const query = Object.keys(params)
    .map((k) => encodeURIComponent(k) + "=" + encodeURIComponent(params[k]))
    .join("&");
  let retried = false;
  for (let attempt = 0; attempt < 4; attempt++) {
    const res = UrlFetchApp.fetch(API + path + "?" + query, {
      headers: { "x-api-key": key },
      muteHttpExceptions: true,
    });
    const code = res.getResponseCode();
    if (code === 429) {
      // Too many requests at once. The answer says how long to wait: "... Try again in 12 seconds."
      const wait = res.getContentText().match(/in (\d+) seconds/);
      Utilities.sleep(Math.min(wait ? Number(wait[1]) + 1 : 60, 60) * 1000);
      continue;
    }
    if (code >= 500 && !retried) {
      retried = true; // 5xx answers are not counted against your quota
      Utilities.sleep(5000);
      continue;
    }
    if (code >= 400) return { error: code };
    return JSON.parse(res.getContentText());
  }
  return { error: 429 };
}

/** Sheet "Zalando": product URLs in column A from row 2; writes columns B–G. */
function refreshZalando() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Zalando");
  const lastRow = sheet.getLastRow();
  if (lastRow < 2) return;
  const urls = sheet.getRange(2, 1, lastRow - 1, 1).getValues();
  const rows = urls.map(([url]) => {
    if (!url) return ["", "", "", "", "", ""];
    const p = apiGet("/zal/zalando-lookup-product", { url: url });
    if (p.error) return ["Error " + p.error, "", "", "", "", new Date()];
    return [p.productTitle, p.manufacturer, p.price, p.retailPrice, p.warehouseAvailability, new Date()];
  });
  sheet.getRange(2, 2, rows.length, 6).setValues(rows);
}

/** Sheet "Otto": search term in B1; writes the first page of results from row 4. */
function searchOtto() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Otto");
  const keyword = sheet.getRange("B1").getValue();
  const data = apiGet("/ott/otto-search-by-keyword", { keyword: keyword, page: 1 });
  if (sheet.getLastRow() >= 4) sheet.getRange(4, 1, sheet.getLastRow() - 3, 6).clearContent();
  if (data.error) {
    sheet.getRange("A4").setValue("Error " + data.error);
    return;
  }
  const rows = (data.searchProductDetails || []).map((p) => [
    p.productDescription, p.manufacturer, p.price, p.retailPrice, p.productRating, "https://www.otto.de" + p.dpUrl,
  ]);
  if (rows.length) sheet.getRange(4, 1, rows.length, 6).setValues(rows);
}

/** Adds an "everydata" menu to the spreadsheet. */
function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu("everydata")
    .addItem("Refresh Zalando prices", "refreshZalando")
    .addItem("Search Otto", "searchOtto")
    .addToUi();
}

Rechargez la feuille : un menu « everydata » apparaît. À la première utilisation, Google vous demande d'autoriser le script à se connecter à un service externe – il s'agit de la requête vers everydata.io.

04Ce qui est renvoyé

Pour un lien produit Zalando, l'API renvoie sous forme de données la page produit actuelle. Exemple documenté abrégé :

Exemple de réponse · GET /zal/zalando-lookup-product
{
  "responseStatus": "PRODUCT_FOUND_RESPONSE",
  "responseMessage": "Product successfully found!",
  "productTitle": "EVERQUEST TEXAPORE MID - Hikingschuh - dusty olive",
  "manufacturer": "Jack Wolfskin",
  "url": "https://www.zalando.de/jack-wolfskin-everquest-texapore-mid-hikingschuh-dusty-olive-ja442c00s-n11.html",
  "warehouseAvailability": "Auf Lager.",
  "retailPrice": 119.95,
  "price": 104.97,
  "priceSaving": 14.98
}

price est le prix actuel du produit, retailPrice le prix normal avant remise. Pour une recherche Otto, chaque produit de searchProductDetails devient une ligne. dpUrl est un chemin sur otto.de, c'est pourquoi le script le préfixe par https://www.otto.de:

Exemple de réponse · GET /ott/otto-search-by-keyword
{
  "responseStatus": "PRODUCT_FOUND_RESPONSE",
  "responseMessage": "Product successfully found!",
  "keyword": "highboard",
  "resultCount": 5166,
  "searchProductDetails": [
    {
      "productDescription": "LeGer Home by Lena Gercke Highboard Essentials, Sideboard, Kommode, Anrichte, Schrank, Stauraumschrank, Breite: 111 cm, UV lackiert, Push-to-open-Funktion",
      "manufacturer": "LeGer Home by Lena Gercke",
      "price": 869.99,
      "retailPrice": 1109.99,
      "productRating": "1.0",
      "dpUrl": "/p/leger-home-by-lena-gercke-highboard-essentials-sideboard-kommode-anrichte-schrank-stauraumschrank-breite-111-cm-uv-lackiert-push-to-open-funktion-1658198337/?variationId=2081559634"
    }
  ]
}

05Actualisez les prix chaque jour

Ajoutez cette fonction au même script, sélectionnez-la dans la barre d'outils de l'éditeur et cliquez une fois sur Exécuter. Dès lors, Google actualise l'onglet Zalando chaque matin, même lorsque la feuille est fermée.

Code.gs (à ajouter à la fin)
/** Run once from the editor: refreshes the Zalando sheet every morning between 7 and 8. */
function installDailyTrigger() {
  ScriptApp.newTrigger("refreshZalando").timeBased().everyDays(1).atHour(7).create();
}

Pour conserver un historique au lieu d'écraser les prix, copiez la colonne Prix dans une nouvelle colonne (ou un second onglet) avant chaque actualisation.

06Combien de requêtes cela consomme

Chaque recherche de produit Zalando compte pour 2 requêtes dans votre quota mensuel ; une recherche Otto compte pour 1. Par exemple, l'actualisation quotidienne d'un produit Zalando représente environ 60 requêtes par mois : l'offre gratuite de 100 requêtes suffit pour essayer. Pour des listes plus longues, consultez les tarifs.

Évitez d'appeler l'API depuis une formule de cellule personnalisée comme =ZALANDO(A2). Sheets recalcule les formules selon son propre calendrier, ce qui peut répéter des requêtes que vous n'aviez pas prévues. Une entrée de menu ou un déclencheur s'exécute exactement quand vous le décidez.

Endpoints utilisés dans ce guide

GET/zal/zalando-lookup-product

Product details by URL · API Zalando

GET/ott/otto-search-by-keyword

Search products by keyword · API Otto

Tous les paramètres dans la référence de l’API

Essayez avec vos propres données

L’offre gratuite comprend 100 requêtes par mois, utilisables sur toutes les plateformes – de quoi suivre ce guide de bout en bout.