AdWords skripty – znovupoužití kódu pomocí vlastních knihoven

adwords skript funkce eval


Pokud vytváříte AdWords skripty a buď (1.) nechcete psát stejný kód opakovaně, (2.) chcete mít možnost změnit kód na jednom místě a mít ho tím změněný všude, (3.) chcete svůj kód spustit v klientském účtu a přitom jej skrýt (4.) oceníte, když bude váš skript kratší a čitelnější, čtete ten správný článek. Ukážeme vám, jak to děláme my, i na co si dáváme pozor. Prostě a jednoduše, jak používáme funkci eval().

 

Co dělá funkce eval()

Funkce eval(<nějaký text>) v JavaScriptu spustí <nějaký text>, jako by to byl JavaScript. To znamená, že pokud např. v kódu svého skriptu zadáte

01: eval("Logger.log(\"ahoj\");");

nebo to samé provedete přes proměnnou takto:

01: var runme = "Logger.log(\"ahoj\");";
02: eval(runme);

provede se ve skutečnosti kód zadaný uvnitř funkce eval(), to jest:

01: Logger.log("ahoj");

Dál už je to zřejmé. Pokud do proměnné tuna_kodu uložíte 10.000 řádků kódu, stačí napsat do svého skriptu eval(tuna_kodu); a tento jeden řádek se nahradí 10.000 řádky z proměnné tuna_kodu. Když si těch 10.000 řádků uložíte např. na svůj Google Drive jako soubor uzitecne_funkce.js, stačí tento soubor načíst do proměnné tuna_kodu, spustit funkci eval(tuna_kodu) a v okamžení máte ve svém skriptu k dispozici všechny funkce, které jsou uloženy v souboru uzitecne_funkce.js. Napsáním dvou řádků kódu. Pěkné, že?

 

Vytváření vlastních knihoven

Taková báječná funkce jako je eval() nám nedá spát a pustíme se do vývoje vlastní knihovny. Osvědčilo se nám projít více vlastních skriptů a identifikovat řekněme “sofistikovanější” funkce, které se v nich opakují a až v takovém případě zvážit jejich začlenění do nějaké knihovny. Snažit se do knihoven zadat každou maličkost vám dlouhodobě nepomůže, věřte nám. Nepodceňujte komentování funkcí a jejich nápovědné názvy, připište si v komentáři informaci o vstupních a výstupních typech proměnných; JavaScript je slabě typovaný, bude se vám to hodit.

A jak to vypadá v reálu? Řekněme, že jsme vyvinuli funkci slaba_kw_iterator(label). Tato funkce vrací iterátor klíčových slov se špatným výkonem a přitom vysokými náklady ze sestav s nějakým štítkem. Funkci používáme v reportu, v alarmu a taky ve dvou automatech, které upravují MaxCPC. Proč mít ale tu stejnou funkci fyzicky napsanou 4-krát ve čtyřech různých skriptech? To nedává smysl. Co když ji v jednom skriptu upravím a v ostatních na to zapomenu? Jak to udržet pohromadě? Právě od toho je naše knihovna.

Použijeme ji následovně: kód funkce slaba_kw_iterator(label) budeme mít na Google Drive v knihovně uzitecne_funkce.js. Zjistíme si id tohoto souboru, štítek sestav je řekněme “kw_tipy”. Knihovnu a funkci pak zpřístupníme ve vlastním skriptu takto:

 

01: var soubor = DriveApp.getFileById("0B3xq71rnUbdFY3dXaANmWkZFWGS");
02: var knihovna = soubor.getAs('application/javascript');
03: eval(knihovna.getDataAsString());
04: 
05: function main() {
06:   var kwSlabaIterator = slaba_kw_iterator("kw_tipy");
07: }

 

Firemní skripty v klientských účtech (pro správce MCC)

Výše uvedený postup lze použít nejen pro balíky funkcí, ale i pro celé skripty. To má smysl, pokud spravujete vlastní MCC a své skripty chcete vkládat do klientských účtů. Že skripty budete spouštět pro všechny klienty přímo z MCC? Například pomocí funkce executeInParallel? No, zkuste to, a pokud vám to přeroste přes hlavu tak jako nám, čtěte dál. 

A až se rozhodnete své skripty vkládat do klientských účtů, vzpomeňte si na funkci eval() a v každém případě ji použijte na celé skripty. Nese to s sebou totiž hned několik báječných výhod: vámi autorizovaný skript bude extrémně krátký, váš kód zůstane klientovi ukrytý (ochrana firemního know-how), protože k souboru s kódem máte přístup jen vy na svém Google Drive a vámi autorizovaný skript, klient nikoliv, a pokud skript vylepšíte, změnou v knihovně dojde k “upgrade” ve všech klientských účtech, na kterých skript běží. Běh skriptů přitom nebude zbytečně plnit logy ve vašem MCC. To už skoro vypadá jako pěkný balík bonusů. Jak takový skript v účtu klienta může vypadat? Náš vypadá přibližně takto:

 

01: //--- PARAMETRY PUBLIC INDIVIDUALNI ---
02: var URL_SHEET_KLIENT = "0B3xq71rnUbdFY3dXaANmWkZFWGS";
03: //------------------------------------
04: var runsheet = SpreadsheetApp.openById("wmc6QWA27bO1k9orENf97Q4lBLYdLls75g").getSheetByName("kod");
05: var kod_main = runsheet.getRange(1,1).getValue();
06: var kod = runsheet.getRange(2,1).getValue();
07: eval(kod);
08: 
09: function main() 
10: {
11:   eval(kod_main);
12: }

 

V klientském skriptu používáme funkci eval() 2-krát. Jednak mimo funkci main() načteme kód, který obsahuje všechny funkce a další globální proměnné (řádek 7), dále pak načteme obsah funkce main() (řádek 11). Tato dvě volání eval() načtou kód, který je společný pro všechny klienty.

Navíc ale pro každého klienta spravujeme jeho vlastní sheet (do kterého nemá přístup). Id tohto sheetu zadáme do globální proměnné (řádek 2). Je to jediné místo, ve kterém se skripty v jednotlivých klientských instalacích liší. V tomto sheetu pak máme veškeré proměnné a parametry, jejichž hodnoty se pro jednotlivé klienty liší. To s sebou nese tu výhodu, že pokud provedeme ve skriptu radikální změny typu přidání zcela nových proměnných, jen je přidáme do klientova sheetu a ve skriptu z něj hodnoty těchto nových proměnných načteme. Na všech účtech tedy máme stejnou aktuální verzi skriptu, instalace se liší jen hodnotami parametrů v jednotlivých klientských sheetech. Ať už děláme jakoukoliv úpravu (nad stovkami účtů), nemusíme žádný klientský účet otevírat! Co se týče časových úspor, nedocenitelné. Skripty samotné archivujeme (starší verze) i načítáme z Google Sheetu. Není to příliš elegantní, takže si to vylepšete a hned budete lepší než my.

 

Čeho se vyvarovat

Cizí knihovnu (bez důkladného projití celého kódu) bychom v žádném případě nepoužili, a pokud ano, tak bychom ji zkopírovali a uložili si na vlastní Google Drive. Uvědomte si, že pokud byste použili knihovnu zpřístupněnou někým na webu, její majitel by mohl své funkce za čas změnit a ve vašich skriptech by se mohly dít ošklivé věci.

To platí i pro další problém – v kódu našich knihoven, které spouštíme pomocí funkce eval(), nikdy nenačítáme data z cizích webů. Touto cestou lze totiž podstrčit do vašeho skriptu cizí kód. Je to sice zcela nepravděpodobné, ale jsme paranoidní, jde o účty našich klientů! Takže to neděláme. A vám doporučujeme totéž.

A poslední tip: vyvarujte se nekonečných smyček způsobených voláním sebe sama pomocí funkce eval(). Pokud byste např. ve své knihovně použili funkci eval() a v ní se odkazovali na tu stejnou knihovnu, ze které eval() voláte, vytvoříte skript s nekončenou smyčkou. S odkazem na fakt, že nekonečno je neuchopitelné až mystické a ve vašem skriptu nemá co dělat, se s vámi loučíme a těšíme se u dalšího článku.

 

bezplatná kontrola adwords