Predstavte si situáciu, že vám každý deň prebehne skript, ktorý vám vytiahne všetky potrebné údaje z Google Analytics 4 za včerajší deň. Takto si zbierate všetky dni – deň za dňom. Jediné, čo musíte robiť manuálne, je každodenné kopírovanie vytiahnutých údajov za včerajšok, pretože už zajtra tam budú nové údaje.
Dá sa to zvládnuť, pokiaľ nie ste na dovolenke alebo nie je víkend. Tak prečo si nepomôcť vytvorením skriptu na automatické kopírovanie údajov priamo v Google Sheets?
Apps Script = makro v Exceli
Ak ste boli zvyknutí tvoriť makrá v Exceli, v Google Sheets si musíte zvyknúť na Apps Script. Ide o jednoduchú aplikáciu na tvorbu skriptu, ktorý viete použiť v danom súbore, či dokonca načasovať jeho spúšťanie. Podľa mnohých pomerne podceňovaná funkčnosť v Google ekosystéme.
V uvedenom príklade si vytvoríme skript, ktorý bude kopírovať hodnoty z rozsahu stĺpcov I:M a vkladať ich pod posledný riadok rozsahu A:E.
Apps Script v Google Sheets – kde to nájdem?
Otvorte si akýkoľvek Google Sheets online. Ak ho nemáte vytvorený, napíšte do prehliadača skratku sheet.new a otvorí sa vám nový, čistý hárok v Google Sheets.
V menu prejdite do sekcie Rozšírenia a z ponuky vyberte Apps Script.

V Apps Script vložíme len nasledovný skript a celý projekt si pomenujeme podľa seba – napríklad Denné kopírovanie údajov.
Celý skript na vloženie:
function copyRawDataToFirstRow() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Hárok1");
// --- get source data from I:M starting at row 2 ---
var lastRowIM = sheet.getLastRow();
if (lastRowIM < 2) return; // nothing to copy
var sourceRange = sheet.getRange(2, 9, lastRowIM - 1, 5); // I:M
var values = sourceRange.getValues();
// --- find last filled row only in A:E ---
var lastRowAE = 0;
for (var col = 1; col <= 5; col++) { // loop A to E
var colLast = sheet.getRange(1, col, sheet.getLastRow(), 1).getValues()
.map(String).reverse().findIndex(v => v.trim() !== "");
if (colLast !== -1) {
var rowNum = sheet.getLastRow() - colLast;
if (rowNum > lastRowAE) lastRowAE = rowNum;
}
}
// --- paste under the last row in A:E ---
var pasteStartRow = lastRowAE + 1;
sheet.getRange(pasteStartRow, 1, values.length, 5).setValues(values);
}
Vysvetlenie skriptu po častiach
V prvej časti skriptu si len zadefinujeme názov hárku, do ktorého budeme vkladať kopírované údaje a teda Hárok1:
function copyRawDataToFirstRow() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("Hárok1");
V druhej časti zadefinujeme rozsah údajov, ktoré sa majú kopírovať – rozsah I:M od druhého riadku po posledný:
// --- get source data from I:M starting at row 2 ---
var lastRowIM = sheet.getLastRow();
if (lastRowIM < 2) return; // nothing to copy
var sourceRange = sheet.getRange(2, 9, lastRowIM - 1, 5); // I:M
var values = sourceRange.getValues();
V tretej časti kódu musíme nájsť posledný riadok v rozsahu A:E, pod ktorý sa budú vkladať skopírované údaje rozsahu I:M:
// --- find last filled row only in A:E ---
var lastRowAE = 0;
for (var col = 1; col <= 5; col++) { // loop A to E
var colLast = sheet.getRange(1, col, sheet.getLastRow(), 1).getValues()
.map(String).reverse().findIndex(v => v.trim() !== "");
if (colLast !== -1) {
var rowNum = sheet.getLastRow() - colLast;
if (rowNum > lastRowAE) lastRowAE = rowNum;
}
}
// --- paste under the last row in A:E ---
var pasteStartRow = lastRowAE + 1;
sheet.getRange(pasteStartRow, 1, values.length, 5).setValues(values);
}
Testovanie skriptu
To, či máme všetko správne nastavené, nám prezradí prvý test – Debug. Ešte predtým si však musíme skript uložiť do projektov:


Časovanie spúšťania skriptu
Aby sme skript využili naplno, musíme nastaviť ešte správne načasovanie.
Aby sme ho nemuseli spúšťať manuálne, nastavíme si automatické spúšťanie v pravidelných intervaloch.
V Apps Script v ľavom menu si vyberte z ponuky Triggers -> Add Trigger. Tu si vyberieme z možností:
Choose which function to run: názov našej funkciea ted a copyRawDataToFirstRow
Choose which deployment should run: Hlavička
Select event source: Time-driven
Select type of time based trigger: Day timer
Select hour interval: 12pm to 1pm
Takto nastavíme, aby sa skript automaticky spúšťal každý deň približne o 12:00 na obed. Tu si môžete nastaviť vlastnú frekvenciu a čas spúšťania tak, ako vám najviac vyhovuje.

Ďalšou možnosťou by mohlo byť odpaľovanie skriptu vždy pri otvorení súboru, pri zmene v súbore a podobne:

Spúšťanie skriptu v praxi:
V nasledovnej nahrávke môžete vidieť, ako sa skript spúšťa manuálne a aké operácie vykonáva skript v praxi:



