Programe un recordatorio semanal con AppleScript

Recientemente hemos analizado cómo usar dos componentes muy importantes de AppleScript: sentencias condicionales y ciclos repetidos. Cuando se combinan, el poder de estas dos herramientas es increíblemente poderoso. Ahora usaremos lo que hemos aprendido para crear un flujo de trabajo simple y práctico que automáticamente enviará por correo electrónico una lista de sus tareas incompletas desde la aplicación Recordatorios..


Paso 1. Crear un algoritmo

Lo que necesitamos es una lista simple y sencilla de pasos para guiarnos.

Antes de comenzar a escribir nuestro código, es fundamental que averigüemos qué es lo que estamos haciendo. Ya tenemos una buena idea del resultado final que buscamos lograr, pero el hecho de cumplir ciegamente ese objetivo no es la forma más efectiva de lograrlo..

En su lugar, lo que queremos hacer es elaborar un algoritmo básico que sirva como un mapa de ruta para la forma en que diseñamos nuestro código. Lo que necesitamos es una lista simple y sencilla de pasos para guiarnos.

La parte difícil aquí es que debemos construir nuestro algoritmo teniendo en cuenta lo que sabemos sobre el funcionamiento interno de AppleScript. Nuestros pasos no tienen código, pero deben ser conscientes del código. De lo contrario, terminaríamos con algo como esto:

  • Obtener recordatorios
  • Poner recordatorios en el correo electrónico.
  • Enviar mensaje

Esto es discutiblemente algo útil, pero en verdad podríamos hacer un seguimiento mental de ese proceso sin siquiera explicar un algoritmo específico. La realidad de la situación es que este proceso es mucho más complejo y requiere un pensamiento más profundo sobre cómo vamos a lograr cada pieza. Aquí hay un intento más completo y útil de un algoritmo:

  • Obtener todos los recordatorios en una lista específica
  • Apunta solo a aquellos recordatorios que no se hayan completado.
  • Averigüe si el recordatorio tiene una fecha de vencimiento
  • Si el recordatorio tiene una fecha de vencimiento, anote tanto el nombre como la fecha de vencimiento
  • Si el recordatorio no tiene una fecha de vencimiento, simplemente toma el nombre
  • Convierta toda la información relevante del recordatorio en elementos de la lista de AppleScript
  • Crea un nuevo mensaje de correo y configura sus propiedades.
  • Enviar los elementos de nuestra lista al cuerpo del mensaje.
  • Establecer el destinatario del mensaje.
  • Enviar el mensaje
  • Programe el mensaje para que ocurra diariamente o semanalmente

Ahora estamos hablando. Esto es mucho más específico y describe de manera efectiva cómo se estructurará nuestro código. Nuestro primer intento fue engañosamente simple y parecía que podía hacerse en tres o cuatro líneas de código. Nuestro segundo intento representa una visión mucho más realista de la cantidad de trabajo que se utilizará en este script.


Paso 2. Aplicación Recordatorios de objetivos

Nuestra primera tarea de codificación es lograr que AppleScript se comunique con la nueva aplicación Reminders dentro de Mountain Lion. Por supuesto, lo hacemos con un bloque de información, como si nos estuviéramos comunicando con cualquier otra aplicación..

[applecript]
Dile a la aplicación "Recordatorios"
decirle al final
[/ applecript]

Nuestro bloque de información contendrá todos los comandos que queremos lanzar en la aplicación Recordatorios. Se supondrá que cualquier código colocado entre estas dos líneas se dirigirá a esta aplicación específica.


Paso 3. Iniciar un bucle de repetición

El elemento de tareas pendientes en la parte superior de nuestro algoritmo es obtener todos los recordatorios en una lista específica. Aunque en realidad no los queremos todos a la vez. En su lugar, queremos tomar una a la vez, probar para ver si coincide con nuestros criterios y proceder en consecuencia.

Para lograr este efecto de ciclo, podemos usar un ciclo de repetición, del cual aprendimos todo en un artículo anterior. Esta circunstancia exige una repetir con lazo:

[applecript]
Dile a la aplicación "Recordatorios"
repita con i desde 1 hasta (recuento de cada recordatorio de la lista "Recordatorios")
fin de repetición
decirle al final
[/ applecript]

Lo que esto hace es establecer un bloque de código que se repetirá una vez por cada recordatorio en una lista titulada "Recordatorios". Deberías tener uno de estos por defecto en tu aplicación de Recordatorios.


La lista de recordatorios que estamos apuntando.

Cada vez que se ejecuta el bloque de código, la variable yo se incrementará hasta que sea igual al número de elementos en nuestra lista de recordatorios.


Paso 4. Establece tus variables

Lo siguiente que vamos a hacer es crear todo un lío de variables. Algunos de estos se utilizarán de inmediato, otros que no verá hasta más adelante en nuestro guión, es solo una buena idea eliminarlos de una vez.

[applecript]
--fecha
establece la fecha en "Recordatorios para" y cadena de fecha de (fecha actual)

--variables vacias
establece la entrada en ""
establece theList en
establecer la salida en ""

Dile a la aplicación "Recordatorios"
repita con i desde 1 hasta (recuento de cada recordatorio de la lista "Recordatorios")

--variables de recordatorio
configurar el recordatorio para recordatorio i de la lista "Recordatorios"
establece reminderName al nombre del recordatorio

fin de repetición
decirle al final
[/ applecript]

La primera variable toma la fecha actual. Hacemos esto refiriéndonos a la "cadena de fecha" de la fecha actual. Esto toma el siguiente formato: Viernes 1 de febrero de 2012. Por sí mismo, la "fecha actual" es mucho más grande y contiene la hora y la fecha.

Después de que tengamos la fecha, creamos tres variables vacías. Esto parece algo extraño, pero hay una lógica detrás de esto. Básicamente, vamos a agregar y manipular estas variables dentro de nuestra repetición y si se bloquean, necesitamos que tengan un nivel básico de existencia antes de poder hacerlo..

Finalmente, dentro de nuestro ciclo de repetición, creamos dos variables más.. el recordatorio es simplemente un atajo para que no tengamos que escribir "recordatorio yo de la lista Recordatorios "un montón de veces. recordatorioNombre agarra el nombre de cada recordatorio a medida que recorramos la lista.


Paso 5. Tira los artículos terminados

El problema con nuestra estructura actual es que es ciclos a través todos de sus recordatorios, incluso aquellos que han sido completados. No estamos realmente interesados ​​en ellos, por lo que necesitamos filtrarlos con una simple declaración condicional. Esto va dentro del bucle de repetición justo después de las variables de recordatorio del paso anterior.

[applecript]
--variables de recordatorio
configurar el recordatorio para recordatorio i de la lista "Recordatorios"
establece reminderName al nombre del recordatorio

--Esta completo?
Si el recordatorio no se completa entonces
terminara si
[/ applecript]

Como puede ver, es tan simple como una declaración if que se dirige a sin completar recordatorios Ahora, cualquier código que introduzcamos dentro de esto se ejecutará solo en los recordatorios relevantes.


Paso 6. Crear una lista de recordatorios pendientes

Ahora que tenemos una declaración condicional para filtrar los elementos no completados, necesitamos encontrar una manera de llenar la lista con el título y fecha de vencimiento de cada recordatorio pendiente. La parte difícil es que la aplicación Recordatorios no requiere una fecha de vencimiento, lo que significa que algunos recordatorios los tendrán y otros no..

Para manejar esto necesitamos configurar dos escenarios diferentes. Primero, probaremos para ver si existe una fecha de vencimiento. Si lo hace, estableceremos la entrada a la fecha de vencimiento y al recordatorio. Si no existe una fecha de vencimiento, omitiremos la fecha de vencimiento y solo agregaremos el título a la entrada. Finalmente, añadiremos la entrada a la lista. Una vez más, este proceso se llevará a cabo en todos los recordatorios no completados, y se irá acumulando gradualmente. la lista Para que contenga toda la información que necesitamos..

[applecript]
--Esta completo?
Si el recordatorio no se completa entonces
--tiene fecha de vencimiento?
Si existe la fecha de vencimiento del Recordatorio entonces
establecer dueDate a la fecha de vencimiento del recordatorio
establezca la entrada en recordatorio Nombre & linefeed & dueDate
más
establece la entrada a recordatorio
terminara si
establecer theList a theList & theEntry
terminara si
[/ applecript]

Como puede ver, hemos anidado una declaración condicional dentro de otra. En general, evito esto cuando sea posible para mantener las cosas simples y legibles, pero en este caso, una capa de anidamiento es perfectamente aceptable. También tenga en cuenta que he colocado un linea de alimentación entre el nombre del recordatorio y la fecha de vencimiento para que no aparezcan en la misma línea en nuestra salida final.


Paso 7. Formatea la salida

Casi todos hemos terminado con el bloque de avisos de la aplicación Recordatorios. A continuación, tenemos que tomar todo ese texto que se colocó en la lista y formatéelo bien para enviarlo a un correo electrónico.

Para lograr esto, sin embargo, debemos tener una idea de cómo se ve nuestra salida en su estado actual. Siempre que necesite ver un poco de valor almacenado, intente usar una declaración de retorno. Aquí está todo el código que hemos escrito hasta ahora seguido por una declaración que devuelve el contenido de la lista como una cadena de texto.

[applecript]
establece la fecha en "Recordatorios para" y cadena de fecha de (fecha actual)
establece la entrada en ""
establece theList en
establecer la salida en ""

Dile a la aplicación "Recordatorios"
repita con i desde 1 hasta (recuento de cada recordatorio de la lista "Recordatorios")

--establecer variables
configurar el recordatorio para recordatorio i de la lista "Recordatorios"
establece reminderName al nombre del recordatorio

--Esta completo?
Si el recordatorio no se completa entonces
--tiene fecha de vencimiento?
Si existe la fecha de vencimiento del Recordatorio entonces
establecer dueDate a la fecha de vencimiento del recordatorio
establezca la entrada en recordatorio Nombre & linefeed & dueDate
más
establece la entrada a recordatorio
terminara si
establecer theList a theList & theEntry
terminara si
fin de repetición
decirle al final

devuelve theList como cadena
[/ applecript]

Si ejecutamos esto, veremos un montón de texto emergente en la sección "Resultado" del Editor AppleScript. Este es el texto que está almacenado en la lista, Pero como se puede ver a continuación, es un poco desordenado.!


La salida de nuestro script hasta el momento..

Definitivamente tenemos algunos problemas de salto de línea. Vamos a limpiar eso, ¿de acuerdo? Lo primero que querrás hacer es eliminar esa declaración de devolución. Fue solo un truco temporal para propósitos de prueba y no tiene lugar en nuestro guión final.

A continuación, inserte el fragmento de código a continuación en lugar de la declaración de devolución. Lo que estamos haciendo aquí es recorrer los artículos en la lista, agregando líneas adicionales después de cada una e insertando algunas líneas discontinuas para que todo se vea bonito.

[applecript]
repita con i desde 1 hasta (recuento de cada elemento de la Lista)
establezca la salida en (la salida y el elemento i de la lista como cadena) y avance de línea y "---" y avance de línea
fin de repetición
[/ applecript]

Ahora si agregamos otra declaración de retorno temporal para verificar La salida, Lo que vemos es mucho más bonito y fácil de leer. Tenga en cuenta que nuestro script está manejando ambos recordatorios con y sin fecha de vencimiento y separa cada recordatorio con esos guiones que mencioné anteriormente.


La salida de nuestro script hasta el momento..

Paso 8. Envía el correo electrónico.

¡Ya casi terminamos! Ahora que tenemos una lista bien formateada de los recordatorios actuales, solo necesitamos obtener esa información en un correo electrónico y enviarla..

Aquí es donde las cosas se ponen un poco difíciles. Scripting Mail es una tarea bastante peculiar y solo necesitas saber cómo funciona para que todo salga bien. El diccionario de AppleScript será ayuda, pero las cosas no son tan sencillas como en otras aplicaciones, así que no te desanimes si te confundes.

El proceso básico es el siguiente. Primero, debe configurar una variable para crear un nuevo mensaje para el que asigne un conjunto de propiedades (visible, remitente, asunto y contenido). Entonces, realmente inicias un bloque tell en esa variable (que es el nuevo mensaje saliente) y crea un nuevo destinatario. Entonces tú, por supuesto, envías el mensaje. Esto es lo que parece en la práctica:

[applecript]
--Enviar correo electrónico
Dile a la aplicación "Correo"
activar
configure el Mensaje para hacer un nuevo mensaje saliente con propiedades visible: verdadero, remitente: "[email protected]", asunto: theDate, content: theOutput
decirle al mensaje
hacer nuevo al destinatario con propiedades dirección: "[email protected]"
enviar
decirle al final
decirle al final
[/ applecript]

Tenga en cuenta que tenemos un remitente y un destinatario aquí. Puede hacer que estos sean el mismo correo electrónico si desea enviarse el mensaje a sí mismo, o quizás desee incluir a varios miembros del equipo para que pueda usar este correo electrónico diario para mantener a todos en la tarea. Tu decides!

También tenemos un tema con la fecha que utiliza nuestro la fecha variable desde antes. El contenido del mensaje se establece en La salida por lo que se verá igual que lo que vimos en nuestras pruebas.

Nuestro guión ya está terminado. Solo para estar seguro de que lo tienes todo, aquí está todo:

[applecript]
establece la fecha en "Recordatorios para" y cadena de fecha de (fecha actual)
establece la entrada en ""
establece theList en
establecer la salida en ""

Dile a la aplicación "Recordatorios"
repita con i desde 1 hasta (recuento de cada recordatorio de la lista "Recordatorios")

--establecer variables
configurar el recordatorio para recordatorio i de la lista "Recordatorios"
establece reminderName al nombre del recordatorio

--Esta completo?
Si el recordatorio no se completa entonces
--tiene fecha de vencimiento?
Si existe la fecha de vencimiento del Recordatorio entonces
establecer dueDate a la fecha de vencimiento del recordatorio
establezca la entrada en recordatorio Nombre & linefeed & dueDate
más
establece la entrada a recordatorio
terminara si
establecer theList a theList & theEntry
terminara si
fin de repetición
decirle al final

repita con i desde 1 hasta (recuento de cada elemento de la Lista)
establezca la salida en (la salida y el elemento i de la lista como cadena) y avance de línea y "---" y avance de línea
fin de repetición

--Enviar correo electrónico
Dile a la aplicación "Correo"
activar
configure el Mensaje para hacer un nuevo mensaje saliente con propiedades visible: verdadero, remitente: "[email protected]", asunto: theDate, content: theOutput
decirle al mensaje
hacer nuevo al destinatario con propiedades dirección: "[email protected]"
enviar
decirle al final
decirle al final
[/ applecript]


Paso 9. Programando el Script

Ahora que el script es perfectamente funcional, necesitamos encontrar una manera de programarlo para que se ejecute regularmente, por ejemplo, cada lunes por la mañana para que pueda ver su semana. Para hacer esto, guarde la secuencia de comandos como una aplicación, colóquela en cualquier lugar que desee en su disco duro, luego abra la aplicación Calendario.

Desde aquí, probablemente querrá crear un nuevo calendario específicamente para tareas automatizadas (para que no abarroten sus otros calendarios). Luego crea un nuevo evento que se repite todos los lunes. Finalmente, cree una alerta para el evento que abre un archivo y elija su aplicación de script.


Programando el Script en el Calendario.

Con esto en funcionamiento, todos los lunes a las 8 am, ya sea que esté en mi computadora o no, me enviarán un correo electrónico con mis recordatorios para la semana.


Recordatorio email

Hacerlo mejor!

Si siguió los pasos hasta este punto, felicitaciones, acaba de crear un pequeño script que lo ayudará a mantenerse productivo este año. Ahora es el momento de tomar lo que he hecho y modificarlo para satisfacer sus propias necesidades. ¿Cómo puede hacerlo más adecuado para su flujo de trabajo??