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:

  1. Otwórz Arkusz Google → menu Rozszerzenia → Apps Script.
  2. Pojawi się edytor kodu. Usuń domyślną funkcję i wklej swój skrypt.
  3. Kliknij ▶ Uruchom (lub Ctrl+Enter) – przy pierwszym uruchomieniu Google poprosi o autoryzację.
  4. 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."