Zbliżenie ekranu komputera z kodem programistycznym w ciemnym otoczeniu
Źródło: Pexels | Autor: luis gomes
Rate this post

Automatyzacja procesów tekstowych w środowisku biurowym często zaczyna się od prostego założenia: wystarczy połączyć listę surowych danych z możliwościami nowoczesnego modelu językowego, aby błyskawicznie wygenerować setki opisów, podsumowań lub tłumaczeń. W naturalny sposób pojawia się pokusa, aby traktować sztuczną inteligencję jak każdą inną wbudowaną formułę matematyczną czy tekstową. Użytkownik wpisuje w komórkę proste polecenie, odwołuje się do sąsiedniej kolumny i oczekuje, że arkusz sam rozwiąże problem. Jednak zderzenie statycznego środowiska tabelarycznego z zewnętrznym, dynamicznym interfejsem programistycznym (API) wymaga znacznie bardziej przemyślanego podejścia niż użycie standardowej funkcji WYSZUKAJ.PIONOWO.

Zbudowanie takiego rozwiązania od podstaw to proces, który wymaga zrozumienia zarówno mechaniki skryptów, jak i rygorystycznych zasad narzucanych przez dostawców modeli językowych. Połączenie uporządkowanych danych z możliwościami AI w praktycznych procesach nie sprowadza się wyłącznie do napisania kilku linijek kodu. Obejmuje zarządzanie autoryzacją, kontrolę kosztów, obsługę błędów sieciowych oraz optymalizację przeliczeń. Bez odpowiedniego przygotowania, projekt, który miał oszczędzać czas, szybko zamienia się w źródło frustracji, zawieszających się plików i niekontrolowanych wydatków na infrastrukturę chmurową.

Dlaczego funkcja AI w komórce Google Sheets często nie działa tak, jak użytkownik oczekuje

Problem: proste polecenie, nieprosty mechanizm

Z perspektywy interfejsu, własna funkcja AI Google Sheets wydaje się niezwykle przyjazna. Użytkownik wpisuje w komórce formułę, na przykład =AI_TEKST(„Streść ten tekst”; A2), naciska Enter i spodziewa się natychmiastowej odpowiedzi. W rzeczywistości to niewinne wywołanie uruchamia złożony łańcuch zdarzeń. Arkusz kalkulacyjny musi przekazać argumenty do środowiska uruchomieniowego, następnie skrypt formatuje te dane, inicjuje połączenie HTTP i wysyła je poza infrastrukturę Google, wprost na serwery dostawcy modelu językowego. Czas oczekiwania na odpowiedź nie zależy już od procesora komputera użytkownika, ale od obciążenia zewnętrznych serwerów, złożoności promptu oraz przepustowości łącza.

Tradycyjne funkcje wbudowane w arkusz są deterministyczne i działają całkowicie lokalnie (w obrębie serwerów obsługujących sam plik). Ich czas wykonania mierzony jest w milisekundach. Wywołanie API z Google Sheets to operacja asynchroniczna z punktu widzenia sieci, ale z punktu widzenia komórki w arkuszu – proces blokujący. Komórka przez kilka lub kilkanaście sekund wyświetla komunikat o ładowaniu danych. Jeśli takich komórek w widoku jest kilkadziesiąt, system musi nawiązać kilkadziesiąt równoległych połączeń. Każde z nich jest podatne na opóźnienia sieciowe, błędy autoryzacji czy chwilową niedostępność usługi po stronie sztucznej inteligencji. [1]

Zbliżenie kodu JavaScript na ekranie laptopa
Źródło: Pexels | Autor: Markus Winkler

Sygnał ostrzegawczy pojawia się w momencie, gdy czas potrzebny na przeliczenie pojedynczego wiersza zaczyna przekraczać tolerancję systemu na opóźnienia. Funkcja AI łączy trzy zupełnie odrębne środowiska: komórkę arkusza (odpowiadającą za interfejs użytkownika), Apps Script (działający jako warstwa pośrednicząca i autoryzacyjna) oraz zewnętrzne API modelu (wykonujące faktyczną pracę obliczeniową). Awaria, spowolnienie lub błąd na dowolnym z tych etapów natychmiast zatrzymuje cały proces, a użytkownik otrzymuje enigmatyczny błąd,

[2]

na przykład #BŁĄD! albo informację o przekroczeniu limitu czasu wykonania. Problem nie musi oznaczać błędu w formule. Często jest skutkiem samego modelu działania: arkusz oczekuje szybkiego wyniku, a API wykonuje kosztowną operację, której czas i rezultat mogą się różnić przy każdym wywołaniu.

Najbardziej kłopotliwe są automatyczne przeliczenia. Zmiana zakresu danych, edycja promptu, sortowanie tabeli albo ponowne otwarcie pliku może spowodować kolejną serię zapytań do modelu. Jeżeli funkcja odwołuje się do wielu wierszy, pozornie drobna korekta w arkuszu potrafi uruchomić dziesiątki żądań. Sygnał ostrzegawczy pojawia się wtedy, gdy odpowiedzi AI zmieniają się mimo braku świadomej zmiany danych wejściowych lub gdy saldo limitu API maleje podczas zwykłej pracy z tabelą.

Punkt kontrolny stanowi rozdzielenie dwóch czynności: generowania odpowiedzi i jej trwałego zapisania. Formuła w komórce jest wygodna podczas pojedynczej analizy, prototypu lub pracy na kilku rekordach. Nie zapewnia jednak stabilnego procesu dla kolumny zawierającej setki opisów produktów. W takim przypadku bezpieczniej uruchomić skrypt z menu, przyciskiem lub harmonogramem, a otrzymany tekst zapisać jako zwykłą wartość. Dzięki temu wynik nie znika ani nie generuje się ponownie przy każdym przeliczeniu arkusza.

Minimum kontroli obejmuje sprawdzenie, czy dane wejściowe są kompletne, czy prompt nie jest pusty, czy wynik ma zostać odświeżony oraz czy liczba żądań mieści się w limitach dostawcy API. Dobrą praktyką jest też oznaczanie wierszy statusem, na przykład do przetworzenia, gotowe lub błąd. Jeśli rezultat ma być powtarzalny i możliwy do audytu, samo wywołanie funkcji w komórce nie wystarczy; potrzebny jest kontrolowany moment uruchomienia oraz zapis odpowiedzi.

Jeśli AI ma pomóc w jednorazowym uzupełnieniu kilku pól, formuła może być wystarczająca. Jeśli natomiast ma obsługiwać proces biznesowy, kluczowe stają się limity, koszt, możliwość ponowienia błędu i trwałość danych. Arkusz pozostaje wtedy interfejsem do pracy z danymi, a Apps Script pełni rolę warstwy kontrolnej, która decyduje, kiedy zewnętrzne API rzeczywiście powinno zostać wywołane.

Skąd biorą się ograniczenia: zasady funkcji niestandardowych i zewnętrznego API

Kiedy arkusz kalkulacyjny odmawia współpracy i wyświetla błędy przy próbie wygenerowania tekstu, użytkownicy najczęściej obwiniają sam model AI lub błędnie napisany skrypt. Prawdziwa przyczyna leży jednak w sztywnych limitach nałożonych przez dwa niezależne od siebie systemy. Google narzuca własne restrykcje, aby chronić swoje serwery przed przeciążeniem, a dostawca API modelu językowego stosuje tak zwany rate limiting, aby zapobiegać nadużyciom.

Z perspektywy Google Sheets, każda niestandardowa funkcja napisana w Apps Script ma absolutny, nieprzekraczalny limit czasu wykonania wynoszący r równe 30 sekund na komórkę. Jeśli zewnętrzny serwer AI nie odeśle kompletnej odpowiedzi w tym oknie czasowym – na przykład z powodu zbyt skomplikowanego zapytania – Google bezlitośnie przerywa proces. Co więcej, chociaż arkusz potrafi równolegle przetwarzać wiele komórek, Apps Script nie jest przystosowany do asynchronicznego oczekiwania wewnątrz formuł. Próba masowego przeliczenia setek komórek jednocześnie kończy się zablokowaniem kolejki żądań.

Ekran laptopa z aplikacją do programowania i projektem kalkulatora
Źródło: Pexels | Autor: Eduardo Rosas

Z drugiej strony mamy dostawcę API (np. OpenAI czy Anthropic). Ich serwery śledzą liczbę zapytań (RPM – Requests Per Minute) oraz tokenów (TPM – Tokens Per Minute) wysyłanych z jednego konta. Gdy przeciągasz formułę w dół arkusza dla 200 wierszy, Google wysyła 200 niezależnych strzałów do API w ułamku sekundy. Systemy bezpieczeństwa dostawcy natychmiast interpretują to jako atak lub naruszenie darmowego planu i zwracają twardy błąd HTTP 429 (Too Many Requests). W efekcie, zamiast gotowych opisów, otrzymujesz ścianę błędów, a twój klucz API może zostać tymczasowo zablokowany.

Przygotowanie bezpiecznego środowiska: arkusz, projekt Apps Script i klucz API

Zanim napiszesz pierwszą linijkę kodu, musisz rozwiązać kluczowy problem bezpieczeństwa: jak połączyć arkusz z płatnym API bez ryzyka, że ktoś ukradnie twój klucz dostępu. Wklejenie tajnego ciągu znaków bezpośrednio w kod skryptu (tzw. hardcoding) to najprostsza droga do katastrofy, zwłaszcza jeśli plik docelowo ma być udostępniony innym pracownikom. Każdy, kto ma uprawnienia do edycji arkusza, może otworzyć edytor Apps Script i skopiować twój klucz, generując rachunki na twoje konto.

Rozwiązaniem jest wykorzystanie wbudowanej w Apps Script usługi PropertiesService, która pozwala przechowywać poufne dane w ukrytej pamięci przypisanej do konkretnego skryptu, niewidocznej z poziomu zwykłego edytora kodu.

Mini-checklista bezpiecznego startu:

  • Zbuduj strukturę w arkuszu: Rozdziel dane. Przygotuj kolumnę na surowy tekst, osobną na prompt sterujący i ostateczną na wynik AI. Nigdy nie mieszaj poleceń dla modelu z danymi wejściowymi w jednej komórce.
  • Wygeneruj klucz API: Zaloguj się na platformę dostawcy (np. OpenAI), utwórz nowy, dedykowany klucz API i skopiuj go do schowka. Ustaw twardy limit wydatków (tzw. hard cap) na koncie bilingowym.
  • Zabezpiecz klucz w Apps Script: Otwórz edytor, przejdź do ustawień projektu (ikona koła zębatego), znajdź sekcję „Właściwości skryptu” (Script Properties) i dodaj nową właściwość np. o nazwie API_KEY, wklejając tam swój klucz.

Dzięki temu przygotowaniu, twój kod będzie odwoływał się jedynie do nazwy zmiennej, a samo środowisko pozostanie bezpieczne nawet w przypadku udostępnienia arkusza całemu zespołowi.

Jak zbudować własną funkcję AI w Apps Script — minimalny kod i jego logika

Budowa skryptu integrującego AI nie musi być skomplikowana, o ile zrozumiesz architekturę pojedynczego żądania. Proces składa się z trzech faz: pakowania danych z arkusza w format zrozumiały dla API, wysłania zapytania przez Internet i rozpakowania otrzymanej odpowiedzi z powrotem do arkusza.

Aby uniknąć pułapki, w której jeden błąd serwera wysypuje całą tabelę, sercem skryptu musi być blok try...catch. To on odpowiada za przechwycenie problemów sieciowych i zwrócenie czytelnego komunikatu, zamiast domyślnego błędu Google. Minimalna logika operacyjna wygląda następująco:

  1. Pobranie klucza i autoryzacja: Skrypt sięga do PropertiesService po ukryty klucz i tworzy nagłówek autoryzacyjny (HTTP Headers).
  2. Konstrukcja Payloadu (Ciała zapytania): Tworzony jest obiekt JSON, który zawiera nazwę modelu językowego, określone parametry (np. „temperaturę” odpowiadającą za kreatywność) oraz połączony prompt i zawartość komórki wejściowej.
  3. Strzał do API za pomocą UrlFetchApp: To najważniejszy moment. Apps Script używa wbudowanej klasy UrlFetchApp.fetch(), wysyłając zapytanie na podany adres URL dostawcy i czeka na odpowiedź. [3]
  4. Parsowanie wyniku: Odpowiedź wraca jako surowy ciąg znaków w formacie JSON. Skrypt musi go przetłumaczyć (za pomocą JSON.parse()), wyciągnąć wyłącznie wygenerowany tekst i zwrócić do arkusza.

Gdy zastosujesz tę logikę, skrypt staje się odporny na losowe zacięcia. Zamiast zwracać usterkę systemu, w komórce pojawi się czytelna wartość, np. „Błąd połączenia: spróbuj ponownie”, co ułatwi diagnozę.

Kryteria wyboru sposobu uruchamiania AI: formuła, menu czy przetwarzanie wsadowe

Mając gotowy skrypt, stajesz przed kluczową decyzją: jak go wywoływać, aby arkusz działał płynnie i nie generował

niepotrzebnych kosztów z powodu wielokrotnych, trudnych do opanowania zapytań do API.

Ekran laptopa z kodem w programie do debugowania
Źródło: Pexels | Autor: Daniil Komov

Najbardziej kuszące i naturalne dla każdego użytkownika Excela czy Google Sheets jest stworzenie po prostu formuły w komórce. Wpisujesz =MOJE_AI(A2), przeciągasz w dół i czekasz na magię. Niestety, to największa pułapka w pracy z zewnętrznymi modelami językowymi. Przyczyną jest sam silnik przeliczeniowy arkusza. Formuły nie są statyczne. Każde posortowanie kolumny, dodanie nowego wiersza na początku tabeli, zmiana filtrów czy nawet odświeżenie strony w przeglądarce może zmusić Google Sheets do ponownego przeliczenia całego widoku. Zanim się zorientujesz, twój skrypt wyśle do API kilkaset zapytań o dokładnie te same dane, co bezlitośnie zużyje twój budżet i wywoła blokadę dostawcy.

Rozwiązaniem tego problemu jest przeniesienie kontroli z silnika przeliczeniowego bezpośrednio na ciebie. Zamiast zmuszać arkusz do ciągłego nasłuchiwania zmian, lepiej wykorzystać Apps Script do stworzenia dedykowanego menu. Dodając kilka linijek kodu (za pomocą funkcji onOpen()), możesz wygenerować na górnym pasku narzędzi własną zakładkę, np. „Narzędzia AI” z przyciskiem „Wygeneruj opisy”. Taki skrypt działa na żądanie: pobiera dane z zaznaczonych przez ciebie komórek, łączy się z API i – co najważniejsze – wkleja z powrotem zwykły tekst, a nie formułę. Raz wygenerowany wynik zostaje w arkuszu na zawsze i nie jest podatny na żadne przeliczenia.

Dłonie programisty piszącego kod na laptopie
Źródło: Pexels | Autor: Alicia Christin Gerald

Co jednak w sytuacji, gdy do przetworzenia masz bazę tysiąca opinii klientów? Zarówno formuła, jak i proste kliknięcie z menu tutaj zawiodą, ponieważ Apps Script zatrzyma się po 6 minutach pracy (to twardy limit czasowy dla makr Google). Wtedy jedynym bezpiecznym wyjściem jest zbudowanie skryptu do przetwarzania wsadowego (batch processing).

Logika przetwarzania wsadowego rozwiązuje problem opóźnień i limitów poprzez sekwencyjne zarządzanie wierszami. Zamiast atakować API setkami zapytań na sekundę, twój skrypt powinien działać według prostego cyklu:

  • Przeskanuj wybraną kolumnę i znajdź pierwszy wiersz, który w kolumnie „Status” ma wartość „Do przetworzenia”.
  • Wyślij pojedyncze zapytanie do API dla tego wiersza.
  • Odbierz wynik, wklej go jako tekst, a status zmień na „Gotowe”.
  • Wymuś sekundę przerwy w kodzie (używając Utilities.sleep(1000)), aby uniknąć błędu 429 (Too Many Requests).
  • Przejdź do następnego wiersza.

Jeśli w trakcie takiej pętli skrypt ulegnie awarii, zerwie się połączenie z Internetem lub Google przerwie jego działanie po 6 minutach, niczego nie tracisz. Przy ponownym uruchomieniu, skrypt po prostu zignoruje wiersze oznaczone jako „Gotowe” i wznowi pracę dokładnie tam, gdzie skończył. To eliminuje frustrację związaną z utratą danych i powielaniem kosztów.

Czego bezwzględnie unikać? Tworzenia hybryd, czyli makr, które automatycznie wpisują formuły AI do komórek, zamiast wpisywać tam gotowy tekst. Arkusze Google to genialne narzędzie do wizualizacji i manipulacji danymi, ale nie są przystosowane do pełnienia roli aktywnej bazy danych z ciężkimi, asynchronicznymi zapytaniami sieciowymi w tle. Pozostawienie setek aktywnych formuł API w pliku to gwarancja jego całkowitego zawieszenia.

Końcowa rekomendacja: Jeśli chcesz wdrożyć własną funkcję AI w sposób niezawodny, zapomnij o stosowaniu jej bezpośrednio jako typowej formuły w komórce do masowej pracy. Traktuj Apps Script jako inteligentnego kuriera między twoją tabelą a modelem językowym. Najbardziej stabilnym scenariuszem jest posiadanie kolumny na dane wejściowe, kolumny na wynik i przycisku (lub dedykowanego menu), który uruchamia skrypt. Dzięki temu zyskujesz pełną kontrolę nad momentem wykonania zapytania, chronisz swój klucz API przed nadużyciami i zachowujesz idealną płynność działania samego arkusza Google.

Najczęściej zadawane pytania (FAQ)

Czy funkcja AI w Google Sheets nadaje się do przetwarzania setek wierszy?

Formuła w komórce sprawdza się głównie przy pojedynczej analizie lub kilku rekordach. Przy większych zakresach bezpieczniej użyć Apps Script uruchamianego z menu, przycisku albo harmonogramu i zapisywać wyniki jako zwykłe wartości.

Dlaczego po skopiowaniu formuły AI w dół arkusza pojawia się błąd 429?

Skopiowanie formuły może spowodować wysłanie wielu żądań do API niemal jednocześnie. Dostawca usługi może wtedy zastosować limit liczby zapytań lub tokenów i zwrócić błąd HTTP 429 Too Many Requests.

Gdzie przechowywać klucz API używany przez Apps Script?

Klucz API należy przechowywać we właściwościach skryptu za pomocą usługi PropertiesService, zamiast wpisywać go bezpośrednio w kodzie. Warto również ustawić limit wydatków na koncie dostawcy API.

Co zrobić, aby wynik AI nie generował się ponownie przy każdym przeliczeniu arkusza?

Oddziel generowanie odpowiedzi od jej zapisu. Uruchamiaj skrypt w kontrolowany sposób, a otrzymany tekst zapisuj jako zwykłą wartość, a nie jako formułę zależną od ponownego przeliczenia.

Jak ograniczyć liczbę błędów podczas komunikacji z API?

Skrypt powinien sprawdzać kompletność danych wejściowych, pusty prompt, status wiersza i limity dostawcy. Warto także zastosować blok try…catch, aby przechwytywać błędy sieciowe i zwracać czytelny komunikat.

Źródła

Poprzedni artykułWyrównywanie, format liczb i daty w Google Sheets wyjaśnione prosto
Agnieszka Suwalski
Agnieszka Suwalski zajmuje się projektowaniem szablonów Google Sheets dla freelancerów, małych firm i organizacji pozarządowych. Łączy doświadczenie w zarządzaniu projektami z praktyczną znajomością narzędzi online. Tworząc poradniki, zaczyna od realnego problemu użytkownika, a następnie krok po kroku buduje rozwiązanie, testując je w kilku scenariuszach. Dba o to, by arkusze były intuicyjne także dla osób mniej technicznych. W swoich tekstach zwraca uwagę na ergonomię, przejrzystość instrukcji i możliwość dalszej rozbudowy szablonów bez konieczności pisania kodu.