Zapier i Make.com ułatwiają integracje – do czasu, gdy firma przekroczy miesięczny limit wywołań (kilka tysięcy tasków) i trafi na abonament po $100/miesiąc. Tymczasem Google Apps Script ma wbudowany mechanizm UrlFetchApp, który robi to samo za $0 – bez pośredników, bez limitów taskowych, bez czekania na 15-minutowy trigger.
UrlFetchApp – jak otworzyć i uruchomić
UrlFetchApp to klasa wbudowana w każdy Arkusz Google. Dostęp do niej:
- Otwórz Arkusz Google → menu Rozszerzenia → Apps Script.
- Pojawi się edytor kodu. Usuń domyślną funkcję i wklej swój skrypt.
- Kliknij ▶ Uruchom (lub Ctrl+Enter) – przy pierwszym uruchomieniu Google poprosi o autoryzację.
- Dane pojawią się w arkuszu.
Arkusz działa jak przeglądarka: wysyła żądanie GET/POST do zewnętrznego URL, odbiera JSON, parsuje go i zapisuje do wybranych komórek. Bez pośredników – latencja to milisekundy, nie minuty.
Przykład 1: Kursy walut NBP (publiczne API)
Zasilaj wyceny B2B oficjalnym kursem EUR z Narodowego Banku Polskiego – dane aktualizowane każdego dnia roboczego:
function pobierzKursNBP() {
const url = 'https://api.nbp.pl/api/exchangerates/rates/A/EUR/?format=json';
const odpowiedz = UrlFetchApp.fetch(url, { muteHttpExceptions: true });
if (odpowiedz.getResponseCode() !== 200) {
Logger.log('Błąd API: ' + odpowiedz.getResponseCode());
return;
}
const json = JSON.parse(odpowiedz.getContentText());
const kurs = json.rates[0].mid;
const data = json.rates[0].effectiveDate;
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('Pulpit Wycen');
sheet.getRange('A2').setValue(data);
sheet.getRange('B2').setValue(kurs);
Logger.log('Kurs EUR/PLN z dnia ' + data + ': ' + kurs);
}
Kluczowe elementy: muteHttpExceptions: true zapobiega crashowi skryptu przy błędzie sieci, a sprawdzenie getResponseCode() !== 200 obsługuje awarie API bez rzucania wyjątku.
Przykład 2: API z Bearer Token (płatne/chronione API)
Większość API biznesowych (Shopify, HubSpot, własne CRM) wymaga autoryzacji przez token. Przekazujesz go w nagłówku HTTP:
function pobierzZamowieniaShopify() {
const TOKEN = PropertiesService.getScriptProperties()
.getProperty('SHOPIFY_TOKEN'); // przechowuj tokeny tu, nie w kodzie
const SKLEP = 'twoj-sklep.myshopify.com';
const url = `https://${SKLEP}/admin/api/2024-01/orders.json?status=any&limit=50`;
const opcje = {
method: 'GET',
headers: { 'X-Shopify-Access-Token': TOKEN },
muteHttpExceptions: true
};
const json = JSON.parse(UrlFetchApp.fetch(url, opcje).getContentText());
const zamowienia = json.orders;
const sheet = SpreadsheetApp.getActiveSpreadsheet()
.getSheetByName('Zamowienia');
sheet.clearContents();
sheet.appendRow(['ID', 'Data', 'Kwota', 'Status']);
zamowienia.forEach(z => {
sheet.appendRow([z.id, z.created_at, z.total_price, z.financial_status]);
});
}
Ważne: nigdy nie wklejaj tokenów bezpośrednio do kodu. Użyj PropertiesService.getScriptProperties().setProperty('SHOPIFY_TOKEN', 'wartość') – token będzie przechowywany zaszyfrowany, niewidoczny w historii kodu.
Automatyczny trigger – odświeżanie bez kliknięcia
Jeden trigger i dane aktualizują się same codziennie rano:
function setupDailyTrigger() {
ScriptApp.newTrigger('pobierzKursNBP')
.timeBased()
.everyDays(1)
.atHour(7)
.create();
}
Przypadki użycia według branży
| Branża | Źródło API | Co trafia do Sheets |
|---|---|---|
| Finanse / Wyceny | NBP, ECB, Stooq | Kurs EUR/USD/GBP codziennie o 7:00 |
| E-commerce | Shopify, WooCommerce API | Zamówienia, stany magazynowe |
| Marketing | Meta Ads API, TikTok API | Wydatki i konwersje kampanii → Data Studio |
| Logistyka | InPost, DPD, DHL API | Status przesyłek, czas dostawy |
„UrlFetchApp to Zapier, który zapomniał poprosić o subskrypcję. Jeśli znasz 20 linii JavaScript – nie potrzebujesz pośrednika."