• Zadzwoń 605 498 162

Logo
  • Stona Główna
  • O Mnie
  • Usługi
    • Naprawa Komputerów
    • Automatyzacje dla Firm
    • Strony Internetowe
    • Odzyskiwanie danych
    • Reklama Google
    • Pozycjonowanie stron
    • IT dla firm
  • Blog
  • Kontakt

Kontakt

  • Telefon 605 498 162

Menu

  • Stona Główna
  • O Mnie
  • Usługi
    • Naprawa Komputerów
    • Automatyzacje dla Firm
    • Strony Internetowe
    • Odzyskiwanie danych
    • Reklama Google
    • Pozycjonowanie stron
    • IT dla firm
  • Blog
  • Kontakt

Google Apps Script: 7 automatyzacji arkuszy Google dla firmy z gotowym kodem

  • Home
  • Blog Details
Google Apps Script: 7 automatyzacji arkuszy Google dla firmy z gotowym kodem
  • 10 listopada 2026
Dla kogo
Firma, która pracuje na Arkuszach Google i ręcznie powtarza te same czynności: maile, terminy, oferty, faktury
Czego potrzebujesz
Konto Google lub Google Workspace i arkusz. Apps Script jest wbudowany i bezpłatny, w ramach limitów
Czas
Jedna automatyzacja z tego tekstu: 30–60 minut z dopasowaniem kolumn i testem
Czy zrobisz to sam?
Tak, jeśli nie boisz się wkleić kodu i zmienić nazw kolumn. Większe całości lepiej zlecić

Szybka odpowiedź

Google Apps Script to język skryptowy (JavaScript) wbudowany w Arkusze, Gmaila i Dysk Google. Edytor otwierasz w arkuszu przez Rozszerzenia › Apps Script. Poniżej jest 7 gotowych skryptów: własne menu, automatyczna data zmiany statusu, codzienny mail z terminami na 30 dni, powiadomienie o zgłoszeniu z formularza, zapis faktur PDF z Gmaila na Dysk, oferta PDF z szablonu i pobieranie kursu EUR z NBP. Uruchamiają je wyzwalacze: proste (onOpen, onEdit) albo instalowane, np. codziennie o 7:00. Na koncie prywatnym skrypt wyśle maile do 100 odbiorców dziennie, w Google Workspace do 1500.

W wielu firmach Arkusze Google są głównym systemem: lista zgłoszeń, terminy przeglądów, oferty, rozliczenia. Dopóki pracuje na nich kilka osób, to działa. Problem zaczyna się wtedy, gdy ktoś codziennie rano przegląda arkusz w poszukiwaniu terminów, przepisuje dane do oferty w Wordzie albo ściąga faktury ze skrzynki do folderu. Apps Script pozwala zrzucić takie czynności na skrypt, bez kupowania nowych programów.

To etap pośredni. Jeśli arkuszy jest kilkanaście, dane się dublują, a pracownicy blokują sobie nawzajem pliki, czas pomyśleć o własnym systemie. Piszę o tym w tekście program zamiast Excela: kiedy przenieść dane z arkuszy do systemu. Tutaj zajmuję się tym, co da się zrobić szybko w samych Arkuszach. Kod sprawdziłem pod kątem zgodności z dokumentacją Apps Script na developers.google.com i przetestowałem lokalnie na danych testowych (stan na listopad 2026).

Jak zacząć: edytor, uruchomienie, uprawnienia

  1. Otwórz edytor skryptów

    W arkuszu wybierz Rozszerzenia › Apps Script. Otworzy się edytor z plikiem Kod.gs. Skrypt utworzony w ten sposób jest powiązany z arkuszem: widzi go przez SpreadsheetApp.getActive() i kopiuje się razem z nim.

    Edytor Google Apps Script z kodem blokiem ustawień, funkcjami onOpen i onEdit, zaznaczonym przyciskiem Uruchom z wyborem funkcji i ikoną panelu Wykonania
    Edytor Apps Script (Rozszerzenia › Apps Script) z wklejonym blokiem ustawień i pierwszymi funkcjami. Funkcję wybierasz z listy obok przycisku Uruchom, a historię uruchomień widzisz w panelu Wykonania.
  2. Wklej kod i zapisz

    Zacznij od bloku ustawień poniżej, potem dodawaj tylko te automatyzacje, których potrzebujesz. Wszystkie funkcje mogą być w jednym pliku. Zapisz projekt ikoną dyskietki.

  3. Uruchom raz ręcznie i nadaj uprawnienia

    Przy pierwszym uruchomieniu funkcji, która korzysta np. z Gmaila albo Dysku, Google poprosi o zgodę na dostęp. Przeczytaj listę uprawnień: skrypt dostaje dostęp w imieniu Twojego konta. Przy skryptach pisanych samodzielnie może pojawić się ostrzeżenie, że aplikacja nie została zweryfikowana przez Google. Przy własnym kodzie, który rozumiesz, to normalne. Przy kodzie od nieznanej osoby to sygnał, żeby się zatrzymać.

  4. Testuj na kopii

    Zrób kopię arkusza (Plik › Utwórz kopię) i na niej sprawdź skrypt. Kopia arkusza kopiuje też powiązany skrypt, ale nie kopiuje wyzwalaczy instalowanych.

Limity, o których trzeba wiedzieć

Apps Script jest bezpłatny, ale ma dzienne limity na użytkownika. Najważniejsze dla firm według dokumentacji limitów Apps Script (stan na listopad 2026, Google może je zmienić bez uprzedzenia):

LimitKonto prywatne (gmail.com)Google Workspace
Odbiorcy e-maili dziennie (np. MailApp)1001500
Odbiorcy na jedną wiadomość5050
Czas jednego uruchomienia skryptu6 minut6 minut
Łączny czas działania wyzwalaczy90 minut dziennie6 godzin dziennie
Wyzwalacze na użytkownika i skrypt2020
Wywołania UrlFetch (zapytania do API)20 000 dziennie100 000 dziennie
Utworzone dokumenty Google250 dziennie1500 dziennie
Czas funkcji własnej w komórce arkusza30 sekund30 sekund

Limity liczą się od pierwszego wywołania i resetują 24 godziny później. Dla typowej firmy, która wysyła kilka raportów dziennie, w zupełności wystarczą. Kłopot pojawia się przy masowych wysyłkach do klientów. Do newslettera Apps Script się nie nadaje.

Wyzwalacze proste i instalowane

Skrypt sam z siebie nic nie robi. Uruchamia go człowiek (przycisk, menu) albo wyzwalacz. To najważniejsza decyzja przy każdej automatyzacji.

Wyzwalacze proste i instalowane w Google Apps Script Po lewej wyzwalacze proste: funkcje o nazwach onOpen i onEdit, działają same po zapisaniu kodu, nie mogą korzystać z usług wymagających uprawnień, takich jak Gmail, działają maksymalnie 30 sekund i nie uruchamiają się, gdy plik jest otwarty tylko do wglądu. Po prawej wyzwalacze instalowane: tworzone w panelu Wyzwalacze lub kodem przez ScriptApp, mogą wysyłać maile i korzystać z Dysku, działają na koncie osoby, która je utworzyła, mogą reagować na czas, edycję i przesłanie formularza. Pod spodem uwaga: zmiany wprowadzone przez skrypt lub API nie uruchamiają onEdit. Proste function onOpen(e) / onEdit(e) +działają same, wystarczy nazwa funkcji +mogą zmieniać arkusz, z którym są związane −bez usług wymagających uprawnień (Gmail) −nie mają dostępu do innych plików −maksymalnie 30 sekund −nie działają w trybie tylko do wglądu Przykłady w tekście: 1 i 2 Instalowane ScriptApp.newTrigger(‘funkcja’) +mogą wysyłać maile, czytać Gmaila i Dysk +czas: co godzinę, codziennie o 7:00 +zdarzenia: edycja, przesłanie formularza +powiadomienia e-mail o błędach −działają na koncie osoby, która je utworzyła −liczą się do limitu czasu wyzwalaczy Przykłady w tekście: 3, 4, 5 i 7 Uwaga: zmiany wprowadzone przez skrypt lub przez API, np. setValue(), nie uruchamiają onEdit. onEdit reaguje tylko na edycje wykonane przez użytkownika.
Ograniczenia wyzwalaczy prostych według dokumentacji Apps Script o wyzwalaczach. Jeśli skrypt ma wysłać maila po edycji komórki, potrzebny jest wyzwalacz instalowany, a nie prosty onEdit.

Wyzwalacze instalowane uruchamiają się na koncie osoby, która je utworzyła. Jeśli zrobi to pracownik, który potem odejdzie z firmy, a jego konto zostanie usunięte, automatyzacje przestaną działać. Dlatego instaluję je z konta firmowego, np. administracyjnego albo działowego, a nie z konta osobistego pracownika.

Blok ustawień

Wszystkie przykłady korzystają z jednego bloku ustawień na początku pliku. Zmieniasz w nim nazwy zakładek, adres e-mail i identyfikatory folderów. Identyfikator folderu lub dokumentu to ciąg znaków z adresu w przeglądarce, po /folders/ albo /d/.

// ===== Ustawienia: uzupełnij przed pierwszym uruchomieniem =====
const USTAWIENIA = {
  ARKUSZ_ZGLOSZENIA: 'Zgłoszenia',
  ARKUSZ_TERMINY: 'Terminy',
  ARKUSZ_OFERTY: 'Oferty',
  ARKUSZ_KURSY: 'Kursy',
  EMAIL_ODBIORCA: 'biuro@twojafirma.pl',
  FOLDER_FAKTURY_ID: 'WKLEJ_ID_FOLDERU_NA_FAKTURY',
  FOLDER_OFERTY_ID: 'WKLEJ_ID_FOLDERU_NA_OFERTY',
  SZABLON_OFERTY_ID: 'WKLEJ_ID_DOKUMENTU_Z_SZABLONEM',
  ETYKIETA_ZAPISANE: 'faktura-zapisana'
};

function strefa() {
  return SpreadsheetApp.getActive().getSpreadsheetTimeZone();
}

function esc(tekst) {
  return String(tekst).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
}

7 automatyzacji z kodem

1. Własne menu w arkuszu

Funkcja o nazwie onOpen uruchamia się sama przy otwarciu arkusza i dodaje menu „Automatyzacje”. Pracownicy nie muszą otwierać edytora, żeby uruchomić skrypt. Klikają pozycję w menu, jak w zwykłym programie.

// ----- 1. Własne menu w arkuszu -----
function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu('Automatyzacje')
    .addItem('Wyślij zestawienie terminów teraz', 'wyslijTerminy')
    .addItem('Utwórz oferty PDF', 'utworzOferty')
    .addItem('Pobierz kurs EUR z NBP', 'pobierzKursEur')
    .addSeparator()
    .addItem('Zainstaluj wyzwalacze', 'zainstalujWyzwalacze')
    .addToUi();
}

2. Automatyczna data zmiany statusu

W arkuszu zgłoszeń ktoś zmienia status w kolumnie E, a skrypt wpisuje datę i godzinę zmiany w kolumnie F. Po miesiącu widzisz, ile czasu zgłoszenia leżą w każdym statusie. To wyzwalacz prosty, więc działa bez instalacji i bez uprawnień. Skrypt ignoruje wklejanie wielu komórek naraz i zmiany w innych kolumnach.

// ----- 2. Data zmiany statusu (kolumna E = Status, F = Data zmiany) -----
function onEdit(e) {
  const zakres = e.range;
  const arkusz = zakres.getSheet();
  if (arkusz.getName() !== USTAWIENIA.ARKUSZ_ZGLOSZENIA) return;
  if (zakres.getNumRows() > 1 || zakres.getNumColumns() > 1) return;
  if (zakres.getColumn() !== 5 || zakres.getRow() < 2) return;
  arkusz.getRange(zakres.getRow(), 6).setValue(new Date());
}

Jeśli chcesz zapisywać też, kto zmienił status, potrzebny jest wyzwalacz instalowany. Wyzwalacz prosty nie zawsze może odczytać adres użytkownika, to zależy od ustawień bezpieczeństwa i typu konta.

3. Codzienny e-mail z terminami na 30 dni

Arkusz „Terminy” ma kolumny: czego dotyczy (np. pojazd, umowa, klient), rodzaj (przegląd, OC, koniec umowy), datę i osobę odpowiedzialną. Codziennie rano skrypt wysyła tabelę z terminami na najbliższe 30 dni, a te po terminie zaznacza na czerwono. Jeśli nic się nie zbliża, maila nie ma.

// ----- 3. Codzienny e-mail z terminami na 30 dni -----
// Arkusz "Terminy": A = Czego dotyczy, B = Rodzaj, C = Termin (data), D = Kto pilnuje
function wyslijTerminy() {
  const arkusz = SpreadsheetApp.getActive().getSheetByName(USTAWIENIA.ARKUSZ_TERMINY);
  const dane = arkusz.getDataRange().getValues().slice(1);
  const dzis = new Date();
  dzis.setHours(0, 0, 0, 0);
  const granica = new Date(dzis.getTime() + 30 * 24 * 60 * 60 * 1000);
  const pozycje = dane
    .filter(function (w) { return w[2] instanceof Date && w[2] <= granica; })
    .sort(function (a, b) { return a[2] - b[2]; });
  if (pozycje.length === 0) return;

  const wiersze = pozycje.map(function (w) {
    const styl = w[2] < dzis ? ' style="color:#c9302c"' : '';
    return '<tr' + styl + '><td>' + esc(w[0]) + '</td><td>' + esc(w[1]) + '</td><td>' +
      Utilities.formatDate(w[2], strefa(), 'dd.MM.yyyy') + '</td><td>' + esc(w[3]) + '</td></tr>';
  }).join('');

  const html = '<p>Terminy na najbliższe 30 dni. Na czerwono: po terminie.</p>' +
    '<table border="1" cellpadding="6" style="border-collapse:collapse">' +
    '<tr><th>Czego dotyczy</th><th>Rodzaj</th><th>Termin</th><th>Kto</th></tr>' +
    wiersze + '</table>';

  MailApp.sendEmail({
    to: USTAWIENIA.EMAIL_ODBIORCA,
    subject: 'Terminy na najbliższe 30 dni: ' + pozycje.length,
    htmlBody: html
  });
}

Funkcja esc z bloku ustawień zabezpiecza tabelę przed znakami, które zepsułyby HTML. Kolumna z datą musi zawierać prawdziwe daty, a nie tekst. Wiersze z tekstem w kolumnie C skrypt pomija, więc warto ustawić tam sprawdzanie poprawności danych (Dane › Sprawdzanie poprawności danych, reguła „jest prawidłową datą”).

4. Powiadomienie o nowym zgłoszeniu z formularza

Jeśli zbierasz zapytania przez Formularz Google połączony z arkuszem, skrypt może wysłać maila z treścią zgłoszenia zaraz po jego przesłaniu. Obiekt zdarzenia zawiera namedValues: pytania z formularza jako klucze i odpowiedzi jako listy wartości. W przykładzie formularz ma pytanie „Nazwa firmy”, które trafia do tematu wiadomości.

// ----- 4. Powiadomienie o nowym zgłoszeniu z Formularza Google -----
// Wymaga wyzwalacza instalowanego "Przy przesłaniu formularza" (patrz zainstalujWyzwalacze)
function noweZgloszenie(e) {
  const pola = e.namedValues; // np. { 'Nazwa firmy': ['ABC sp. z o.o.'], ... }
  const firma = pola['Nazwa firmy'] ? pola['Nazwa firmy'][0] : 'bez nazwy';
  const tresc = Object.keys(pola).map(function (k) {
    return k + ': ' + pola[k].join(', ');
  }).join('\n');
  MailApp.sendEmail(USTAWIENIA.EMAIL_ODBIORCA, 'Nowe zapytanie: ' + firma, tresc);
}

Ta funkcja nie zadziała z przycisku Uruchom, bo nie dostanie danych formularza. Testujesz ją, wysyłając formularz. Gdy zgłoszenia mają trafiać dalej, np. do CRM, lepszym miejscem jest system automatyzacji. Opisuję to we wpisie jak połączyć formularz kontaktowy z CRM.

5. Faktury PDF z Gmaila do folderu na Dysku

Co godzinę skrypt szuka w Gmailu wiadomości z ostatnich 7 dni z załącznikiem PDF i słowem „faktura” lub „invoice”, zapisuje załączniki w folderze na Dysku z datą w nazwie pliku i oznacza wątek etykietą, żeby nie zapisać ich drugi raz. Wyszukiwanie używa tej samej składni co pole wyszukiwania w Gmailu, więc możesz je zawęzić, np. do konkretnych nadawców (from:).

// ----- 5. Faktury PDF z Gmaila do folderu na Dysku -----
function zapiszFakturyZGmaila() {
  const folder = DriveApp.getFolderById(USTAWIENIA.FOLDER_FAKTURY_ID);
  const nazwa = USTAWIENIA.ETYKIETA_ZAPISANE;
  const etykieta = GmailApp.getUserLabelByName(nazwa) || GmailApp.createLabel(nazwa);
  const zapytanie = 'has:attachment filename:pdf newer_than:7d (faktura OR invoice) -label:' + nazwa;
  const watki = GmailApp.search(zapytanie, 0, 50);

  watki.forEach(function (watek) {
    watek.getMessages().forEach(function (wiadomosc) {
      const data = Utilities.formatDate(wiadomosc.getDate(), strefa(), 'yyyy-MM-dd');
      wiadomosc.getAttachments().forEach(function (zal) {
        if (zal.getContentType() === 'application/pdf') {
          folder.createFile(zal.copyBlob()).setName(data + ' ' + zal.getName());
        }
      });
    });
    watek.addLabel(etykieta);
  });
}
PDF z maila to nie zawsze faktura

Od 2026 roku faktury między firmami wystawia się w KSeF (najmniejsze firmy dołączają od 1 stycznia 2027), a PDF w mailu jest zwykle tylko wizualizacją. Dla księgowości wiążąca jest faktura w KSeF. Skrypt przydaje się do porządku w dokumentach i do faktur spoza KSeF, ale nie zastępuje pobierania faktur z systemu. Jak połączyć własne narzędzia z KSeF, piszę w tekście o integracji z KSeF przez API. Sprawy podatkowe potwierdź z księgową.

6. Oferta PDF z szablonu Dokumentu Google

Przygotuj szablon oferty w Dokumentach Google ze znacznikami {{klient}}, {{przedmiot}}, {{kwota}} i {{wazna_do}}. Handlowiec wpisuje dane w arkuszu „Oferty” i wybiera z menu „Utwórz oferty PDF”. Skrypt dla każdego wiersza bez linku robi kopię szablonu, podmienia znaczniki, zapisuje PDF w folderze, a kopię roboczą przenosi do kosza. Link do PDF wpisuje w kolumnie E.

// ----- 6. Oferta PDF z szablonu Dokumentu Google -----
// Arkusz "Oferty": A = Klient, B = Przedmiot, C = Kwota netto, D = Ważna do (data), E = Link do PDF
// Szablon zawiera znaczniki {{klient}}, {{przedmiot}}, {{kwota}}, {{wazna_do}}
function utworzOferty() {
  const arkusz = SpreadsheetApp.getActive().getSheetByName(USTAWIENIA.ARKUSZ_OFERTY);
  const dane = arkusz.getDataRange().getValues();
  const szablon = DriveApp.getFileById(USTAWIENIA.SZABLON_OFERTY_ID);
  const folder = DriveApp.getFolderById(USTAWIENIA.FOLDER_OFERTY_ID);

  for (let i = 1; i < dane.length; i++) {
    const klient = dane[i][0], przedmiot = dane[i][1], kwota = dane[i][2];
    const waznaDo = dane[i][3], link = dane[i][4];
    if (!klient || link) continue; // pusty wiersz albo oferta już zrobiona

    const kopia = szablon.makeCopy('Oferta ' + klient, folder);
    const dokument = DocumentApp.openById(kopia.getId());
    const tresc = dokument.getBody();
    tresc.replaceText('\\{\\{klient\\}\\}', String(klient));
    tresc.replaceText('\\{\\{przedmiot\\}\\}', String(przedmiot));
    tresc.replaceText('\\{\\{kwota\\}\\}', Number(kwota).toFixed(2).replace('.', ',') + ' zł netto');
    tresc.replaceText('\\{\\{wazna_do\\}\\}',
      waznaDo instanceof Date ? Utilities.formatDate(waznaDo, strefa(), 'dd.MM.yyyy') : String(waznaDo));
    dokument.saveAndClose();

    const pdf = folder.createFile(kopia.getAs(MimeType.PDF)).setName('Oferta ' + klient + '.pdf');
    kopia.setTrashed(true); // roboczą kopię Dokumentu przenosimy do kosza
    arkusz.getRange(i + 1, 5).setValue(pdf.getUrl());
  }
}

Funkcja replaceText traktuje pierwszy argument jako wyrażenie regularne, dlatego nawiasy klamrowe są poprzedzone ukośnikami. Każda oferta tworzy kopię dokumentu, więc przy dużej liczbie ofert dziennie pamiętaj o limicie tworzenia dokumentów z tabeli wyżej. Żeby od razu wysłać ofertę klientowi, możesz dodać do MailApp.sendEmail opcję attachments z plikiem PDF. Ja wolę, żeby handlowiec najpierw obejrzał dokument.

7. Kurs EUR z NBP do arkusza

Jeśli wyceniasz w euro albo przeliczasz faktury, skrypt może raz dziennie pobrać średni kurs EUR z publicznego API Narodowego Banku Polskiego i dopisać go do arkusza „Kursy”. NBP publikuje tabelę A w dni robocze. W dni wolne API zwraca ostatnią opublikowaną tabelę, dlatego skrypt porównuje numer tabeli i nie dopisuje tego samego kursu dwa razy.

// ----- 7. Kurs średni EUR z API NBP do arkusza -----
// Arkusz "Kursy": A = Data tabeli, B = Numer tabeli, C = Kurs średni
function pobierzKursEur() {
  const odp = UrlFetchApp.fetch('https://api.nbp.pl/api/exchangerates/rates/a/eur/?format=json',
    { muteHttpExceptions: true });
  if (odp.getResponseCode() !== 200) {
    throw new Error('NBP zwrócił kod ' + odp.getResponseCode());
  }
  const kurs = JSON.parse(odp.getContentText()).rates[0]; // { no, effectiveDate, mid }
  const arkusz = SpreadsheetApp.getActive().getSheetByName(USTAWIENIA.ARKUSZ_KURSY);
  const ostatni = arkusz.getLastRow();
  if (ostatni > 1 && arkusz.getRange(ostatni, 2).getValue() === kurs.no) return; // już zapisany
  arkusz.appendRow([kurs.effectiveDate, kurs.no, kurs.mid]);
}

W innych zakładkach odwołujesz się do kursu zwykłą formułą, np. ostatnią wartością z kolumny C. Tym samym sposobem, przez UrlFetchApp, pobierzesz dane z innych API, np. z systemu magazynowego. Klucze API zapisuj wtedy we właściwościach skryptu (PropertiesService), a nie w kodzie, który widzi każdy edytor arkusza.

Instalacja wyzwalaczy

Przykłady 3, 4, 5 i 7 potrzebują wyzwalaczy instalowanych. Przykład 6 uruchamiasz z menu. Możesz je dodać ręcznie w panelu Wyzwalacze edytora albo uruchomić raz poniższą funkcję. Na początku usuwa ona wszystkie wyzwalacze tego projektu, żeby ponowne uruchomienie nie tworzyło duplikatów.

// ----- Instalacja wyzwalaczy (uruchom raz ręcznie albo z menu) -----
function zainstalujWyzwalacze() {
  // usuwa wyzwalacze tego projektu, żeby nie dublować ich przy ponownym uruchomieniu
  ScriptApp.getProjectTriggers().forEach(function (t) { ScriptApp.deleteTrigger(t); });
  const ss = SpreadsheetApp.getActive();
  ScriptApp.newTrigger('wyslijTerminy').timeBased().everyDays(1).atHour(7).create();
  ScriptApp.newTrigger('zapiszFakturyZGmaila').timeBased().everyHours(1).create();
  ScriptApp.newTrigger('pobierzKursEur').timeBased().everyDays(1).atHour(14).create();
  ScriptApp.newTrigger('noweZgloszenie').forSpreadsheet(ss).onFormSubmit().create();
}

Wyzwalacz dzienny z atHour(7) uruchamia się w ciągu tej godziny, a nie co do minuty. Godzina jest liczona w strefie czasowej projektu, którą sprawdzisz w ustawieniach projektu w edytorze. Upewnij się, że to Europe/Warsaw.

Dobre praktyki i bezpieczeństwo

  • Powiadomienia o błędach. Przy wyzwalaczu instalowanym ustaw powiadomienia o niepowodzeniach na „od razu” albo „codziennie”. Inaczej skrypt może przestać działać po zmianie nazwy zakładki, a nikt tego nie zauważy.
  • Panel Wykonania. Pokazuje każde uruchomienie, czas trwania i błędy. To pierwsze miejsce, do którego zaglądam, gdy klient pisze, że „mail nie przyszedł”.
  • Nazwy kolumn i zakładek. Skrypty z tego tekstu odwołują się do numerów kolumn. Wstawienie nowej kolumny przed kolumną E zepsuje przykład 2. Zapisz w arkuszu notatkę, których kolumn nie wolno przesuwać, albo przepisz skrypt tak, żeby szukał kolumn po nagłówkach.
  • Uprawnienia. Każdy, kto ma prawo edycji arkusza, może też edytować powiązany skrypt. Arkusze z automatyzacjami udostępniaj do edycji tylko osobom, które muszą w nich pracować.
  • Dane osobowe. Skrypt, który wysyła maile z danymi klientów, przetwarza dane osobowe. Wysyłaj je tylko do osób, które ich potrzebują, i nie przekazuj ich do zewnętrznych API bez sprawdzenia, kto je przetwarza. W razie wątpliwości zapytaj prawnika lub inspektora ochrony danych.

Kiedy Apps Script przestaje wystarczać

Od arkusza ze skryptem do własnego systemu: trzy poziomy automatyzacji Trzy kolumny. Pierwsza: Arkusze Google z Apps Script, dla danych w jednym lub kilku arkuszach i automatyzacji w obrębie Google, np. maile, PDF, terminy. Druga: n8n, Make lub Zapier, gdy automatyzacja łączy wiele systemów spoza Google, na przykład CRM, sklep, Slack, model AI. Trzecia: własny program, gdy wiele osób edytuje te same dane, potrzebne są uprawnienia do części danych, historia zmian i akceptacje. Strzałki pokazują przejście od lewej do prawej wraz ze wzrostem liczby osób i danych. Arkusz + Apps Script dane w kilku arkuszach automatyzacje w obrębie Google: maile, PDF, terminy, Dysk, Gmail koszt: czas na skrypt ryzyko: przesunięte kolumny, jedno konto n8n, Make lub Zapier łączenie wielu systemów spoza Google: CRM, sklep, komunikator, model AI koszt: abonament lub serwer i wdrożenie Własny program wiele osób edytuje te same dane naraz, uprawnienia, historia zmian, akceptacje koszt: projekt i utrzymanie więcej osób, systemów i danych
Apps Script to dobry pierwszy krok. Gdy automatyzacja wychodzi poza Google albo arkusz staje się bazą danych dla całej firmy, warto przejść poziom dalej.

Jeśli automatyzacja ma łączyć arkusz z CRM, sklepem, komunikatorem i modelem AI, wygodniejsze są narzędzia do przepływów. Porównuję je we wpisie n8n, Make czy Zapier, a przykład z fakturami w Make jest w tekście automatyzacja faktur w małej firmie. Raport dla zarządu z danymi Google Ads i GA4 lepiej zbudować w Data Studio, co opisuję we wpisie o raporcie marketingowym w Looker Studio.

Typowy scenariusz

Firma serwisowa prowadzi w Arkuszach Google listę klientów z terminami przeglądów. Pracownik biura co poniedziałek przegląda arkusz i dzwoni do klientów, którym kończy się termin, a oferty przepisuje ręcznie do szablonu w edytorze tekstu. Po dodaniu codziennego maila z terminami na 30 dni i generowania ofert PDF z menu w arkuszu poniedziałkowy przegląd znika, a oferta powstaje w minutę. Po kilku miesiącach okazuje się, że arkusz edytuje pięć osób naraz i zaczynają się konflikty, więc firma planuje przejście na własny panel.

Kiedy lepiej to zlecić

Przykłady z tego tekstu wdrożysz sam, jeśli dopasujesz nazwy zakładek i kolumn. Warto oddać to komuś, gdy:

  • skrypt ma działać na kilku arkuszach naraz albo na danych z innych systemów,
  • automatyzacja jest krytyczna dla firmy i musi mieć obsługę błędów, powiadomienia i dokumentację,
  • potrzebujesz integracji z API, które wymaga logowania, np. z systemem księgowym lub sklepem,
  • arkusz zaczyna pełnić rolę bazy danych dla całej firmy i trzeba zdecydować, czy nie przejść na własny program.

Skrypty Apps Script, przepływy w n8n i Make oraz programy na zamówienie przygotowuję w ramach automatyzacji procesów w firmie.

Masz w arkuszu czynności, które ktoś powtarza codziennie?

Opisz, jak dziś pracujecie, a powiem, co da się zautomatyzować w samych Arkuszach Google, a co wymaga innego narzędzia. Napiszę skrypt, przetestuję go na kopii i przekażę z instrukcją. Pracuję zdalnie w całej Polsce, a w Sieradzu i okolicach mogę przyjechać. Wycenę dostajesz przed rozpoczęciem pracy.

Zobacz automatyzacje dla firm 605 498 162

Najczęstsze pytania

Czy Google Apps Script jest płatny?

Nie, Apps Script jest bezpłatny dla kont Google i Google Workspace, ale ma dzienne limity, np. 100 odbiorców e-maili dziennie na koncie prywatnym i 1500 w Workspace oraz 6 minut na jedno uruchomienie skryptu. Płacisz najwyżej za usługi zewnętrzne, z którymi skrypt się łączy.

Gdzie w Arkuszach Google znajdę Apps Script?

W menu arkusza wybierz Rozszerzenia › Apps Script. Otworzy się edytor skryptu powiązanego z tym arkuszem. Skrypt kopiuje się razem z arkuszem, ale wyzwalacze instalowane trzeba w kopii utworzyć ponownie.

Dlaczego onEdit nie wysyła maila?

Prosty wyzwalacz onEdit nie może korzystać z usług, które wymagają uprawnień, takich jak Gmail czy wysyłka maili. Do tego potrzebny jest wyzwalacz instalowany przy edycji, utworzony w panelu Wyzwalacze albo kodem przez ScriptApp.newTrigger.

Czy skrypt działa, gdy arkusz jest zamknięty?

Tak, jeśli korzysta z wyzwalacza czasowego lub wyzwalacza formularza. Skrypt uruchamia się wtedy na serwerach Google na koncie osoby, która utworzyła wyzwalacz. Wyzwalacze proste onOpen i onEdit działają tylko przy otwieraniu i edycji arkusza.

Kiedy lepiej użyć n8n lub Make zamiast Apps Script?

Gdy automatyzacja łączy wiele systemów spoza Google, np. CRM, sklep, komunikator i model AI, albo gdy potrzebujesz wizualnego podglądu przepływu i historii wykonań dla całego zespołu. Apps Script najlepiej sprawdza się w obrębie Arkuszy, Gmaila, Dokumentów i Dysku.

Powiązane wpisy

  • Program zamiast Excela: kiedy przenieść dane z arkuszy do systemu
  • Agent AI do automatyzacji: n8n, Make czy Zapier
  • Jak automatyzować raporty w firmie
  • Jak zaoszczędzić czas w firmie dzięki integracjom IT

Grzegorz Wojterzak – informatyk i specjalista od automatyzacji z Sieradza. Od ponad 10 lat pracuje z danymi firm: pisze skrypty Apps Script, buduje przepływy w n8n i Make oraz programy na zamówienie, które zastępują arkusze.

Udostępnij w Social Mediach
fb-share-icon
Tweet
fb-share-icon
Previous Post
Search Console: jak znaleźć frazy z 2. strony Google i przesunąć je do TOP 10
Next Post
Raport w Looker Studio dla zarządu: GA4 i Google Ads na jednym ekranie

Leave a Comment

Musisz się zalogować, aby móc dodać komentarz.

Ostatnie wpisy

  • Automatyzacja odpowiedzi e-mail z AI: sortowanie zapytań ofertowych i szkice odpowiedzi
  • Kampania Demand Gen: kiedy ma sens dla firmy usługowej i B2B
  • Portal klienta B2B: zamówienia, dokumenty i faktury w jednym miejscu
  • Raport w Looker Studio dla zarządu: GA4 i Google Ads na jednym ekranie
  • Google Apps Script: 7 automatyzacji arkuszy Google dla firmy z gotowym kodem

Kategorie

  • Analityka
  • Automatyzacje
  • Bez kategorii
  • Bezpieczeństwo
  • Internet
  • IT dla firm
  • Komputery
  • Marketing
  • Narzędzia
  • Pozycjonowanie
  • Strony Internetowe
  • Telefony
  • Wiadomości
Shape
Logo

Kompleksowa pomoc IT, serwis komputerowy i tworzenie stron internetowych dla firm i osób prywatnych.

Menu

  • O mnie
  • Usługi
  • Blog
  • Kontakt
  • Test prędkości internetu
  • Sprawdź adres IP
  • Sprawdź kto jest właścicielem domeny

Usługi

  • Naprawa Komputerów
  • Tworzenie stron internetowych
  • Odzyskiwanie danych
  • Reklama Google Ads
  • Pozycjonowanie stron
  • IT dla firm

Kontakt

  • Chojne, ul. Sieradzka 9
  • kontakt@informatyk-sieradz.pl
  • 605 498 162

© 2026 | Informatyk-Sieradz.pl | Wszelkie prawa zastrzeżone.

  • Regulamin
  • Polityka Prywatności

Napisz do mnie