AppleScript para eventos do iCal a partir de entradas do Catálogo de Endereços

0

Eu quero criar um script que cria eventos alarmados no iCal para aniversários de pessoas que eu tenho no meu livro de endereços. Infelizmente, estou muito mal trabalhando com o AppleScript.

Abaixo está o esboço do que eu faço, eu adoraria alguma ajuda sobre o que o roteiro real deveria ser.

  • executar script quando uma alteração é feita para uma data de nascimento no catálogo de endereços ou quando o catálogo de endereços é encerrado
  • definir lista de pessoas (terá um alarme extra, veja abaixo)
  • pesquisar aniversários inseridos no catálogo de endereços
  • se nenhum evento estiver presente no calendário ical chamado "aniversários" para aniversários encontrados no livro de endereços (verifique nome e data)
    • criar novo evento de dia inteiro no calendário de aniversários com alarme na data e título "(Nome da pessoa) 's aniversário)
  • se aniversário está na lista definida anteriormente
    • adicione alarme extra duas semanas antes do aniversário
  • exibir mensagem mostrando quais novos eventos foram criados quando o script foi executado

Eu não acho que o script seria tão complexo ou longo. qualquer ajuda seria muito bem vinda.

Não sei como esse script pode ser acionado, mas o ideal é que ele seja executado se uma alteração for feita em um aniversário no catálogo de endereços (ou se um novo for adicionado).

Sam
fonte
Isso não significa uma resposta óbvia, mas sob quais circunstâncias aniversários no Address Book não aparece no calendário de aniversários no iCal? Eu nunca vi isso (falta de) comportamento ...
Dan J
Aprender o Applescript é muito útil. Mas pessoalmente eu uso Date 2 iCal para isso.
Alan Shutko

Respostas:

1

Para definir alertas únicos em todos os aniversários, você pode evitar um script completamente:

  1. Abra as Preferências do Calendário no Calendário.
  2. Em Geral, marque "Mostrar calendário de aniversários".
  3. Em Alertas, defina um alerta para "Aniversários".

Eu não tenho tempo para realmente escrever um AppleScript para as partes de alarme duplo, mas isso artigo parece cobrir muito bem os alarmes de calendário de script. Eu imagino que você precisaria apenas criar um arquivo ou lista no script que contém os nomes dos eventos (que você pode deduzir da convenção de nomenclatura padrão que o aplicativo Calendar usa).

Também estou usando o aplicativo Mountain Lion with Calendar. Não me lembro se os passos acima funcionam em versões mais antigas do iCal.

bispymusic
fonte
O tempo máximo antes dos Alertas para aniversários do iCal é de 1 semana (10.10.x). Mas você pode atualizar as datas de alerta de dentro dos eventos individuais usando "personalizado"
markhunte
0

Eu acredito que a diferença é que o calendário do aniversário não cria alarmes antes do evento. Também não permite adicioná-los manualmente.

Eu acho que você poderia fazer este trabalho com um script de ações de pasta. Ative o calendário de aniversários em ical. Em seguida, anexe um script à pasta em que esses eventos estão armazenados. Quando um novo evento é adicionado (ou seja, você adicionou um novo aniversário ao seu catálogo de endereços), o script será acionado.

Aqui está a pasta onde encontrei meus eventos de aniversários:

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

Você pode ter que vasculhar as listas de calendários até encontrar a pasta correta, mas ela deve estar lá.

A partir daí, o script levaria o novo item adicionado à pasta e depois copiaria para um calendário separado e adicionaria o alarme. Para configurá-lo, criaria um novo calendário onde você deseja que esses novos eventos sejam descartados. Tire os eventos do calendário de aniversários e arraste-os para a área de trabalho ou em algum lugar (eles serão excluídos mais tarde). Em seguida, abra cada um deles. Ele perguntará para qual calendário você deseja adicioná-los. Escolha apenas a nova agenda que você criou. Exclua os arquivos, lá você vai, agora você pode adicionar alarmes a eles.

Dependendo de quantos aniversários você já tem, você pode escrever um script que adicione um evento a cada um deles individualmente ou (se você for como eu e tiver tão poucos dias salvos) faça isso manualmente. Uma vez feito isso, um script de ação de pastas faria o truque que você está procurando.

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

Desculpe, não tenho o código exato para você adicionar o alarme. Tente isso e deixe-me saber como funciona!

Reina Abolofia
fonte
0

Livro de endereços já coordena com iCal para criar eventos com base na data no campo de aniversário de qualquer contato. Se tudo o que você precisa apenas de alarmes, você só precisa de uma maneira de adicionar alarmes a esses eventos.

O problema é que a interface do usuário do iCal apresenta o calendário como se fosse somente leitura. Mas para o AppleScript, o calendário não é realmente somente leitura. Você pode usar o AppleScript para adicionar alarmes aos eventos no calendário "Aniversários":

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

Toda vez que você executar este programa, ele irá, efetivamente, garantir que todos os aniversários tenham um alarme. Parece que Livro de endereços faz apenas alterações mínimas quando atualiza um evento de aniversário para um nome alterado ou data de aniversário; os alarmes persistem em atualizações de Livro de endereços , mas isso pode não ser confiável Livros de endereços "Possui" esses eventos e pode excluí-los e recriá-los completamente sempre que sentir a necessidade de fazê-lo.


Eu não sei de uma maneira oficial de ser notificado de Livro de endereços alterações, mas como o outro respondente sugere, você pode ser capaz de ligar uma ação de pasta para a pasta que contém os eventos para o calendário de "aniversários". Você pode abrir essa pasta com 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

Como esse é um detalhe interno, ele pode não ser confiável em diferentes versões do sistema operacional. Todos os itens acima foram desenvolvidos e testados no Mac OS X 10.6.8.

Como alternativa, como o programa acima garante que todos os aniversários tenham um alarme, você pode organizá-lo uma vez por dia ou uma vez no login (você pode usar um evento do iCal com um alarme "Executar script" ou salvar o programa como um aplicativo e configurá-lo como um item de login).


Criar seus próprios eventos (no seu próprio calendário) é certamente possível, mas mantê-los sincronizados com os dados de aniversário pode ser complicado (a pesquisa por “nome e data” geralmente não é suficiente porque o usuário pode alterar qualquer um deles e seu “make” programa de alarmes "pode ​​não ser capaz de determinar os valores originais no momento em que ele sabe que um contato em particular foi atualizado com um novo nome ou data de aniversário). Livro de endereços resolve esse problema codificando o identificador exclusivo interno do contato para o URL que ele salva em cada evento de aniversário url propriedade; Como o calendário é "somente leitura", ele não precisa se preocupar com a alteração ou a exclusão de URLs especiais de um usuário, de modo que ele pode confiar na precisão deles.

Excluímos todos os alarmes existentes no pressuposto de que todos os alarmes são "nossos" Livro de endereços não adiciona alarmes sozinho e iCal não permite que os usuários adicionem alarmes. Infelizmente, não há nenhuma propriedade extra em que possamos adicionar qualquer tipo de identificador exclusivo ao alarme em si (embora, se a hora exata do alarme não for importante, talvez seja possível codificar algumas informações no valor numérico da compensação do minuto do alarme ). Parece mais fácil excluir os alarmes e criar exatamente o que queremos, em vez de verificar os alarmes existentes para ver se eles correspondem à nossa configuração de alarme atual desejada.

Chris Johnsen
fonte
Hmm, seria possível modificar o seu script para não adicionar um alarme a pessoas com uma determinada propriedade (por exemplo, Empresa ou um relacionamento = ex-parceiro) ou pessoas de um determinado grupo?
d-b