Convertir un AppleScript en una aplicación para MacOS

AppleScript permite a cualquier usuario de MacOS realizar pequeñas utilidades de forma rápida y sencilla pero el resultado sigue siendo un script que requiere de una aplicación para ser ejecutado. Pero esto no es del todo cierto

El Editor de scripts que ofrece Apple nos permite convertir un script de AppleScript en una aplicación para MacOS.

Un pequeño ejemplo para empezar

Para continuar vamos a partir de un pequeño ejemplo de script que sólo mostrará una alerta por pantalla. El código es el siguiente:


on run
display alert "Esto es un mensaje de prueba."
end run

Una vez escrito nuestro script y tras haberlo guardado con un nombre apropiado es el momento de convertirlo en aplicación.

Exportando un AppleScript como aplicación

En el menú Archivo de la barra de menú del Editor de scripts encontramos la opción de Exportar ….

Al activar la opción de Exportar … aparecerá un cuadro de diálogo para exportar nuestro script. Nos solicitará un nombre, una carpeta de destino y un formato. Ese campo formato es el que nos interesa.

Como formato podremos exportar a script, paquete de scripts, texto y aplicación. Es el formato aplicación el que nos interesa.

Dependiendo de la versión de MacOS que estemos ejecutando el campo formato también estará disponible en el cuadro de diálogo para guardar nuestro script.

Cómo reproducir un sonido en AppleScript utilizando comandos de Terminal

Con AppleScript, al igual que vimos en el artículo de Cómo reproducir un sonido al iniciar sesión en OSX podemos ejecutar comandos del terminal de forma sencilla para realizar operaciones.

En este artículo vamos a seguir con el ejemplo que seguimos con Automator y vamos a reproducir un sonido utilizando el comando de terminal afplay.

En AppleScript para ejecutar una orden en el terminal debemos utilizar la orden do shell script seguida de una cadena de texto entre dobles comillas (").

En AppleScript el ejemplo que hicimos con Automator quedaría así:


on run
do shell script "afplay /System/Library/Sounds/Blow.aiff"

A diferencia de Automator en este caso conseguimos el mismo efecto de forma más sencilla y con menos trabajo. Pero AppleScript no es siempre más sencillo de utilizar que Automator. Es más, desde Automator podemos ejecutar diversos scripts de AppleScript para realizar flujos de trabajo más complejos. Debemos decidir en cada caso qué opción es la más apropiada dependiendo qué función queremos crear.

Comentarios en AppleScript

La mayoría de lenguajes de programación incluyen algún mecanismo para que el programador pueda incluir anotaciones o comentarios en el código. Esto es necesario sobre todo si ese código va a crecer mucho, se va a compartir con otros programadores o se va a trabajar de nuevo en él tras cierto tiempo y tenemos que recordar qué hacía el código y por qué decidimos hacerlo así.

Ya vimos en el artículo de Hola mundo en AppleScript al detalle que AppleScript permite incluir comentarios. En este artículo lo veremos más en detalle.

En AppleScript podemos crear un comentario de una sola línea o un comentario que agrupe un conjunto de líneas consecutivas.

Para escribir un comentario de una sola línea debemos emplear el prefijo doble guión (--) delante del comentario. Todo lo que haya a la derecha de -- se ignorará por el intérprete de AppleScript.

Para escribir un bloque de comentario en AppleScript debemos encerrar el bloque de comentario con los símbolos abre paréntesis y asterisco ((*) y cierra paréntesis y asterisco (*)). Todo lo que esté entre (* y *) se ignorará por el intérprete de AppleScript.

Ejemplo de comentarios

En el siguiente ejemplo veremos los dos tipos de comentarios que podemos realizar dentro de un script de AppleScript.


(*
AppleScript de ejemplo
(CopyLeft) Tyflos Accessible Software 2018.

Este AppleScript no hace nada importante y es una excusa para enseñar cómo funcionan los comentarios en este lenguaje de scripting.

*)

on run
-- Comienzo del script
say "Hola a todos"
-- Una pequeña pausa y nos despedimos
delay 2
say "Esto no hace nada más"
-- Fin del script""
end run

Listas en AppleScript

En un artículo anterior ya vimos qué eran las variables en AppleScript y que, a semejanza de otros lenguajes de programación las había de varios tipos.

En este artículo nos centraremos en un tipo de variable que nos permite almacenar varios valores relacionados. Son las variables de tipo lista o conocidos en otros lenguajes de programación como array, vector o matriz de una dimensión.

Una lista es un conjunto de valores agrupados en un orden determinado. Este orden viene definido por el lugar que ocupa el elemento, llamado item, dentro de la lista.

Cada uno de los items de una lista puede ser de un tipo distinto. Esto significa que en una lista de 4 elementos el primero puede ser un texto, el segundo un número, el tercero otro texto y el cuarto el tipo que decidamos.

Para crear una lista se declara como una variable normal de AppleScript pero el conjunto de valores se agrupan entre llaves { (abre llave) y } (cierra llave) y separando los items con comas (,).

Veamos esto con un ejemplo. Vamos a almacenar en una variable todos los datos de contacto de una persona, para ello utilizamos una lista, y luego verbalizaremos toda la información del contacto. El código de nuestro script sería algo así:


on run
set contacto to {"Fulano", "de tal", 5.55123123E+8, "Calle falsa, 123, piso 4"}
say contacto as text
end run

La declaración de la lista es tan simple como la declaración de una variable en AppleScript.

En el ejemplo a la hora de verbalizar la información del contacto debemos convertir la variable de tipo lista a variable de tipo texto. Esto lo conseguimos con la sentencia as text. Si no lo hiciesemos así al intentar ejecutar el script optendríamos un error con un mensaje parecido a Error de script. No es posible convertir {«Fulano», «de tal», 5.55123123E+8, «Calle falsa, 123, piso 4»} en tipo text..

Accediendo a los items de una lista

Ya hemos indicado que los elementos de una lista se conocen como item y es así como nos vamos a referir en nuestro código para interactuar de forma individual con un elemento de una lista.

En AppleScript para acceder al valor de una propiedad de un objeto o a los items de una lista utilizamos el comando get indicando qué queremos obtener y de donde. El valor devuelto por get debe ser almacenado en una variable.

Veamos un ejemplo en el que en una lista de 5 números queremos obtener el que está en la cuarta posición de la lista. El código sería el siguiente:


on run
-- Declaramos una lista de 5 nmeros
set lista to {9, 2, 33, 1, 100}
-- Verbalizamos la lista
say lista as text
set valor to get item 4 of lista
say valor
end run

En una lista cuyos items sean de distinto tipo podemos usar el comando get para referenciar el item por su tipo y posición. Veamos esto mejor con un ejemplo: en una lista donde almacenamos el nombre y la edad de 3 personas queremos obtener el nombre de la tercera persona. Bien podríamos preguntar por el quinto elemento de la lista o por el tercer texto almacenado en la lista. El código sería el siguiente para este segundo caso:


on run
-- Declaramos una lista de 3 personas con su nombre y edad
set lista to {"Juan", 23, "Antonio", 38, "Manuel", 18}
-- Verbalizamos la lista
say lista as text
-- Obtenemos el tercer nombre de la lista
set valor to get text 3 of lista
say valor
-- Obtenemos la tercera edad de la lista
set valor to get integer 3 of lista
say valor
end run

Propiedades de las listas

Las listas al tratarse de un tipo especial de variable tiene una serie de propiedades y elementos para poder utilizarlas con comodidad. Estas propiedades nos permiten conocer, por ejemplo, el número de elementos que hay en la lista. En un artículo posterior hablaremos en más detalle sobre las propiedades en AppleScript

En el siguiente ejemplo veremos las propiedades length, rest, reverse y class.


on run
-- Declaramos una lista de 5 elementos
set lista to {1, 2, 3, 4, 5}
-- Verbalizamos la lista
say lista as text
-- Obtenemos la clase o tipo de variable que es lista
set tipo to get class of lista
say tipo
-- obtenemos cuantos elementos hay en la lista
set numElementos to get length of lista
say "La lista tiene"
say numElementos
say "elementos"
-- Damos la vuelta a la lista y la almacenamos en otra variable
set listaInversa to get reverse of lista
say listaInversa as text
-- Creamos una nueva lista pero sin el primer elemento de la lista inicial
set miniLista to get rest of lista
say miniLista as text
end run

En próximos artículos veremos más cosas sobre las listas en AppleScript.

Bucles en AppleScript

AppleScript, al igual que otros lenguajes de programación, nos permite utilizar una serie de estructuras de código para repetir una serie de comandos un número determinado de veces. Esto resulta muy úl para evitar tener que escribir demasiado código repetido

Por ejemplo imaginemos que queremos realizar un script que cuente desde 1 hasta 10. Si no supiesemos utilizar ninguna estructura de bucle o para repetir un trozo de código nuestro script debería ser algo parecido a lo siguiente:


on run
set valor to 1
say valor
set valor to valor + 1
say valor
set valor to valor + 1
say valor
set valor to valor + 1
say valor
set valor to valor + 1
say valor
set valor to valor + 1
say valor
set valor to valor + 1
say valor
set valor to valor + 1
say valor
set valor to valor + 1
say valor
set valor to valor + 1
say valor
end run

El código escrito es repetitivo, poco elegante y poco eficiente a la hora de ser mantenido o modificado en el futuro.

Para poder solucionar este problema AppleScript nos proporciona la estructura repeat que repite un número de veces determinado el código situado entre la orden repeat y end repeat. Nuestro script anterior podría quedar así:


on run
set valor to 1
repeat 10 times
say valor
set valor to valor + 1
end repeat
end run

Al ejecutar el script obtendremos el mismo resultado pero habremos escrito menos líneas de código y además queda más claro que existe una acción repetida varias veces dentro del script.

Si en el comando repeat no indicamos el número de veces que debe repetirse el bloque de código se entrará en un bucle infinito. Por ejemplo, si cambiamos nuestro ejemplo anterior dejando la línea repeat 10 times por sólo repeat y lo ejecutamos el script no parará de contar hasta que nosotros interrumpamos la ejecución del script.

Un bucle de ejecución infinita es muy peligroso ya que provocará que nuestro ordenador entre en un proceso sin fin y cada vez haya menos recursos disponibles para la máquina. Es muy probable que hayamos visto comportamientos similares cuando nuestro teléfono u ordenador personal realiza un proceso que provoca que la temperatura del dispositivo aumenta, se ralentiza la ejecución de todo el sistema operativo y cualquier acción que intentemos se realizará de forma muy pausada y con interrupciones. Esto puede deberse a que una aplicación está ejecutando un bucle infinito o de muy larga duración, por ejemplo convertir un fichero de vídeo o un proceso que requiera de muchos minutos para completarse.

Por todo esto siempre debemos incluir cláusulas de interruptción de un bucle en cualquier lenguaje de programación que utilicemos, incluido AppleScript.

Para salir de una estructura repeat AppleScript nos proporciona el comando exit. Veamos nuestro ejemplo inicial pero utilizando un bucle infinito con su cláusula de ejecución controlada para que se termine cuando hayamos verbalizado el valor 10. El código sería el siguiente:


on run
set valor to 1
repeat
say valor
set valor to valor + 1
if valor = 11 then
exit repeat
end if
end repeat
end run

Pero este código sigue sin ser del todo apropiado. En nuestro ejemplo sabemos que queremos ir desde el valor 1 hasta el 10. En los casos en que sabemos el valor de inicio y de finalización y además necesitamos una variable que nos indique en qué número de la iteración del bucle nos encontramos el comando repeat nos permite declarar una variable para controlar el bucle e indicar el valor de comienzo y el valor de finalización para el bucle. Veamos un ejemplo para que nos diga los números entre el 10 y el 20. El código sería el siguiente:


on run
repeat with valor from 10 to 20
say valor
end repeat
end run

Es necesario tener en cuenta que la estructura repeat with from to sólo se ejecutará si el valor indicado en from es menor que el indicado en to, lo que significa que el bucle se ejecutará si se va de un número hacia otro número mayor. Por ejemplo, si intentamos hacer una cuenta atrás el script siguiente no se ejecutará:


on run
repeat with valor from 10 to 1
say valor
end repeat
end run

Para solucionar este problema debemos usar nuestro ingenio para superar las limitaciones del lenguaje de programación que estemos utilizando. Una posible solución sería la siguiente:


on run
repeat with valor from 1 to 10
set cuentaAtras to 11 - valor
say cuentaAtras
end repeat
say "¡Boom!"
end run

AppleScript proporciona otras variantes de la estructura de bucle repeat pero pueden resultar menos eficientes o más complejas de controlar. Más adelante veremos algunas de ellas.

Conoce el estado de tu batería en MacOS Sierra gracias a AppleScript

Con las últimas versiones de MacOS Sierra, el sistema operativo de Apple para sus ordenadores portátiles y de sobremesa, los usuarios han encontrado que el indicador de batería es confuso y ofrece información insuficiente.

Muchos usuarios no encuentran una solución para volver a obtener toda la información de sus baterías y desconocen que el propio sistema operativo les ofrece una solución utilizando una de las herramientas del sistema MacOS que lo convierten en uno de los sistemas ooperativos más versátiles del mercado, nos referimos a Apple script

Aprender Apple script no es demasiado complicado pero puede que no tengas tiempo para ello. Por esa razón Tyflos Accessible Software ha desarrollado un script que verbaliza bien con la voz del sistema o la voz de VoiceOver, el lector de pantallas para MacOS, el estado actual de la batería de tu equipo Apple.

Puedes descargar el archivo comprimido del
script para conocer el estado de la batería(Español)
e instalarlo en tu sistema MacOS.

Una vez descomprimido el archivo copia el fichero appleScript en la carpeta para scripts de tu carpeta biblioteca de usuario. Una vez allí puedes crear un flujo de Automator para que se ejecute con una pulsación de teclas.

Si eres usuario de VoiceOver es más sencillo de utilizar. Descomprime el archivo dentro de la carpeta de scripts de tu biblioteca, es necesario activar el soporte de scripts de VoiceOver y añadir un comando para VoiceOver asociado a este script. Para ello, dentro de las opciones de VoiceOver, encontrarás el mecanismo para asociar un atajo de teclado a un comando de VoiceOver en la categoría comandos de la ventana de configuración de VoiceOver.