3

Si je voulais regarder à travers mon calendrier OS X (anciennement "iCal") pour trouver des événements dont le résumé était "Déjeuner", je pourrais faire quelque chose comme ceci:Comparaisons/Requêtes riches en Javascript pour l'automatisation (JXA) "dont()"

var eventsContainer = Application('Calendar').calendars[0].events 
for (var i = 0; i < eventsContainer.length; i++) { 
    var thisEvent = eventsContainer[i]; 
    if (thisEvent.summary() == 'Lunch') { doSomething() } 
} 

même en tenant compte du fait que cette recherche seulement sur le premier calendrier, il est très, très, très lent, car chaque événement iCal doit être traduit à un objet Javascript pour fonctionner. Voici une formulation qui est beaucoup plus rapide:

var foundEvents = Application('Calendar').calendars.events.whose({summary: 'Lunch'}); 

Cela fonctionne très bien pour une correspondance exacte summary == 'Lunch'. Mais qu'en est-il des comparaisons telles que endDate: > new Date() ou summary: /lunch/i? Est-il possible de passer le code natif (ObjC) dans un sélecteur de()? Existe-t-il des documents pour whose() qui pourraient aider?

+0

Cette question connexe: http://stackoverflow.com/questions/27072977/using-whose-on-arrays -in-javascript-for-automation consistait principalement à obtenir la forme simple de 'dont()' pour fonctionner dans l'implémentation initiale de JXA. Ce n'est pas un doublon Q. –

Répondre

3

La documentation pertinente est avéré être dans les Notes de version pour Interapplication Communication pour OS X 10.10: https://developer.apple.com/library/mac/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/Articles/OSX10-10.html

Le côté droit de l'objet dans l'argument whose() peut prendre un autre objet un élément dans lequel la gauche le côté donne un opérateur et le côté droit donne une valeur. Par exemple:

.calendars.events.whose({summary: {_beginsWith: 'Lunch'}}); 

ou dans mon cas, pour trouver des événements à partir d'aujourd'hui:

var startOfDay = new Date(); 
    startOfDay.setHours(0); 
    startOfDay.setMinutes(0); 
    startOfDay.setSeconds(0); 
    startOfDay.setMilliseconds(0); 
    var endOfDay = new Date(); 
    endOfDay.setHours(23); 
    endOfDay.setMinutes(59); 
    endOfDay.setSeconds(59); 
    endOfDay.setMilliseconds(999); 

    var events = Application('Calendar').calendars.events.whose({ 
     _and: [ 
      { startDate: { _greaterThan: startOfDay }}, 
      { startDate: { _lessThan: endOfDay }} 
     ] 
    }); 
    var convertedEvents = events(); 
    for (var cal of convertedEvents) { 
     for (var ev of cal) { 
      console.log(ev.summary()); 
     } 
    } 
+1

Merci de partager une bonne question et une bonne réponse! – JMichaelTX

+0

Merci! Je vais laisser la "réponse acceptée" ouverte pour voir si quelqu'un peut améliorer la syntaxe/vitesse. La requête prend 20 secondes sur mon ordinateur. –

+0

"La requête prend 20 secondes sur mon ordinateur" - cela me surprend. Il serait intéressant de chronométrer juste à travers les "var events = ...". déclaration. Je le ferais mais je n'utilise pas Apple Calendar. J'étais plus intéressé par l'approche générale et l'utilisation de la fonction(). – JMichaelTX