0 votos

AppleScript para eventos de iCal a partir de entradas de la Agenda

Quiero crear un script que cree eventos de alarma en iCal para los cumpleaños de las personas que tengo en la agenda. Por desgracia, soy muy malo trabajando con AppleScript.

A continuación está el esquema de lo que tengo que hacer, me encantaría un poco de ayuda en cuanto a lo que el real script debe ser.

  • ejecutar script cuando se realiza un cambio en una fecha de nacimiento en la libreta de direcciones o cuando ésta se cierra
  • definir la lista de personas (tendrá una alarma adicional, véase más abajo)
  • buscar los cumpleaños introducidos en la libreta de direcciones
  • si no hay ningún evento en el calendario ical llamado "cumpleaños" para los cumpleaños encontrados en la libreta de direcciones (compruebe el nombre y la fecha)
    • crear un nuevo evento de todo el día en el calendario de cumpleaños con alarma en la fecha y con el título "(Nombre de la persona) cumpleaños)
  • si el cumpleaños está en la lista definida anteriormente
    • añadir una alarma adicional dos semanas antes del cumpleaños
  • mostrar un mensaje que muestre qué nuevos eventos se crearon cuando se ejecutó el script.

No creo que el script sea tan complejo o largo. Cualquier ayuda será muy apreciada.

No estoy seguro de cómo podría activarse este script, pero lo ideal sería que se ejecutara si se realiza un cambio en una fecha de cumpleaños en la libreta de direcciones (o se añade una nueva).

1voto

bispymusic Puntos 3414

Para establecer alertas únicas en todos los cumpleaños, puede evitar un script por completo:

  1. Abra las Preferencias del Calendario en el Calendario.
  2. En General, marque la opción "Mostrar el calendario de cumpleaños".
  3. En Alertas, establezca una alerta para "Cumpleaños".

No me he tomado el tiempo de escribir un AppleScript para las partes de la doble alarma, pero esto artículo parece cubrir las alarmas de calendario de scripting bastante bien. Me imagino que sólo tendría que crear un archivo o lista en el script que contiene los nombres de los eventos (que se puede deducir de la convención de nomenclatura estándar que utiliza la aplicación Calendario).

También estoy usando Mountain Lion con la aplicación Calendario. No recuerdo si los pasos anteriores funcionan en versiones anteriores de iCal.

0voto

enaz Puntos 6

Creo que la diferencia es que el calendario de cumpleaños en ical no crea alarmas antes del evento. Tampoco te permite añadirlas manualmente.

Creo que podrías hacer que esto funcione aunque con una carpeta de acciones script. Habilitar el calendario de cumpleaños en ical. Luego adjuntar un script a la carpeta donde se almacenan estos eventos. Cuando se añada un nuevo evento (es decir, que hayas añadido un nuevo cumpleaños a tu agenda) se activará el script.

Aquí está la carpeta donde encontré mis eventos de cumpleaños:

/Library/Calendars/FA907C55-E8CD-4291-8173-B3F86886E2BF.calendar/Events

Puede que tengas que rebuscar en las listas de calendarios hasta encontrar la carpeta correcta, pero debería estar ahí.

A partir de ahí, el script tomaría el nuevo elemento añadido a la carpeta, y luego lo copiaría en un calendario separado y añadiría la alarma. Para configurarlo, yo crearía un nuevo calendario en el que quieres que caigan estos nuevos eventos. Coge los eventos de tu calendario de cumpleaños, y arrástralos al escritorio o a algún sitio (se borrarán después). Luego abre cada uno de ellos. Te preguntará a qué calendario quieres añadirlos, así que elige el nuevo calendario que has hecho. Elimina los archivos y ya está, ahora puedes añadirles alarmas.

Dependiendo de cuántos cumpleaños tengas ya, podrías escribir un script que añadiera un evento a cada uno de ellos individualmente, o (si eres como yo y tienes tan pocos bdays guardados) hacerlo manualmente. Una vez hecho esto, una acción de carpetas script haría el truco que buscas.

on adding folder items to this_folder after receiving these_items
    repeat with i from 1 to number of items in these_items
        set this_item to item i of these_items
        tell application "finder"
            move this_item to --location specifier of folder for new bday calendar
        end tell
    end repeat
    tell application "ical"
        reload calendars
        --add script here to add new alarms
    end tell
end on adding folder items to

Lo siento, no tengo el código exacto para añadir la alarma. Pero prueba esto y hazme saber cómo funciona.

0voto

Nip Puntos 362

Agenda de direcciones ya se coordina con iCal para crear eventos basados en la fecha del campo de cumpleaños de cualquier contacto. Si todo lo que necesitas son alarmas, entonces sólo necesitas una forma de añadir alarmas a estos eventos.

El problema es que la interfaz de usuario de iCal presenta el calendario como si fuera de sólo lectura. Pero para AppleScript, el calendario no es realmente de sólo lectura. Puedes utilizar AppleScript para añadir alarmas a los eventos del calendario "Cumpleaños":

on run
    (* Warning:
        This program will delete all the "display alarms" from the events in the
        synthetic "Birthdays" calendar. Usually, there are no alarms on these
        events because iCal treats this calendar as if it were read-only.

        The calendar is not, however, actually read-only when accessed through
        AppleScript. This program deletes all existing "display alarms" for all
        birthdays and sets a new one for 13.5 days before the the event
        (i.e. noon 14 days before, since the event occurs at midnight).
    *)
    tell application "iCal"
        set bcName to "Birthdays"
        set bc to a reference to calendar bcName
        if not (exists bc) then
            display alert "No “" & bcName & "” calendar!"
            return
        end if
        repeat with e in events of contents of bc
            -- make the following conditional if you only want alarms for some birthdays
            tell e
                delete display alarms
                make new display alarm with properties {trigger interval:-13.5 * 24 * 60}
            end tell
        end repeat
    end tell
end run

Cada vez que ejecute este programa, se asegurará, efectivamente, de que todos los cumpleaños tengan una alarma. † Parece que Agenda de direcciones sólo realiza cambios mínimos cuando actualiza un evento de cumpleaños para un nombre o una fecha de cumpleaños modificados; las alarmas persisten a través de las actualizaciones de Agenda de direcciones pero esto puede no ser fiable ya que Libretas de direcciones "es la dueña de estos eventos y puede borrarlos y recrearlos por completo cada vez que sienta la necesidad de hacerlo.


No conozco una forma oficial de ser notificado de Agenda de direcciones pero, como sugiere la otra respuesta, podrías conectar una Acción de Carpeta a la carpeta que contiene los eventos del calendario "Cumpleaños". Puedes abrir esa carpeta con este programa:

tell application "iCal" to set bcuid to uid of calendar "Birthdays"
path to library folder from user domain
tell application "Finder" to open folder "Events" of folder (bcuid & ".calendar") of folder "Calendars" of result

Dado que se trata de un detalle interno, puede no ser fiable en diferentes versiones del sistema operativo. Todo lo anterior fue desarrollado y probado en Mac OS X 10.6.8.

Alternativamente, ya que el programa anterior asegura que cada cumpleaños tiene una alarma, podrías simplemente organizarlo para que se ejecute una vez al día o una vez al iniciar la sesión (puedes usar un evento de iCal con una alarma "Ejecutar script", o guardar el programa como una aplicación y establecerlo como un elemento de inicio de sesión).


Crear tus propios eventos (en tu propio calendario) es ciertamente posible, pero mantenerlos sincronizados con los datos de cumpleaños puede ser complicado (la búsqueda por "nombre y fecha" no suele ser suficiente porque el usuario podría cambiar cualquiera de ellos, y tu programa de "hacer alarmas" podría no ser capaz de determinar los valores originales para cuando sepa que un contacto concreto ha sido actualizado con un nuevo nombre o fecha de cumpleaños). Agenda de direcciones resuelve este problema codificando el identificador único interno del contacto en la URL que guarda en cada evento de cumpleaños url ya que el calendario es de "sólo lectura" y no tiene que preocuparse de que un usuario cambie o borre sus URLs especiales, por lo que puede confiar en que sean precisas.

† Eliminamos todas las alarmas existentes suponiendo que todas las alarmas son "nuestras" ya que Agenda de direcciones no añade alarmas por sí mismo, y iCal no permite a los usuarios añadir alarmas. Desgraciadamente, no hay ninguna propiedad extra donde podamos añadir algún tipo de identificador único a la propia alarma (aunque si la hora exacta de la alarma no es importante, podría ser posible codificar alguna información en el valor numérico del desplazamiento de minutos de la alarma). Parece más fácil simplemente eliminar las alarmas y crear exactamente la que queremos en lugar de comprobar las alarmas existentes para ver si coinciden con nuestra configuración de alarma deseada.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X