Pergunta

Eu estou tentando escrever um AppleScript para consulta iCal e encontrar todos os eventos que eu tenho para uma determinada data, em qualquer calendário.

Eu comecei escrevendo um script simples que faz algo simples, com todos os eventos em um determinado calendário:

tell application "iCal"
  tell calendar "Reuniones"
    set the_events to every event
    repeat with an_event in the_events
        -- do something with every event
        set value to summary of an_event
    end repeat
   end tell
end tell

No entanto, este script simples é levado muito tempo para executar (alguns segundos), mesmo que eu não estou fazendo nada complexo dentro do loop. Tenho medo de que o script de verdade vai realmente ter um monte de tempo para executar.

Eu não estou muito familiarizado com AppleScript, e, assim, eu imagino que eu estou fazendo algo bobo que tem implicações de desempenho graves.

Alguém pode me explicar por que isso leva muito para executar? Alguém pode sugerir algo para melhorar o meu código? Estou indo agora para começar a verificar a data do evento, com uma condição no loop. Eu suspeito que deve haver uma maneira de procurar eventos com uma data (como a ação Automator faz), mas eu não tenho sido capaz de encontrar uma maneira "nativo" para fazê-lo ....

Editar : Eu estou usando o Mac OS X Tiger (10.4). É possível que versões mais recentes do iCal melhoraram a biblioteca de operações disponíveis.

Foi útil?

Solução

Eu estive lutando com isso hoje e descobri que você pode filtrar por data (pelo menos no Snow Leopard). Então

tell application "iCal"
    set out to ""
    set todaysDate to current date
    set time of todaysDate to 0
    repeat with c in (every calendar)
        set theEvents to (every event of c whose start date ≥ todaysDate)
        repeat with current_event in theEvents
            set out to out & summary of current_event & "\n"
        end repeat
    end repeat
    return out
end tell

retornará o resumo de todos os eventos futuros, e muito rapidamente, em comparação com a iteração através de todos os eventos.

Outras dicas

Não é AppleScript, mas o melhor do grupo de outras maneiras de fazer isso parece ser iCalBuddy , que utiliza as APIs do cacau públicas, em vez de analisar o arquivo de calendário diretamente e alças eventos repetidos de forma sensata.

icalBuddy -nc -eed -iep title,datetime eventsToday+1

Minha intenção inicial era para selecionar apenas os eventos para uma determinada data, mas, aparentemente, não existem métodos em iCal para acessar somente os eventos de um dia específico.

Assim, é sempre necessário passar por cima de todos os eventos registrados em cada calendário. Mesmo quando interessado nos acontecimentos de um único calendário, dizer 'reuniões de hoje", é necessário passar por todo o conjunto de eventos.

Os melhores alternativas que eu encontrei em torno da web não usar o Apple script, mas em vez disso, processar os arquivos 'ICS', onde a informação é realmente armazenados.

Para referência, esses arquivos estão localizados em '~ / Library / ApplicationSupport / iCal'.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top