Ne nadarmo se říká, že opakování je matka moudrosti. To sice platí při učení, nikoliv však při práci na počítači, kde se snažíme opakování stejných činností vyhnout a maximálně je automatizovat. Tuto skutečnost si již před lety uvědomil Apple, který do svého desktopového operačního systému, tehdy zvaného System 7, integroval podporu skriptovacího jazyka s příznačným názvem AppleScript. Tento jazyk existuje dodnes a těší se velké oblibě jak u uživatelů píšících svoje vlastní skripty, tak i u vývojářů, kteří umožňují svoje aplikace pomocí AppleScriptu automaticky ovládat.
Na začátek uveďme, že tento návod nevyžaduje žádnou předchozí znalost programování a je koncipován tak, aby se z něj mohl základy AppleScriptu naučit i úplný začátečník. Zároveň obsahuje určitá zjednodušení (hlavně v terminologii), která nám profesionální programátoři jistě odpustí. Cílem je, aby byl návod opravdu pro každého, kdo má chuť s AppleScriptem začít.
Co je to AppleScript
AppleScript je skriptovací jazyk od společnosti Apple, jehož základní myšlenkou je umožnit automatizované ovládání skriptovatelných aplikací a některých částí operačního systému. Samotný jazyk je velmi jednoduchý a jeho možnosti jsou oproti jiným jazykům vcelku omezené (neposkytuje například logaritmické funkce či regulární výrazy). To, co dělá AppleScript silným nástrojem, jsou samotné aplikace, které jeho možnosti rozšiřují o sady příkazů (v podobě tzv. slovníků, dictionary), které definují, jaké akce lze v aplikacích programově provádět. Díky AppleScriptu můžete aplikace ovládat samostatně, ale také spojovat do komplexních celků a postupně s nimi „obrábět“ data (např. stáhni soubor z FTP, edituj jej a odešli e-mailem na určitou adresu).
K používání AppleScriptu nemusíte být zkušeným programátorem. Syntaxe je velmi jednoduchá a podobá se anglickým větám typu „řekni aplikaci ABC aby udělala akci XYZ“. Jazyk je navržený tak, aby se jej mohli naučit i uživatelé s nulovými znalostmi programování.
Automatizovat lze téměř všechny předinstalované aplikace macOS jako Zprávy, Mail, Kalendář, Safari nebo Finder, ale také aplikace třetích stran jako například Microsoft Excel, Skype, OmniFocus, Atom, Evernote a další. S velmi rozsáhlou podporou pro skriptování jsou dodávány produkty od Adobe zahrnující Photoshop, Illustrator, InDesign či Acrobat.
Jak zjistit, jaké aplikace na Vašem Macu skriptování podporují? Otevřete aplikaci s názvem Editor skriptů (Script Editor), která je standardní součástí macOS. V jejím menu pak klikněte na Soubor > Otevřít slovník… V zobrazeném okně uvidíte všechny aplikace, které poskytují slovník s příkazy pro AppleScript. Po kliknutí na konkrétní aplikaci pak dojde k otevření jejího slovníku, ve kterém najdete seznam podporovaných příkazů, jejich popis, parametry a návratový typ.
Začínáme od konce
Nejjednodušší způsob, jak se naučit nový programovací či skriptovací jazyk je využít ho v praxi. Proto začneme tak trochu od konce a nejdříve vám ukážeme, jak jednoduchý AppleScript spustit. Díky tomu budete moct rovnou vyzkoušet i další skripty v tomto článku a AppleScript se vám tak dostane rychleji pod kůži.
Jak už bylo řečeno, Apple dodává s macOS aplikaci nazvanou Editor skriptů (Script Editor), která slouží k vytváření, upravování a ladění AppleScriptů. Nejedná se sice o žádné pokročilé vývojové prostředí, ale je zdarma a na psaní běžných skriptů je naprosto dostačující. Otevřete tedy tuto aplikaci a vložte do ní níže uvedený skript.
tell application "Finder" open trash end tell
I bez znalosti pokročilé angličtiny lze vyčíst, že skript řekne aplikaci Finder, aby otevřela koš. Po skončení skriptu by se tedy na Vaší ploše mělo objevit okno koše. Ptáte se, jak AppleSkript v Editoru skriptů spustit? V nástrojové liště stiskněte tlačítko Spustit nebo použijte klávesovou zkratku Command(⌘)+R.
Nyní už víte, jak AppleScript spouštět a je tedy na čase ponořit se hlouběji do jeho možností. Místo suchého výčtu příkazů jsme pro vás vybrali nejpoužívanější jazykové konstrukce a řadu praktických příkladů, které vám pomohou při psaní vlastních skriptů.
Komentáře
Než začnete se samotným kódem, je vhodné vědět, jak k němu psát komentáře. Obecně je psaní komentářů dobrý nápad, protože vám pomohou orientovat se v komplexnějších skriptech a vzpomenout si jak fungují, když se k nim vrátíte po delší době. AppleScript nabízí několik způsobů, jak kód komentovat. Nejdříve se podívejte na jednořádkové komentáře:
-- toto je jednořádkový komentář display dialog ((current date) as text) buttons {"OK"} display dialog "ahoj" -- jednořádkové komentáře mohou být umístěny i na konci řádky
Jednořádkový komentář začíná dvěma mínusy, je ovšem možné je nahradit také hashtagem (#), který je běžný i v jiných programovacích jazycích. Pokud je komentář delší, je přehlednější jej formátovat jako víceřádkový:
-- víceřádkový komentář je možné -- složit z jednořádkových komentářů display dialog ((current date) as text) buttons {"OK"} (* toto je preferovaný způsob jak psát v AppleScriptu víceřádkové komentáře *) display dialog "ahoj"
Komentáře budeme využívat ve všech příkladech tohoto článku, nyní Vás už tedy nemohou překvapit.
Proměnné
Zjednodušeně řečeno, proměnná je pojmenované umístění v paměti počítače, na které ukládáme určitou hodnotu (binární data, číslo, text, …). Bez proměnných by nebylo možné psát složitější skripty, protože je často potřeba uchovat nějakou hodnotu či výsledek operace k pozdějšímu použití ve Vašem skriptu. V takovou chvíli použijte proměnnou. Proměnným můžete také přiřazovat popisná jména, čímž dosáhnete lepší přehlednosti skriptu a zvýšíte jeho čitelnost. V AppleScriptu se proměnné definují pomocí volání set následovaného názvem proměnné. Hodnota proměnné se přiřadí použitím klíčového slova to. Přečíst ji pak můžete voláním get.
Začněme s příklady proměnných jednoduchých datových typů :
-- proměnná typu boolean (true / false) set x to true get x -- proměnná typu integer (celé číslo) set x to 1 get x -- proměnná typu real (reálné číslo) set x to 1.1 get x -- proměnná typu string (textový řetězec) set x to "abc" get x
AppleScript podporuje také proměnné komplexních datových typů:
-- proměnná typu list set mujList to {"jedna", "dva", "tri"} --vytvoří list se třemi položkami get item 2 of mujList --přečte hodnotu na indexu 2 -- proměnná typu record (ve formátu klíč:hodnota) set mujRecord to {jedna:1, dva:1, tri:3} --vytvoří record se třemi položkami get jedna of mujRecord --přečte hodnotu uloženou pod klíčem "jedna" -- proměnná typu reference, neboli odkaz na objekt (např. aktivní záložku prvního okna Safari) set mojeZalozka to current tab of window 1 get mojeZalozka
Součástí definice proměnné není její datový typ, který určuje, jak je hodnota proměnné reprezentována v paměti. V takovém případě se AppleScript sám pokusí typ rozpoznat na základě hodnoty proměnné (např. ukládáte-li text, proměnná je typována jako string, …). Je ovšem možné datový typ explicitně definovat za hodnotou proměnné:
-- hodnota je definována jako textový řetězec, my ale explicitně vynutíme reálné číslo set x to "1.1" as real
AppleScript umožňuje použít následující datové typy:
- integer – celé číslo
- real – reálné číslo
- string – textový řetězec
- list – kolekce prvků přístupných na základě indexu
- record – kolekce prvků přístupných na základě klíče (uložené jako klíč:hodnota)
- boolean – datový typ s hodnotami true / false (pravda / nepravda)
- reference – odkaz na objekt (okno aplikace, soubor, URL, … )
- date – datum
Nyní se podívejte na dva příklady, jak lze proměnné použít:
--příprava e-mailové zprávy set subjekt to "Mail pro web Be Apple Pro" set obsah to "Tento e-mail je vytvořen skriptem!" tell application "Mail" set zprava to make new outgoing message with properties {subject:subjekt, content:obsah} end tell --otevření URL webu v prohlížeči Safari set mojeURL to "https://www.beapple.pro" tell application "Safari" tell window 1 set current tab to (make new tab with properties {URL:mojeURL}) end tell end tell
Práce s textem
Zpracování textu (proměnných typu string) je ve skriptech běžné, zvláště proto, že textový vstup a výstup je hlavním způsobem, jak Váš skript může komunikovat s uživatelem. Proto si práce s textem zaslouží vlastní kapitolu, kde vám ukážeme, jak vypadají nejčastější operace s textovými řetězci.
Začněme spojováním textů, které se provádí pomocí znaku ampersand (&) :
set jmeno to "Karel" set veta to "Jmenuji se " & jmeno
U některých operací se AppleScript pokouší převést text na vhodný datový typ automaticky. Na příkladu níže vidíte, jak automatická konverze datových typů funguje:
set chybnaOperace to "jedna" - 2 --operace vyvolá chybu: Nelze převést "jedna" na číslo set spravnaOperace to "1" - 2 --text "1" je převeden na číslo automaticky a výpočet je proveden
Jak už bylo zmíněno v kapitole o proměnných, datový typ lze explicitně uvést při definici proměnné. Můžeme tedy text interpretovat jako jiný datový typ a obráceně:
set prevodNaCislo to "15" as number set prevodNaText to 12 as string
Velmi užitečnou operací je zjištění délky textu. Mějte na paměti, že jsou počítány i bílé znaky (např. mezera):
set delkaTextu to the length of "Jmenuji se Karel" --text o délce 16 znaků (včetně mezer)
Z textu lze snadno přečíst jeho konkrétní části, slova a písmena:
set mujText to "Toto je můj text" word 3 of mujText --přečte třetí slovo textu, tedy "můj" character 6 of mujText --přečtě šesté písmeno textu, tedy "j" characters 1 thru 4 of mujText -- vrátí znaky 1 - 4 jako pole {"T", "o", "t", "o"} characters 1 thru 4 of mujText as string --vrátí znaky 1 - 4 jako text "Toto" text 1 thru 4 of mujText --vrátí znaky 1 - 4 jako text "Toto"
Při vyhledávání pozice libovolného znaku nebo řetězce v textu můžete využít volání offset:
set mujText to "Toto je můj text" offset of "ů" in mujText --zjistí pozici znaku "ů", která je 10 text 1 thru (offset of "ů" in mujText) of mujText --zachová text od jeho začátku po znak "ů"
Strukturovaný text lze rozdělit na základě oddělovače (delimiter) a získat tak separované části textu ve formátu listu. Před vlastní operací rozdělení textu je nejdříve nutné do proměnné s názvem AppleScript’s text item delimiters nastavit, jakou hodnotu oddělovač ve zpracovávaném textu má (čárka, středník, lomítko, …). Hodnotu oddělovače lze ve skriptu libovolně měnit (tedy nastavit ji na různých místech jinak):
set mujText to "Karel,Josef,Martin" --text je oddělený pomocí čárek (delimiter je čárka) set AppleScript's text item delimiters to "," --nastaví oddělovač (delimiter) na čárku set osoby to text items of mujText --rozdělí text, výstup je list {"Karel", "Josef", "Martin"}
Práce s listy
Listy (seznamy) jsou nedílnou součástí většiny programovacích a skriptovacích jazyků. Umožňují pracovat s více hodnotami najednou a provádět nad nimi operace, které by se při použití oddělených proměnných prováděly složitě. Do listu se většinou ukládají hodnoty, které spolu určitým způsobem souvisejí:
set tyden to {"Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota", "Neděle"}
Na druhou stranu AppleScript umožňuje ukládat do listu i data, která jsou různá a mají různé datové typy:
set ruznaData to {"Jablko", 1.222, "01/01/2018"}
Obsah listu lze samozřejmě i měnit. Jednotlivé položky listu jsou adresovány pomocí indexů. Podporované jdou dva způsoby:
set cisla to {"jedna", "čtyři", "tři"} set item 2 of cisla to "dva" --změní druhou položku listu na "dva" set the 2nd item of cisla to "dva" --změní druhou položku listu na "dva"
Do listu můžete položky i přidávat a to jak na začátek, tak i na konec:
set cisla to {"jedna", "dva", "tři"} set beginning of cisla to "nula" --přidá položku na začátek listu set end of cisla to "čtyři" --přidá položku na konec listu
List můžete snadno zkrátit tím, že vytvoříte nový list a určíte jeho začátek a konec v rámci původního listu. Je to také jediný způsob, jak položky mazat, protože operace mazání z listu není v AppleScriptu přímo podporována:
set pismena to {"a", "b", "c", "d", "e", "f"} set zkracenaPismena to items 2 through 4 of pismena --vrátí list položek 2-4, tedy {"b", "c", "d"}
Někdy je nutné zjistit, zda list obsahuje určitou položku. Toho docílíte pomocí contains:
set mesice to {"Leden", "Únor", "Březen", "Duben"} mesice contains "Květen" --vrátí false, list položku "Květen" neobsahuje
Dva listy lze spojit stejně, jako textové řetězce:
set prvni to {"a", "b", "c"} set druhy to {"d", "e", "f"} set spojeny to prvni & druhy -- vrátí list {"a", "b", "c", "d", "e", "f"}
AppleScript poskytuje možnost obrátit pořadí položek v listu voláním reverse:
set obracenePoradi to reverse of {3, 2, 1} --vrátí list {1, 2, 3}
Textový řetězec můžete převést na list jednotlivých znaků:
set znaky to every character of "Apple" --vrátí list {"A", "p", "p", "l", "e"}
Počet položek listu zjistíte voláním count:
set pismena to {"a", "b", "c"} count pismena --vrátí počet položek listu, tedy 3
Práce s recordy
Record je neseřazená kolekce pojmenovaných hodnot. Každá položka recordu má formát klíč:hodnota, kde klíčem může být pouze text (datový typ string) a hodnotou pak libovolný datový typ podporovaný AppleScriptem. Na základě klíče se pak jednotlivé položky adresují. To je také hlavní rozdíl oproti listu, kde lze položky adresovat pouze pomocí indexu (pozice v listu). Podívejte se, jak může takový jednoduchý record vypadat:
set osoba to {jmeno:"Karel", vek:20, vyska:180}
Ani změna hodnoty položky recordu není problém, musíte ji ovšem adresovat pomocí klíče:
set osoba to {jmeno:"Karel", vek:20, vyska:180} set vek of osoba to 30 --změní položku s klíčem "vek" v recordu "osoba" na hodnotu 30
Jakmile record vytvoříte, není do něj už možné přidávat další položky ani je odebírat. V takovém případě musíte vždy vytvořit nový record a vybrané položky z toho původního do něj zkopírovat. Jediná podporovaná operace je sloučení dvou recordů:
set rozmery to {delka:10, sirka:20, vyska:30} set vlastnosti to {barva:"modra", vaha:10} set objekt to rozmery & vlastnosti --vrátí {delka:10, sirka:20, vyska:30, barva:"modra", vaha:10}
Stejně jako u listu můžete i o recordu zjistit jeho velikost, tedy počet položek:
set osoba to {jmeno:"Karel", vek:20, vyska:180} count osoba --vrátí počet položek recordu, tedy 3
Základní matematické operace
AppleScript je jazyk navržený k programovému ovládání aplikací, nikoliv provádění složitých matematických operací. Proto je počet matematických operátorů omezený jen na ty nejzákladnější:
- + pro sčítání
- – pro odečítání
- * pro násobení
- / pro dělení
- ^ pro umocňování
- div pro celočíselné dělení
- mod pro zbytek po celočíselném dělení
Teď, když už znáte proměnné a matematické operátory, je na čase si na několika příkladech ukázat, jak je v AppleScriptu společně použít:
--výpočet plochy obdélníku set sirka to 10 set vyska to 20 set plocha to sirka * vyska --výpočet hodin a minut ze zadaného času set cas to 130 --počet minut jako vstup výpočtu set hodiny to cas div 60 --celočíselné dělení, výsledek je 2 set sekundy to cas mod 60 --zbytek po celočíselném dělení, výsledek je 10 --výpočet druhé mocniny čísla set mocnina to 2 ^ 2 --výpočet druhé odmocniny čísla set odmocnina to 4 ^ (1 / 2)
Podmínky
Ve většině případů není skript lineární, ale obsahuje části, které se spustí pouze při splnění určité podmínky. To vám dovolí se rozhodnout například na základě hodnoty určité proměnné, uživatelského vstupu nebo výsledku nějaké operace. Podmínky mají strukturu pokud je splněna podmínka, pak možnost 1, jinak možnost 2. Syntaxe podmínky v AppleScriptu je následující.
-- podmínka if - else if podmínka then --pokud je splněna podmínka příkaz a --proveď příkaz a else -- jinak příkaz b -- proveď příkaz b end if --konec podmínky --část else lze úplně vynechat if podmínka then příkaz a end if --podmínku lze dále větvit za pomocí else if if podmínka x then --pokud je splněna podmínka x příkaz a --proveď příkaz a else if podmínka y then -- jinak, pokud je splněna podmínka y příkaz b -- proveď příkaz b else -- jinak příkaz c --proveď příkaz c end if --konec podmínky
Jednoduchá podmínka může vypadat následovně:
set vyskaJosef to 180 set vyskaKarel to 175 if vyskaJosef > vyskaKarel then display alert "Josef je větší" else display alert "Karel je větší" end if
Výše uvedený příklad zároveň ukazuje podmínku, ve které dochází k porovnání dvou čísel pomocí znaku > (je větší než). AppleScript podporuje následující operátory pro porovnání čísel:
- = (lze psát také jako is nebo is equal to)
- > (lze psát také jako is greater than)
- < (lze psát také jako is less than)
- >= (lze psát také jako is greater than or equal to)
- <= (lze psát také jako is less than or equal to)
Jak vidíte, operátory lze zapisovat také slovně. Níže uvedené podmínky jsou tedy ekvivalentní:
if 80 < 90 then příkaz a end if if 80 is less than 90 then příkaz a end if
Čísla samozřejmě nejsou jediným datovým typem, který lze v podmínkách použít. Velmi často je nutné provádět porovnání textových řetězců, přičemž můžete použít jeden z těchto operátorů:
- begins with (začíná řetězcem)
- ends with (končí řetězcem)
- is equal to (rovná se řetězci)
- comes before (předchází řetězci – abecedně)
- comes after (následuje po řetězci – abecedně)
- is in (je obsažen v řetězci)
- contains (obsahuje řetězec)
set veta to "Dnes je hezký den" --začíná věta slovem "Dnes"? if veta begins with "Dnes" then display alert "Text začíná slovem Dnes" end if --obsahuje věta text "zký"? if veta contains "zký" then display alert "Text obsahuje zký" end if --je písmeno "h" obsaženo ve větě? if "h" is in veta then display alert "Veta obsahuje pismeno h" end if
Ani na listy nebylo v podmínkách zapomenuto, ačkoliv počet operátorů použitelných pro porovnání je menší:
- begins with (list začíná položkou)
- ends with (list končí položkou)
- contains (list obsahuje položku)
- is equal to (list je roven)
- is in (položka je obsažena v listu)
Jak některé z těchto operátorů použít v praxi se podívejte v dalším příkladu:
set tyden to {"Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota", "Neděle"} if tyden starts with "Pondělí" then display alert "Týden začíná pondělím" end if if tyden contains "Středa" then display alert "Týden obsahuje Středu" end if if "Sobota" is in tyden then display alert "Sobota je také den v týdnu" end if
Omezený počet operátorů porovnání nabízí AppleScript také pro recordy:
- contains (obsahuje položku)
- is equal to (record je roven)
Jejich použití je velmi podobné jako u listů:
set osoba to {jmeno:"Karel", vek:20, vyska:180} --je možné se zeptat na položku recordu pomocí contains if osoba contains {jmeno:"Karel"} then display alert "To je Karel" end if --přehlednější je zeptat se přímo, zda má klíč určitou hodnotu if jmeno of osoba is "Karel" then display alert "To je Karel" end if
Ve všech předchozích příkladech byly podmínky uvedeny v pozitivním zápisu, lze je ovšem možné také negovat pomocí does not nebo is not. Jejich použití osvětlí následující příklad:
set tyden to {"Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota", "Neděle"} --negace pomocí does not if tyden does not start with "Úterý" then display alert "Týden nezačíná úterým" end if --negace pomocí is not if "Červenec" is not in tyden then display alert "Červenec není den v týdnu" end if
Často je nutné, aby bylo splněno více podmínek najednou. Ty lze pak řetězit pomocí and nebo or. V prvním případě musí platit obě podmínky, v druhém pouze jedna z nich:
set veta to "Dnes je hezký den" --začíná věta slovem "Dnes" a obsahuje text "zký"? if veta begins with "Dnes" and veta contains "zký" then display alert "Věta splňuje obě podmínky" end if --začíná věta slovem "Dnes"nebo obsahuje text "Zítra"? if veta begins with "Dnes" or veta contains "Zítra" then display alert "Věta splňuje jednu z podmínek" end if
Opakování
Velmi důležitou součástí každého programovacího nebo skriptovacího jazyka jsou cykly. Ty umožňují jednou nebo vícekrát opakovat část kódu na základě hodnoty proměnné, číselného intervalu, nebo podmínky.
Je-li počet opakování známý předem (může být konstantní nebo určený hodnotou proměnné), vypadá cyklus následovně:
set pocetOpakovani to 3 repeat pocetOpakovani times display alert "Tato zpráva se zobrazí 3x" end repeat
Jak už bylo řečeno, někdy chceme cyklus opakovat na základě určité podmínky. Podívejte se na dva příklady, jak takový cyklus funguje:
set podminkaSplnena to false --opakuj dokud je daná podmínka splněna repeat while podminkaSplnena is false --kód je opakován dokud je proměnná podminkaSplnena rovna false display alert "Tato zpráva se bude zobrazovat, dokud je proměnná podminkaSplnena rovna false" end repeat --opakuj dokud není daná podmínka splněna repeat until podminkaSplnena is true --kód je opakován dokud není proměnná podminkaSplnena rovna true display alert "Tato zpráva se bude zobrazovat, dokud není proměnná podminkaSplnena rovna true" end repeat
Poslední typ cyklu provádí opakování kódu na základě zadaného číselného intervalu:
--cyklus provede 5 obrátek po hodnotách 1, 2, 3, 4 a 5, krok je 1 repeat with counter from 1 to 5 display alert "Tato zpráva se zobrazí 5x" end repeat --cyklus provede 3 obrátky po hodnotách 1, 3 a 5, krok je 2 repeat with counter from 1 to 5 by 2 display alert "Tato zpráva se zobrazí 3x" end repeat
Handlery
Další jazykovou konstrukcí, která zásadně omezuje duplicitu kódu, jsou handlery. Ve zkratce, handler je pojmenovaná posloupnost příkazů, kterou lze volat na více místech skriptu. Handler tedy musíte někde ve skriptu nadefinovat a jinde pak použít. Zkušeným programátorům napovíme, že handler je obdobou funkce nebo metody z vyšších programovacích jazyků. Handler definujeme takto:
--definice handleru on pozdrav() --kód, který se spouští s každým zavoláním handleru display alert "Ahoj, jak se máš?" end pozdrav --použití (zavolání) handleru pozdrav()
Handleru mohou být také předány vstupní parametry (jeden či více, oddělené čárkami). Pokud je handler parametrizovaný, pak musí být hodnota parametru vždy vyplněna:
--handler akceptuje parametr "osloveni" on pozdrav(osloveni) display alert "Ahoj " & osloveni & ", jak se máš?" end pozdrav --zavolání handleru s hodnotou parametru "osloveni" nastavenou na "Karle" pozdrav("Karle") --toto volání skončí chybou, protože handler vyžaduje vstupní parametr, který není uveden pozdrav()
Nyní už víte, jak nadefinovat handler se vstupním parametrem. Handlery ovšem mohou také poskytovat návratovou hodnotu (výsledek), která je definována pomocí klíčového slova return:
--handler akceptuje 2 parametry a vrací jejich součet on scitani(a, b) return a + b end scitani --do proměnné "vysledek" je nastavena návratová hodnota handleru "scitani" set vysledek to scitani(1, 2)
Tell blok
Tell blok je základním stavebním kamenem AppleScriptu, umožňující programové ovládání aplikací. Díky němu můžete říci (tell) aplikaci, jaké příkazy má vykonat. Definice tell bloku je následující:
tell application "název aplikace" příkaz a příkaz b . . příkaz z end tell
Uveďme si komplexnější příklad, jak pomocí tell bloku využít aplikaci TextEdit k vyhledávání a nahrazování textu v textovém dokumentu.
tell application "TextEdit" -- Založ nový textový dokument make new document -- Do textového dokumentu vlož text set text of front document to "AppleScript se učím pomalu" -- Najdi specifické slovo a nahraď ho za jiné set every word of front document where it = "pomalu" to "rychle" end tell
Základní interakce s uživatelem
Váš skript může během svého spuštění zobrazovat oznámení (notifikace), které se hodí v případě, že potřebujete uživateli zobrazit krátký text (například informaci, že skript doběhl v pořádku). Výhodou takového oznámení je, že nijak neblokuje další běh skriptu a uživatel jej i později najde v centru oznámení macOS. Oznámení lze v AppleScriptu vytvořit následovně:
--oznámení může mít titulek, podtitulek, text a zvuk display notification "text" with title "Titulek" subtitle "Podtitulek" sound name "Ding" --titulek, podtitulek i text lze vynechat, vždy musíte uvést alespoň jeden z nich --zvuk je také nepovinný - pokud jej neuvedete, macOS použije implicitní zvuk display notification "text"
Často je nutné získat za běhu skriptu nějaká vstupní data od uživatele. K tomu slouží dialog:
--zobrazí dialog bez předvyplněné odpovědi set mujDialog to display dialog "Jak se jmenuješ?" default answer "" --do proměnné uloží text zadaný v dialogu set jmeno to text returned of mujDialog
Dialog poskytuje i pokročilejší možnosti, jako definici vlastních tlačítek či určení implicitně označeného (default) tlačítka:
display dialog "Zadejte vstup" default answer "" buttons {"Vlož", "Zruš"} default button "Vlož" --volání vrátí {button returned:"Vlož", text returned:"vstupní text"} --tedy zadaný text a název stisknutého tlačítka
Užitečnou možností je také maskování uživatelského vstupu pomocí hidden answer, které se využívá hlavně u zadávání hesla:
display dialog "Zadejte heslo" default answer "" with hidden answer
Dialog lze ovšem zobrazit i bez textového pole. V tu chvíli slouží pouze k informování uživatele, nikoliv k vložení uživatelského vstupu:
display dialog "Toto je můj dialog" buttons {"Ano", "Ne"} default button "Ano" cancel button "Ne" --volání vrátí stisknuté tlačítko, tedy např. {button returned:"Ano"}
Další možností, kterou jsme již mnohokrát využili v tomto článku je alert. Alert umožňuje zobrazit tučný nadpis a pod ním text:
set nadpis to "Chyba" set zprava to "Toto je chyba. Přejete si pokračovat?" display alert nadpis message zprava buttons {"Jistě", "Určitě ne"} default button "Jistě" --volání vrátí stisknuté tlačítko, tedy např. {button returned:"Jistě"}
Někdy chceme, aby uživatel nemohl vkládat libovolný text, ale vybral si z předpřipravených možností. K tomu slouží pole se seznamem. Stejně jako u tlačítek, můžete i zde vybrat implicitní (default) položku seznamu, která bude označena:
set velikosti to {"L", "XL", "XXL"} choose from list velikosti with prompt "Vyberte svoji velikost" default items {"L"} --volání vrátí vybranou položku, tedy např. {"L"}
AppleScript pamatuje i na to, chcete-li vybrat více položek najednou. V takovém případě musíte v definici uvést multiple selections allowed:
set velikosti to {"L", "XL", "XXL"} choose from list velikosti with prompt "Vyberte svoji velikost" with multiple selections allowed
Práce s jednoduchými soubory
Nejeden skript vzniká hlavně proto, aby dokázal zpracovat soubory s daty nebo do nich svůj výstup zapsal. Podívejte se na jednoduchý způsob, jak zapsat text do textového souboru:
--do souboru budeme zapisovat text set mujText to "Toto je můj obsah souboru!" --takto se v AppleScriptu definuje cesta k souboru, oddělovačem adresářů je dvojtečka --položku "uživatel" v cestě nahraďte názvem svojí uživatelské složky set mujSoubor to "Macintosh HD:Users:uživatel:Desktop:MujSoubor.txt" --otevře soubor k zápisu --pokud soubor neexistuje, bude automaticky vytvořen set mujOtevrenySoubor to open for access file mujSoubor with write permission --nastaví konec souboru na začátek --díky tomu dojde k přepsání jeho obsahu --jinak by se text zapsal za existující obsah souboru set eof of mujOtevrenySoubor to 0 --zapíše text do souboru write mujText to mujOtevrenySoubor starting at eof --uzavře soubor close access mujOtevrenySoubor
Obdobně snadné je i čtení textových souborů. K demonstraci této funkcionality využijeme soubor, který byl vytvořen v předchozím příkladu:
--nastaví cestu k souboru, který chceme číst set mujSoubor to "Macintosh HD:Users:uživatel:Desktop:MujSoubor.txt" --přečte obsah souboru set obsahSouboru to read file mujSoubor --zobrazí obsah souboru v dialogu display alert obsahSouboru
Dlužno říci, že tento způsob je vhodný pouze pro zpracování jednoduchých souborů. V případě souborů se složitější strukturou, jakými jsou například dokumenty Excelu, je nutné využít rozhraní, které daná aplikace pro AppleScript nabízí. Toto rozhraní je zdokumentované v tzv. slovníku (dictionary), který je dodáván spolu s každou aplikací podporující AppleScript. Této problematice jsme se věnovali v úvodu tohoto článku.
Jak hotový skript uložit
Editor skriptů podporuje 3 způsoby, jak AppleScript uložit:
- prostý text
- skript
- aplikace
K uložení skriptu klikněte v Editoru skriptů v nabídce Soubor na položku Uložit, nebo použijte klávesovou zkratku Command(⌘)+S.
Uložíte-li skript jako prostý text, jedná se v podstatě o standardní textový dokument, který není nijak spustitelný a macOS jej nebude dále rozpoznávat jako spustitelný kód.
Po uložení jako skript bude Váš kód stále spouštěn v Editoru skriptů, který se automaticky zobrazí pokaždé, když kliknete na soubor se skriptem. Tento způsob je v hodný spíše během vývoje, kdy potřebujete často skript upravovat, není ovšem vhodný ve chvíli, kdy má být skript používán koncovými uživateli.
Pokud Váš skript uložíte jako aplikaci, bude se skript chovat podobně, jako jakákoliv jiná aplikace macOS. Dojde tedy k jeho spuštění bez otevření Editoru skriptů a neuvidíte kód skriptu, který se spouští. Zobrazeno bude pouze uživatelské rozhraní, pokud nějaké skript vyžaduje (například dialog pro zadání textového vstupu). Tento způsob uložení je vhodný tehdy, když je Váš skript již hotový a odladěný.
Kam dál
Cílem tohoto článku rozhodně nebylo popsat všechny možnosti AppleScriptu, ale poskytnout vám solidní základ, na kterém lze dále stavět. AppleScript je vcelku rozsáhlý, Internet je naštěstí plný dalších návodů, tipů a triků, zajímavých příkladů a připravených skriptů, díky kterým můžete svoje znalosti AppleScriptu posunout ještě dále. Níže najdete seznam odkazů, které se vám mohou v dalším studiu hodit:
- Oficiální dokumentace AppleScriptu na developer.apple.com
- Návod skriptování na Macu na developer.apple.com
- Seriál o AppleScriptu na mujmac.cz
- Série návodů na macosxautomation.com
♦ ♦ ♦
♥️ Díky, že jste dočetli až na konec. Zaujal vás článek?
Sledujte mě na sociálních sítích a nenechte si ujít další novinky, komentáře, návody a recenze!
A sdílejte také článek na vaše oblíbené internety 👇