- 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
- 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 przezSpreadsheetApp.getActive()i kopiuje się razem z nim.
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. - 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.
- 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ć.
- 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):
| Limit | Konto prywatne (gmail.com) | Google Workspace |
|---|---|---|
| Odbiorcy e-maili dziennie (np. MailApp) | 100 | 1500 |
| Odbiorcy na jedną wiadomość | 50 | 50 |
| Czas jednego uruchomienia skryptu | 6 minut | 6 minut |
| Łączny czas działania wyzwalaczy | 90 minut dziennie | 6 godzin dziennie |
| Wyzwalacze na użytkownika i skrypt | 20 | 20 |
| Wywołania UrlFetch (zapytania do API) | 20 000 dziennie | 100 000 dziennie |
| Utworzone dokumenty Google | 250 dziennie | 1500 dziennie |
| Czas funkcji własnej w komórce arkusza | 30 sekund | 30 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 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, '&').replace(/</g, '<').replace(/>/g, '>');
}
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);
});
}
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ć
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.
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.
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.