Cómo reaccionar a la selección de una lista de elementos en AppleScript

En un artículo anterior vimos cómo permitir al usuario seleccionar un elemento de una lista a través de un cuadro de diálogo. En este artículo veremos cómo reaccionar a la selección del usuario.

Partiremos de nuestro ejemplo de selección de un tipo de comida para pedir a domicilio:


choose from list {"Vegetariana", "Mejicana", "China", "Japonesa", "Mediterranea", "Italiana"} with title "Selección de tipo de comida" with prompt "Selecciona el tipo de comida que más te apetezca" OK button name "Pide ahora!" cancel button name "No tengo hambre" default items {"Mejicana"} multiple selections allowed false empty selection allowed false

Almacenando el resultado

Para gestionar algunas respuestas es necesario que almacenemos los resultados en una variable. Este es el caso del comando choose from list.

En nuestro ejemplo almacenaremos el resultado en la variable resultadoDeDialogo.


set resultadoDeDialogo to choose from list {"Vegetariana", "Mejicana", "China", "Japonesa", "Mediterranea", "Italiana"} with title "Selección de tipo de comida" with prompt "Selecciona el tipo de comida que más te apetezca" OK button name "Pide ahora!" cancel button name "No tengo hambre" default items {"Mejicana"} without multiple selections allowed and empty selection allowed

Reaccionando dependiendo del resultado

Para realizar una u otra operación dependiendo del valor de una variable debemos usar estructuras condicionales en AppleScript para poder codificar todas las posibles acciones que el usuario haga con el cuadro de diálogo.

En nuestro ejemplo el usuario puede realizar las siguientes operaciones:

  • Pulsar el botón de cancelar
  • Seleccionar un elemento y pulsar el botón de aceptar

Gracias a que hemos indicado en el comando choose from list que el usuario no puede seleccionar más de un valor y que el botón de aceptar sólo estará disponible si se ha seleccionado un valor de la lista no tenemos que preocuparnos por otras posibles respuestas por parte del usuario.

Cancelar como resultado

Si el usuario pulsa el botón de cancelar el resultado que obtendremos en la variable resultadoDeDialogo será false. Sabiendo esto podemos codificar qué hacer si el usuario pulsa el botón cancelar.

En nuestro ejemplo mostraremos un mensaje invitando al usuario que vuelva a ejecutar nuestra aplicación cuando tenga hambre.


set resultadoDeDialogo to choose from list {"Vegetariana", "Mejicana", "China", "Japonesa", "Mediterranea", "Italiana"} with title "Selección de tipo de comida" with prompt "Selecciona el tipo de comida que más te apetezca" OK button name "Pide ahora!" cancel button name "No tengo hambre" default items {"Mejicana"} without multiple selections allowed and empty selection allowed

if resultadoDeDialogo = false then
display alert "Vuelve cuando tengas hambre"
end if

Una lista como resultado

Si el usuario pulsa el botón de aceptar el resultado obtenido será una lista de AppleScript con todos los valores seleccionados.

Si hubiesemos permitido al usuario pulsar el botón aceptar sin seleccionar nada obtendríamos como resultado una lista vacía.

Para nuestro ejemplo mostraremos un mensaje indicando que a nosotros nos apetece también ese tipo de comida excepto si es comida vegetariana ya que mostraremos otro mensaje.


set resultadoDeDialogo to choose from list {"Vegetariana", "Mejicana", "China", "Japonesa", "Mediterranea", "Italiana"} with title "Selección de tipo de comida" with prompt "Selecciona el tipo de comida que más te apetezca" OK button name "Pide ahora!" cancel button name "No tengo hambre" default items {"Mejicana"} without multiple selections allowed and empty selection allowed

if resultadoDeDialogo = false then
display alert "Vuelve cuando tengas hambre"
else
set tipoComida to get text 1 of resultadoDeDialogo
if tipoComida = "Vegetariana" then
display alert "No me apetece mucho comida vegetariana ahora. Que aproveche."
else
set cadenaResultado to "A mi también me apetece comer comida " & tipoComida & ". Pide un poco para mi también, por favor."
display alert cadenaResultado
end if
end if

Con todo esto ya podemos crear scripts de AppleScript más complejos en los que el usuario puede controlar cómo reaccionará nuestro programa.

Obtener las respuestas de cuadros de diálogo en AppleScript

En un artículo anterior vimos cómo mostrar cuadros de diálogo para hacer preguntas al usuario. En este artículo veremos cómo recoger la respuesta que ha seleccionado el usuario para poder controlar el comportamiento de nuestro script según lo que seleccione el usuario.

Partiremos del siguiente ejemplo en el que preguntaremos al usuario algo muy simple:


display dialog "¿Tienes hambre?" buttons {"Si", "No"}

Para recoger la respuesta que haya pulsado el usuario debemos construir un control de flujo if then para cada posible respuesta.

Dentro de la estructura if then debemos preguntar si el resultado del botón es igual a una cadena de texto. Esto se consigue con una sintaxis como esta:

button returned of result = "Texto exacto del botón"

Nuestro ejemplo completo quedaría así:


display dialog "¿Tienes hambre?" buttons {"Si", "No"}
if button returned of result = "No" then
display alert "Muy bien, sigue trabajando."
else if button returned of result = "Si" then
display alert "Pues es buena hora para picar algo..."
end if

Variables locales, globales y propiedades en AppleScript

En otros artículos hemos visto las variables en AppleScript y cómo manipularlas.

Las variables en AppleScript pueden tener un ámbito local o global. Esto significa que una variable puede ser utilizada dentro de la función donde ha sido declarada (ambito local) o puede ser utilizada en cualquier parte de nuestro script de AppleScript (ámbito global).

Todas las variables globales y locales son reinicializadas cuando se ejecuta un script por lo que en las variables sólo podremos almacenar información que vaya a ser utilizada en el momento de ejecutar ese script.

Declaración de variables locales y globales

Las variables locales no es necesario declararlas con anterioridad ya que por defecto cualquier variable utilizada a través del comando set es declarada como local.

En cambio las variables globales deben ser declaradas al comienzo del script utilizando el comando global. Un ejemplo puede ser:


-- Declaramos la variable
global miVariableGlobal

on run
— Usamos la variable global
set miVariableGlobal to 1
end run

Persistencia de información en AppleScript

A veces podemos necesitar guardar información para la ejecución de un AppleScript entre una y la siguiente ejecución. Para este motivo AppleScript nos proporciona un tipo especial de variables: las propiedades

Las propiedades, como las variables globales, se declaran al comienzo del script pero a diferencia de las variables globales, al declararlas es necesario indicar un valor inicial. Por ejemplo:


-- Declaramos la variable
global miVariableGlobal
-- Declaramos la propiedad
property propertyVar : 1

A la hora de manipular una propiedad se hace al igual que con una variable utilizando el comando set

Ejemplo

Vamos a ver un ejemplo simple en el que veremos cómo se comportan las variables locales, globales y propiedades con cada nueva ejecución del script. Para ello abre el editor de scripts de Macos, escribe el siguiente código y utiliza la opción run unas cuantas veces para ver cómo varia la información con cada nueva ejecución.


-- Las propiedades y variables globales se declaran al comienzo del script

global globalVar
property propertyVar : 1

on run
— Inicializamos los valores
set localVar to 1
set globalVar to 1
set localVarText to localVar as text
set globalVarText to globalVar as text
set propertyVarText to propertyVar as text

— Preparamos el texto a verbalizar
set result to «El valor local es » & localVarText & «, el global es » & globalVarText & » y el valor de propiedad es » & propertyVarText
— Verbalizamos el resultado
say result

— Actualizamos los valores para la siguiente ejecución
set localVar to localVar + 1
set globalVar to globalVar + 1
set propertyVar to propertyVar + 1
end run

Ejecutar scripts de AppleScript desde el terminal de MacOS

En determinadas ocasiones quizás nos encontremos con la necesidad de ejecutar un AppleScript desde otra aplicación o servicio. El Terminal de MacOS nos permite realizar multitud de operaciones relacionadas con el sistema operativo de nuestro ordenador y una de ellas es solicitar al int&eeacute;erprete de AppleScript que ejecute un fichero scpt que es la extensión para los ficheros de código de scripts de AppleScript.

Para conseguir que el terminal utilice el intérprete de AppleScript debemos utilizar el comando osascript

Su sintáxis es la siguiente:


osascript rutaAlFicheroDeScript/nombreDelFichero.scpt

Por ejemplo, si queremos ejecutar el fichero miScript.scpt que está en la carpeta de descargas de nuestro usuario el comando sería:


osascript /Users/miUsuario/Downloads/miScript.scpt

Enviar mensajes de texto con la aplicación Mensajes de MacOS utilizando AppleScript

La aplicación mensajes nos permite enviar texto, audio e imágenes a otros dispositivos de Apple. Esta aplicación puede ser operada a través de AppleScript para realizar multitud de tareas.

El envío de mensajes de texto con esta aplicación es relativamente sencillo utilizando AppleScript.

Para enviar un mensaje de texto debemos indicar desde qué cuenta de Mensajes queremos enviar el texto y a quién queremos enviarlo.

Por ejemplo, supongamos que queremos enviar el mensaje Hola mundo! al usuario con número de teléfono +34555555555. Es necesario añadir el código de país para que Mensajes encuentre al usuario correcto.

Nuestra cuenta de correo configurada para el protocolo Mensajes es prueba@icloud.com y el valor que se debe utilizar para indicar al script que es una cuenta de servicio es: E:prueba@icloud.com

El código sería el siguiente:


set destinatario to "+34555555555"
set textoAEnviar to "Hola mundo!"
set remitente to "E:prueba@icloud.com"
tell application "Messages"
set theBuddy to buddy destinatario of service remitente
send textoAEnviar to theBuddy
end tell

Solucionando problemas

con ciertas operaciones con la aplicación Mensajes y AppleScript podemos obtener algunos mensajes de error. Por ejemplo: si intentamos enviarnos un mensaje a nosotros mismos podríamos obtener un mensaje de error como el siguiente:


Messages ha detectado un error: No puede obtenerse buddy id «C26717C6-647B-48A1-B963-14A4EC5CD5FA:+34555555555».

Este mensaje de error nos indica que no se ha podido crear la conversación desde AppleScript. La solución pasa por abrir la aplicación Mensajes y abrir nosotros mismos una conversación con nuestro propio telf&eeacute;fono y enviarnos un mensaje. Tras esto no debemos borrar esa nueva conversación y probar de nuevo a ejecutar nuestro script de AppleScript. El mensaje de nuestro script debería enviarse sin problemas.