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.

Editor skriptů s označeným tlačítkem Spustit

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í testový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: