Google Sheets · Apps Script · Zalando · Otto
Porta i dati prodotto di Zalando e Otto in Google Sheets
Molti controlli dei prezzi nascono in un foglio di calcolo: un elenco di prodotti, il prezzo di oggi, quello della settimana scorsa. Copiare a mano quei numeri da Zalando o Otto stanca presto. Google Sheets ha uno strumento di scripting integrato, Apps Script, che può recuperare dati dal web – così il foglio si compila da solo.
In questa guida aggiungi un piccolo script a un Google Sheet. Un pulsante aggiorna titolo, marca, prezzo e disponibilità per un elenco di link di prodotti Zalando; un altro riempie una seconda scheda con i risultati di ricerca Otto per un termine di ricerca. Un timer giornaliero mantiene aggiornati i prezzi. Tutto gira dentro Google – non ti servono un server né un computer sempre acceso.
Aggiornato il · di everydata.io
Cosa avrai alla fine
- Una scheda “Zalando” che aggiorna prezzi e disponibilità dei tuoi link di prodotto.
- Una scheda “Otto” che elenca la prima pagina dei risultati di ricerca per qualsiasi termine.
- Un menu everydata nel foglio e un aggiornamento giornaliero facoltativo.
Cosa ti serve
- Un account Google e un nuovo Google Sheet.
- Una chiave API gratuita di everydata.io – creala qui.
- Alcuni link di prodotti Zalando (ad esempio da zalando.de) e un termine di ricerca per Otto.
01Prepara le due schede
- Rinomina la prima scheda in
Zalando. Inserisci queste intestazioni nella riga 1: URL, Titolo, Marca, Prezzo, Prezzo pieno, Disponibilità, Controllato il. Incolla i link dei prodotti Zalando nella colonna A a partire dalla riga 2. - Aggiungi una seconda scheda chiamata
Otto. Scrivi “Termine di ricerca” in A1 e il tuo termine (ad esempio “highboard”) in B1. Inserisci le intestazioni Prodotto, Marca, Prezzo, Prezzo pieno, Valutazione, Link nella riga 3.
02Salva la chiave API nello script, non in una cella
Apri Estensioni → Apps Script. Nell'editor vai su Impostazioni progetto → Proprietà script e aggiungi una proprietà chiamata EVERYDATA_API_KEY con la tua chiave come valore. Chiunque abbia accesso al foglio ne vede le celle, ma non le proprietà dello script.
03Incolla lo script
Sostituisci il contenuto di Code.gs con lo script qui sotto e salva. refreshZalando invia ogni link di prodotto all'endpoint Zalando e scrive il risultato accanto. searchOtto invia il termine di ricerca all'endpoint di ricerca Otto e scrive una riga per prodotto.
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();
}Ricarica il foglio di calcolo: compare un menu “everydata”. Al primo utilizzo Google ti chiede di autorizzare lo script a connettersi a un servizio esterno – è la richiesta verso everydata.io.
04Cosa viene restituito
Per un link di prodotto Zalando l'API restituisce la pagina prodotto attuale sotto forma di dati. Esempio documentato, abbreviato:
{
"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 è il prezzo attuale del prodotto, retailPrice il prezzo pieno prima dello sconto. In una ricerca Otto, ogni prodotto in searchProductDetails diventa una riga. dpUrl è un percorso su otto.de, per questo lo script lo fa precedere da https://www.otto.de:
{
"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"
}
]
}05Aggiorna i prezzi ogni giorno
Aggiungi questa funzione allo stesso script, selezionala nella barra degli strumenti dell'editor e premi Esegui una volta. Da quel momento Google aggiorna la scheda Zalando ogni mattina, anche a foglio chiuso.
/** 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();
}Per conservare uno storico invece di sovrascrivere i prezzi, copia la colonna Prezzo in una nuova colonna (o in una seconda scheda) prima di ogni aggiornamento.
06Quante richieste consuma
Ogni lookup di un prodotto Zalando conta come 2 richieste sulla tua quota mensile; una ricerca Otto conta come 1. Un esempio: l'aggiornamento giornaliero di un prodotto Zalando consuma circa 60 richieste al mese, quindi il piano gratuito da 100 richieste basta per provarlo. Per elenchi più lunghi, consulta i prezzi.
Evita di chiamare l'API da una formula personalizzata come =ZALANDO(A2). Sheets ricalcola le formule secondo i propri tempi, e questo può ripetere richieste che non volevi fare. Una voce di menu o un timer vengono eseguiti esattamente quando decidi tu.
Endpoint usati in questa guida
Product details by URL · API Zalando
Search products by keyword · API Otto
Cos'altro puoi fare con questi dati
Ogni pagina prodotto di zalando.de o zalando.co.uk in JSON: titolo, brand, venditore, prezzo, ribasso, immagini, materiali e ogni taglia e colore con stock.
Ogni pagina prodotto otto.de in JSON: titolo, produttore, price, retailPrice, priceSaving, disponibilità, immagini, specifiche e matrice delle varianti. Live.
Provalo con i tuoi dati
Il piano gratuito include 100 richieste al mese, utilizzabili su ogni piattaforma – abbastanza per seguire questa guida dall'inizio alla fine.