AppleScript para eventos de iCal de las entradas de la Libreta de direcciones

0

Quiero crear un script que cree eventos alarmados en iCal para los cumpleaños de las personas que tengo en mi libreta de direcciones. Desafortunadamente, estoy muy mal trabajando con AppleScript.

A continuación se muestra el resumen de lo que debo hacer, me gustaría recibir alguna ayuda sobre cuál debería ser el script real.

  • ejecutar el script cuando se realiza un cambio en una fecha de nacimiento en la libreta de direcciones o cuando se cierra la libreta de direcciones
  • defina la lista de personas (tendrá una alarma adicional, vea más abajo)
  • buscar los cumpleaños ingresados en la libreta de direcciones
  • si no hay ningún evento presente en el calendario ical llamado "cumpleaños" para los cumpleaños que se encuentran en la libreta de direcciones (verifique el nombre y la fecha)
    • cree un nuevo evento de todo el día en el calendario de cumpleaños con alarma en la fecha y el título "(Nombre de la persona) Cumpleaños"
  • si el cumpleaños está en la lista definida anteriormente
    • agregar alarma extra dos semanas antes del cumpleaños
  • mensaje de visualización que muestra los nuevos eventos que se crearon cuando se ejecutó el script

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

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

    
pregunta Sam 25.11.2011 - 02:15

3 respuestas

1

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

  1. Abre las preferencias del calendario en el calendario.
  2. En General, marque "Mostrar calendario de cumpleaños".
  3. En Alertas, establezca una alerta para "Cumpleaños".

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

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

    
respondido por el bispymusic 02.03.2013 - 18:05
0

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

Creo que podría hacer que esto funcione con un script de acciones de carpeta. Habilitar el calendario de cumpleaños en ical. Luego adjunte un script a la carpeta donde se almacenan estos eventos. Cuando se agrega un nuevo evento (es decir, ha agregado un nuevo cumpleaños a su libreta de direcciones), se activará la secuencia de comandos.

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

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

Es posible que tengas que buscar en las listas de calendarios hasta que encuentres la carpeta correcta, pero debería estar allí.

A partir de ahí, el script tomaría el nuevo elemento agregado a la carpeta, luego lo copiaría en un calendario separado y agregaría la alarma. Para configurarlo, crearía un nuevo calendario en el que desea que se eliminen estos nuevos eventos. Tome los eventos de su calendario de cumpleaños y arrástrelos al escritorio o a algún lugar (se eliminarán más adelante). Luego abre cada uno de ellos. Le preguntará a qué calendario desea agregarlos, así que simplemente elija el nuevo calendario que creó. Borre los archivos, hay que ir, ahora puede agregarles alarmas.

Dependiendo de cuántos cumpleaños tengas, podrías escribir un script que agregaría un evento a cada uno de estos individualmente, o (si eres como yo y tienes pocos días guardados) hazlo manualmente. Una vez hecho esto, un script de acción de carpetas hará el truco que estás buscando.

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 que agregues la alarma. ¡Prueba esto y hazme saber cómo funciona!

    
respondido por el Reina Abolofia 25.11.2011 - 09:16
0

Libreta de direcciones ya se coordina con iCal para crear eventos según la fecha en el campo de cumpleaños de cualquier contacto. Si solo necesitas alarmas, entonces solo necesitas una manera de agregar alarmas a estos eventos.

El problema es que la interfaz de usuario de iCal presenta el calendario como si fuera de solo lectura. Pero para AppleScript, el calendario no es realmente de solo lectura. Puede usar AppleScript para agregar alarmas a los eventos en el calendario de "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á de que todos los cumpleaños tengan una alarma. Parece que Libreta de direcciones solo realiza cambios mínimos cuando actualiza un evento de cumpleaños para un nombre cambiado o fecha de cumpleaños; las alarmas persisten en las actualizaciones de Libreta de direcciones , pero esto puede no ser confiable ya que Libretas de direcciones "posee" estos eventos y podría eliminarlos y recrearlos por completo cada vez que lo sintiera necesario para hacerlo.

No conozco una forma oficial de ser notificado de los cambios de Libreta de direcciones , pero, como sugiere el otro respondedor, es posible que pueda conectar una Acción de carpeta a la carpeta que contiene los eventos. Para el calendario de "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 este es un detalle interno, puede que no sea confiable en las diferentes versiones del sistema operativo. Todo lo anterior fue desarrollado y probado en Mac OS X 10.6.8.

Como alternativa, dado que el programa anterior garantiza que cada cumpleaños tenga una alarma, solo puede organizar su ejecución una vez al día o una vez que inicie sesión (puede usar un evento de iCal con una alarma de "Ejecutar script" o guardar el programa como una aplicación y configurarlo como un elemento de inicio de sesión).

La creación de sus propios eventos (en su propio calendario) es ciertamente posible, pero mantenerlos sincronizados con los datos de cumpleaños puede ser complicado (la búsqueda por "nombre y fecha" por lo general no es suficiente porque el usuario puede cambiar cualquiera de estos, y Es posible que su programa "make alarms" no pueda determinar los valores originales en el momento en que sepa que un contacto en particular se ha actualizado con un nuevo nombre o fecha de cumpleaños). Libreta de direcciones resuelve este problema al codificar el identificador único interno del contacto en la URL que guarda en cada propiedad url del evento de cumpleaños; Dado que el calendario es de "solo lectura", no tiene que preocuparse por que un usuario cambie o elimine sus URL especiales, por lo que puede confiar en que sean precisos.

Eliminamos todas las alarmas existentes suponiendo que todas las alarmas son "nuestras" ya que Libreta de direcciones no agrega alarmas por sí sola, y iCal no permite a los usuarios agregar alarmas. Desafortunadamente, no hay ninguna propiedad adicional en la que podamos agregar cualquier tipo de identificador único a la alarma en sí misma (aunque si la hora exacta de la alarma no es importante, podría ser posible codificar cierta 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 revisar las alarmas existentes para ver si coinciden con nuestra configuración de alarma deseada actual.

    
respondido por el Chris Johnsen 25.11.2011 - 11:32

Lea otras preguntas en las etiquetas