Google Sheets · Apps Script · Zalando · Otto
Zalando और Otto का प्रोडक्ट डेटा Google Sheets में लाएँ
कई प्राइस जाँचें एक स्प्रेडशीट से शुरू होती हैं: प्रोडक्ट की एक लिस्ट, आज की कीमत, पिछले हफ़्ते की कीमत। Zalando या Otto से ये आँकड़े हाथ से कॉपी करना जल्दी ही उबाऊ हो जाता है। Google Sheets में एक बिल्ट-इन स्क्रिप्टिंग टूल है, Apps Script, जो वेब से डेटा फ़ेच कर सकता है – इसलिए शीट ख़ुद भर सकती है।
इस गाइड में आप एक Google Sheet में एक छोटी स्क्रिप्ट जोड़ेंगे। एक बटन Zalando प्रोडक्ट लिंक की एक लिस्ट के लिए टाइटल, ब्रांड, कीमत और उपलब्धता रिफ़्रेश करता है; दूसरा किसी सर्च शब्द के Otto सर्च रिज़ल्ट से दूसरा टैब भरता है। एक दैनिक टाइमर कीमतों को ताज़ा रखता है। सब कुछ Google के अंदर चलता है – आपको न सर्वर चाहिए, न चालू रहने वाला कंप्यूटर।
अपडेट: · everydata.io द्वारा
आख़िर में आपके पास क्या होगा
- एक “Zalando” टैब, जो आपके प्रोडक्ट लिंक की कीमतें और उपलब्धता रिफ़्रेश करता है।
- एक “Otto” टैब, जो किसी भी सर्च शब्द के सर्च रिज़ल्ट का पहला पेज दिखाता है।
- शीट में एक everydata मेन्यू और एक वैकल्पिक दैनिक रिफ़्रेश।
आपको क्या चाहिए
- एक Google अकाउंट और एक नई Google Sheet।
- everydata.io की फ़्री API key – यहाँ बनाएँ।
- कुछ Zalando प्रोडक्ट लिंक (जैसे zalando.de से) और Otto के लिए एक सर्च शब्द।
01दोनों टैब तैयार करें
- पहले टैब का नाम बदलकर
Zalandoरखें। पंक्ति 1 में ये हेडिंग डालें: URL, Title, Brand, Price, Regular price, Availability, Checked at। पंक्ति 2 से कॉलम A में अपने Zalando प्रोडक्ट लिंक पेस्ट करें। Ottoनाम का दूसरा टैब जोड़ें। A1 में “Search term” और B1 में अपना शब्द (जैसे “highboard”) लिखें। पंक्ति 3 में हेडिंग Product, Brand, Price, Regular price, Rating, Link डालें।
02अपनी API key को सेल में नहीं, स्क्रिप्ट में रखें
Extensions → Apps Script खोलें। एडिटर में Project Settings → Script properties पर जाएँ और EVERYDATA_API_KEY नाम की एक property जोड़ें, जिसकी वैल्यू आपकी key हो। जिनके साथ भी आप शीट शेयर करते हैं वे उसके सेल देख सकते हैं, लेकिन script properties नहीं।
03स्क्रिप्ट पेस्ट करें
Code.gs का कंटेंट नीचे दी गई स्क्रिप्ट से बदलें और सेव करें। refreshZalando हर प्रोडक्ट लिंक को Zalando endpoint पर भेजता है और नतीजा उसके बगल में लिखता है। searchOtto सर्च शब्द को Otto search endpoint पर भेजता है और हर प्रोडक्ट के लिए एक पंक्ति लिखता है।
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();
}स्प्रेडशीट दोबारा लोड करें: एक “everydata” मेन्यू दिखता है। पहली बार इस्तेमाल करने पर Google आपसे स्क्रिप्ट को किसी बाहरी सेवा से जुड़ने की अनुमति माँगता है – यह everydata.io को जाने वाली रिक्वेस्ट है।
04क्या लौटता है
Zalando प्रोडक्ट लिंक के लिए API मौजूदा प्रोडक्ट पेज को डेटा के रूप में लौटाता है। छोटा किया गया डॉक्यूमेंटेड उदाहरण:
{
"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 वह है जो प्रोडक्ट की अभी कीमत है, retailPrice छूट से पहले की सामान्य कीमत। Otto सर्च के लिए searchProductDetails का हर प्रोडक्ट एक पंक्ति बनता है। dpUrl, otto.de पर एक path है, इसीलिए स्क्रिप्ट उसके आगे 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"
}
]
}05कीमतें हर दिन रिफ़्रेश करें
यह फ़ंक्शन उसी स्क्रिप्ट में जोड़ें, एडिटर टूलबार में उसे चुनें और एक बार Run दबाएँ। उसके बाद Google हर सुबह Zalando टैब रिफ़्रेश करता है, शीट बंद होने पर भी।
/** 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();
}कीमतें ओवरराइट करने के बजाय इतिहास रखने के लिए, हर रिफ़्रेश से पहले Price कॉलम को एक नए कॉलम (या दूसरे टैब) में कॉपी करें।
06इसमें कितनी रिक्वेस्ट लगती हैं
हर Zalando प्रोडक्ट लुकअप आपके मासिक quota में 2 रिक्वेस्ट गिना जाता है; एक Otto सर्च 1। उदाहरण के लिए, एक Zalando प्रोडक्ट का दैनिक रिफ़्रेश हर महीने लगभग 60 रिक्वेस्ट है, इसलिए इसे आज़माने के लिए 100 रिक्वेस्ट वाला फ़्री प्लान काफ़ी है। लंबी लिस्ट के लिए प्राइसिंग देखें।
=ZALANDO(A2) जैसे कस्टम सेल फ़ॉर्मूले से API कॉल करने से बचें। Sheets फ़ॉर्मूले अपने शेड्यूल पर दोबारा कैलकुलेट करता है, जिससे ऐसी रिक्वेस्ट दोहराई जा सकती हैं जो आपका इरादा नहीं था। मेन्यू आइटम या टाइमर ठीक तब चलता है जब आप तय करते हैं।
इस गाइड में इस्तेमाल किए गए endpoints
Product details by URL · Zalando API
Search products by keyword · Otto API
इस डेटा से आप और क्या कर सकते हैं
कोई भी zalando.de या zalando.co.uk प्रोडक्ट पेज JSON में: टाइटल, ब्रांड, विक्रेता, कीमत, मार्कडाउन, इमेज, मटीरियल और स्टॉक के साथ हर साइज़ और रंग।
कोई भी otto.de प्रोडक्ट पेज JSON में: टाइटल, निर्माता, price, retailPrice, priceSaving, स्टॉक लाइन, इमेज, स्पेसिफ़िकेशन और पूरा वेरिएशन मैट्रिक्स। रियलटाइम।
अपने डेटा के साथ आज़माएँ
फ़्री प्लान में हर महीने 100 रिक्वेस्ट शामिल हैं, हर प्लेटफ़ॉर्म पर इस्तेमाल करने लायक – इस गाइड को शुरू से आख़िर तक फ़ॉलो करने के लिए काफ़ी।