iCal Import via Applescript...

iCal Import via Applescript...

Beitragvon SBurger163 » Mi 18. Jan 2012, 00:02

Hallo Miteinander!

Ich komme gleich zur Sache, "würge" schon ein gefühltes Jahr an dieser Sache rum und denke ich bin kurz davor, aber der "entscheidende" Hinweis fehlt halt noch.

Wer kann mir helfen ?

Ich versuche mittels Apple-Script die Termineinträge eines iCal-Kalender´s in eine FM-Tabelle zu importieren. Habe im Netz ein super Script gefunden, welches auch einwandfrei funktioniert, ABER das A-S soll die Termine "filtern",also schon vorhandene Einträge der FM-Tabelle gar nicht erst zum "Export" freigeben. (hier "gefundeneDatensaetze)

hier mal das Script in der entscheidenden Phase:

Code: Alles auswählen
      --hier soll er die vorhandenen Termine "auflisten" (im Layout iCal ist nur eine Tabelle mit den ICal_ID´s) !!
...       try
      tell application "FileMaker Pro"
         tell database "DB.fp7"
            show layout "iCal"
            set vorhandeneDS to every record of current layout
         end tell
      end tell
   end try
   
   
        --hier soll er "vergleichen" und die "neuen" in die Liste "gefundeneEintraege" schreiben...
       
tell application "iCal"
      
      set akt_Kalender to the first calendar whose title is the Kalendername
      
      set gefundeneEintraege to every event of akt_Kalender whose uid is not equal to vorhandeneDS  -- --> Hier happert´s gewaltig! Ich weiss nicht,
                                                                                                                                                                         was ich noch versuchen soll !
            
      set Terminliste to {}
      
      -- filtere Termine von allen Einträge (Vom Vorgänger, der die Termine nach event und liste sortiert hat, denke ich…)
      
      repeat with i from 1 to the count of the gefundeneEintraege
         set Eintrag to item i of the gefundeneEintraege
         if the class of Eintrag is event then
            set the end of Terminliste to Eintrag
         else if the class of Eintrag is list then
            repeat with z from 1 to the count of Eintrag
               set Termin to item z of Eintrag
               if the class of Termin is event then
                  set the end of Terminliste to Termin
               end if
            end repeat
         end if
      end repeat


Bitte um hilfe, hab schon graue Haare, wie kann ich das im A-S machen, dass ich erst gar keine "Dubletten" erzeuge, beim Import der Termine !

Vielen Dank schon jetzt,
Euer Stefan
SBurger163
 
Beiträge: 9
Registriert: Fr 2. Sep 2011, 11:38

Re: iCal Import via Applescript...

Beitragvon maccer » Mi 18. Jan 2012, 12:01

Hi Stefan,

Dein Script enthält bereits einige schwerwiegende Syntax-Fehler.

Allerdings, warum kompliziert, wenn's auch einfach geht. Wenn der reine Importscript funktioniert: einfach alles importieren und dann die doppelten mit einem FM-Script wieder raushauen - das ist um Vieles einfacher.
Ing. (grad.) Heinz-J. Feller
Systemanalyse - Datenmodellierung - FM-Coaching
nc-fellerbr2@netcologne.de
maccer
 
Beiträge: 309
Registriert: Di 9. Jan 2007, 01:00
Wohnort: Leverkusen

Re: iCal Import via Applescript...

Beitragvon SBurger163 » Mi 18. Jan 2012, 12:16

Hallo,

danke für die Antwort.

Ja, ich weis, das geht natürlich auch, aber ich wollte vermeiden, dass jedesmal der komplette Kalender importiert wird, da es doch recht lange geht. Es wäre schon schöner und

wie ich finde auch "cleaner" würden die Termine "vor" import gefilter werden.

Ich vermute, daß mein Fehler bei der sortierung irgendwo in den Variablen des Apple-Script liegt. Dass ich noph genauer definieren muss, dass die vorhandenen Datensätze als Liste
übergeben werden müssen und dann der Scriptschritt der vergleicht auch alle "items" der Liste abklappert... Aber wie ??

Versuche in irgendwelchen Apple-Script Beispielen etwas vergleichbares zu finden, aber bisher ohne Erfolg !

Keiner eine idee, wie ich "einfach" zwei Listen vergleichen kann und die "Fehlmenge" als neue Liste abfragen kann ?

Grüßle
Stefan
SBurger163
 
Beiträge: 9
Registriert: Fr 2. Sep 2011, 11:38

Re: iCal Import via Applescript...

Beitragvon maccer » Mi 18. Jan 2012, 12:38

Hi,

hier nur ein Beispiel für vorhandene Fehler (davon gibt es in Deinem Script etliche):

> whose uid is not equal to vorhandeneDS <

Du vergleichst hier unterschiedliche Datentypen: uid ist eine einzelne zahl vom Typ number oder integer und vorhandeneDS ist eine Liste.

Vermutlich müsste es lauten: "whose uid is not in vorhandeneDS" oder "whose uid is not equal to any list item of vorhandeneDS" - habe das noch nicht ausprobiert.
Ing. (grad.) Heinz-J. Feller
Systemanalyse - Datenmodellierung - FM-Coaching
nc-fellerbr2@netcologne.de
maccer
 
Beiträge: 309
Registriert: Di 9. Jan 2007, 01:00
Wohnort: Leverkusen

Re: iCal Import via Applescript...

Beitragvon SBurger163 » Mi 18. Jan 2012, 14:08

Hallo,

auch Dir danke für die Hinweise. Leider brachte das auch keinen Erfolg.

Wie kann ich die Liste der vorhandenen Datensätze "anlegen" ,

um sie mit den UID´s der Termine im Kalender zu "vergleidhen" und die Einträge die noch nicht vorhanden sind importieren ?

Das kann doch keine sooo wahnsinns Aufgabe sein, für so eine "gute" Script-Sprache, oder ?

Oder wäre es denkbar, ein "Berechnetes-Applescript" daraus zu machen und mit Filemaker-Variablen die Abfrage zu machen ?

Bin für jede Hilfe dankbar,

Stefan
SBurger163
 
Beiträge: 9
Registriert: Fr 2. Sep 2011, 11:38

Re: iCal Import via Applescript...

Beitragvon maccer » Mi 18. Jan 2012, 22:16

Hi,

>>> Wie kann ich die Liste der vorhandenen Datensätze "anlegen" ,

hier noch ein letzter Tipp:

tell database "DB.fp7" of application "FileMaker Pro"
set vorhandeneDS to get field "ICal_ID"
end tell

erzeugt eine Liste der vorhandenen ICal_ID's

Dann, wie schon gesagt, weiter mit "whose uid is not in vorhandeneDS"

Bevor du Dich an so etwas heran wagst, solltest Du Dich wirklich mit der jeweiligen AS-Syntax, der involvierten Programme vertraut machen. Ausreichende Informationen sind im Netz zu finden. Und unbedingt darauf achten, dass immer die korrekten Datentypen angesprochen bzw. miteinander verglichen werden !!!!

Und noch eins: ich habe den Verdacht, dass Du den AS einfach so als native Script in FM eingestellt hast. Wenn Du den von dort ausführst, erhältst Du aber keinerlei Informationen falls irgend etwas nicht korrekt läuft. Deshalb: jeden Script zunächst im AS-Script-Editor ausführen lassen. Der macht dich auf Syntax-Fehler aufmerksam und zeigt auch das Ergebnis des Scripts auf, so dass Fehler leichter zu erkennen sind.
Ing. (grad.) Heinz-J. Feller
Systemanalyse - Datenmodellierung - FM-Coaching
nc-fellerbr2@netcologne.de
maccer
 
Beiträge: 309
Registriert: Di 9. Jan 2007, 01:00
Wohnort: Leverkusen

Re: iCal Import via Applescript...

Beitragvon SBurger163 » Do 19. Jan 2012, 09:26

Hallo,
danke erstmal für Deine Zeit. aber auch Deine Vorschläge brachten keinen Erfolg.

Ich habe mir gedacht, wenn die "uid" eines Termins ein "item" des "events" ist, dann müsste ich vllt. den abzugleichenden Wert der vorhandenen Datensätze auch als "item" anlegen.

Habe es so versucht:

Code: Alles auswählen
iCal2FileMaker("Arbeit")

on iCal2FileMaker(Kalendername)
   
   --Abfrage der vorhandenen Datensätze der Tabelle (Das Layout hat nur eine Tabelle "id")
   
   tell application "FileMaker Pro"
      tell database "StefanBurgerDB.fp7"
         show layout "iCal"
         
         set iCalTabelle to get every record of current layout
         
         set vorhandeneDS to {}
         
         repeat with i from 1 to the count of the iCalTabelle
            set Datensatz to item i of the iCalTabelle
            set the end of vorhandeneDS to Datensatz
         end repeat
      end tell
   end tell
   
   log vorhandeneDS
   
   
   --Abfrage aller Termine des Kalenders "Arbeit" (hier nur die "uid", damit die Liste "clean" ist, da sonst zu jedem Event die "event id" mit ausgegeben wird)
   
   tell application "iCal"
      
      set iCalTermine to uid of every event of calendar Kalendername
      
      set gefundeneID to {}
      
      repeat with i from 1 to the count of the iCalTermine
         set Liste to item i of the iCalTermine
         set the end of gefundeneID to Liste
      end repeat
      
      
      log gefundeneID
      
      return gefundeneID
      


Hier die Ausgabe vom Script-Editor:

Code: Alles auswählen
tell application "FileMaker Pro"
   show layout "iCal" of database "StefanBurgerDB.fp7"
   get every record of current layout of database "StefanBurgerDB.fp7"
      --> {{"C2E282BF-8991-45C6-AB66-6A5202E85B7E"}, {"1B88ADDE-1E31-4BA5-AFE0-362CA2CBDAE1
"}}
end tell
(*C2E282BF-8991-45C6-AB66-6A5202E85B7E, 1B88ADDE-1E31-4BA5-AFE0-362CA2CBDAE1
*)
tell application "iCal"
   get uid of every event of calendar "Arbeit"
      --> {"C2E282BF-8991-45C6-AB66-6A5202E85B7E", "4BA10ED6-F01A-4165-84A6-50A2AFFF887B", "E40FD5AF-7D46-4F7F-8F62-EE20FAA6FF20", "B2A4A4A9-71B6-4F77-9B49-B92C9A7AC977", "D3704CAB-90FD-41DE-B415-2A303DD6D9F1", "876605EE-AB33-44D9-A42E-680B7A8AB343", "BE4884C2-7105-48E0-A606-A6DA33A4C1AD", "916EF445-F9FF-4244-B851-CABB4D6DAF07", "1B88ADDE-1E31-4BA5-AFE0-362CA2CBDAE1", "1DEA92D4-A964-44E5-BBCF-00CC6004181C", "38D44C77-0F87-4E71-A503-D4F1AFC23F27"}
   (*C2E282BF-8991-45C6-AB66-6A5202E85B7E, 4BA10ED6-F01A-4165-84A6-50A2AFFF887B, E40FD5AF-7D46-4F7F-8F62-EE20FAA6FF20, B2A4A4A9-71B6-4F77-9B49-B92C9A7AC977, D3704CAB-90FD-41DE-B415-2A303DD6D9F1, 876605EE-AB33-44D9-A42E-680B7A8AB343, BE4884C2-7105-48E0-A606-A6DA33A4C1AD, 916EF445-F9FF-4244-B851-CABB4D6DAF07, 1B88ADDE-1E31-4BA5-AFE0-362CA2CBDAE1, 1DEA92D4-A964-44E5-BBCF-00CC6004181C, 38D44C77-0F87-4E71-A503-D4F1AFC23F27*)
end tell
Ergebnis:
{"C2E282BF-8991-45C6-AB66-6A5202E85B7E", "4BA10ED6-F01A-4165-84A6-50A2AFFF887B", "E40FD5AF-7D46-4F7F-8F62-EE20FAA6FF20", "B2A4A4A9-71B6-4F77-9B49-B92C9A7AC977", "D3704CAB-90FD-41DE-B415-2A303DD6D9F1", "876605EE-AB33-44D9-A42E-680B7A8AB343", "BE4884C2-7105-48E0-A606-A6DA33A4C1AD", "916EF445-F9FF-4244-B851-CABB4D6DAF07", "1B88ADDE-1E31-4BA5-AFE0-362CA2CBDAE1", "1DEA92D4-A964-44E5-BBCF-00CC6004181C", "38D44C77-0F87-4E71-A503-D4F1AFC23F27"}


Und jetzt habe ich versucht, auf dem gleichen Weg, den "Vergleich" zu machen, aber er macht es nicht ? Warum ?

Code: Alles auswählen
--suche nur neue Termine und erstelle die Liste mit den UID´s mit "nur" den neuen/noch nicht vorhandenen Terminen
      
      set nurneueID to {}
      
      repeat with Y from 1 to the count of the gefundeneID
         set Liste2 to item Y of the gefundeneID
         if gefundeneID is not equal to vorhandeneDS then
            set the end of nurneueID to Liste2
         end if
      end repeat
      
      
      return nurneueID


Ausgabe davon:

Code: Alles auswählen
end tell
Ergebnis:
{"C2E282BF-8991-45C6-AB66-6A5202E85B7E", "4BA10ED6-F01A-4165-84A6-50A2AFFF887B", "E40FD5AF-7D46-4F7F-8F62-EE20FAA6FF20", "B2A4A4A9-71B6-4F77-9B49-B92C9A7AC977", "D3704CAB-90FD-41DE-B415-2A303DD6D9F1", "876605EE-AB33-44D9-A42E-680B7A8AB343", "BE4884C2-7105-48E0-A606-A6DA33A4C1AD", "916EF445-F9FF-4244-B851-CABB4D6DAF07", "1B88ADDE-1E31-4BA5-AFE0-362CA2CBDAE1", "1DEA92D4-A964-44E5-BBCF-00CC6004181C", "38D44C77-0F87-4E71-A503-D4F1AFC23F27"}


Oh, mann.... Ich weis wirklich nicht mehr, wie ich dem das beibringen soll, das muss doch möglich sein, oder ?

Im Netz sind noch vorschläge mit Unix-Shell-Programmen, aber das geht dann doch zu weit, denke ich...

Bitte um Hilfe !

Gruß
Stefan
SBurger163
 
Beiträge: 9
Registriert: Fr 2. Sep 2011, 11:38

Re: iCal Import via Applescript...

Beitragvon maccer » Do 19. Jan 2012, 14:41

Hi,

der Fehler liegt hier:


Code: Alles auswählen
set nurneueID to {}
     
repeat with Y from 1 to the count of the gefundeneID
      set Liste2 to item Y of the gefundeneID
         if gefundeneID is not equal to vorhandeneDS then
            set the end of nurneueID to Liste2
         end if
end repeat

-- musst Du ändern in: 

repeat with Y from 1 to the count of gefundeneID
      set ID_item to item Y of the gefundeneID
         if ID_item is not in vorhandeneDS then
            set nurneueID to nurneueID & (ID_item as list)
         end if
end repeat   
     
return nurneueID
Ing. (grad.) Heinz-J. Feller
Systemanalyse - Datenmodellierung - FM-Coaching
nc-fellerbr2@netcologne.de
maccer
 
Beiträge: 309
Registriert: Di 9. Jan 2007, 01:00
Wohnort: Leverkusen

Re: iCal Import via Applescript...

Beitragvon SBurger163 » Do 19. Jan 2012, 17:33

Ich glaub´s ja nicht ! Es hat funktioniert !

Habe die selbe Änderung in den vorherigen Abfragen gemacht und viola, es tut !

Vielen, vielen Dank nochmal, und hier das Ergebnis:

Code: Alles auswählen
iCal2FileMaker("Arbeit")

on iCal2FileMaker(Kalendername)
   
   --Abfrage der vorhandenen Datensätze der Tabelle (Das Layout hat nur eine Tabelle "id")
   try
      tell application "FileMaker Pro"
         tell database "DB.fp7"
            show layout "iCal"
            set iCalTabelle to get every record of current layout
            set vorhandeneDS to {}
            repeat with x from 1 to the count of the iCalTabelle
               set Datensatz to item x of the iCalTabelle
               set vorhandeneDS to vorhandeneDS & (Datensatz as list)
            end repeat
         end tell
      end tell
   end try
   
   --Abfrage aller Termine des Kalenders "Arbeit" (hier nur die "uid", damit die Liste "clean" ist, da sonst zu jedem Event die "event id" mit ausgegeben wird)
   
   tell application "iCal"
      
      set iCalTermine to uid of every event of calendar Kalendername
      set gefundeneID to {}
      repeat with i from 1 to the count of the iCalTermine
         set Liste to item i of the iCalTermine
         set gefundeneID to gefundeneID & (Liste as list)
      end repeat
      
      log gefundeneID
      
      --suche nur neue Termine und erstelle die Liste mit den UID´s mit "nur" den neuen/noch nicht vorhandenen Terminen
      
      set nurneueID to {}
      
      repeat with z from 1 to the count of gefundeneID
         set ID_item to item z of the gefundeneID
         if ID_item is not in vorhandeneDS then
            set nurneueID to nurneueID & (ID_item as list)
         end if
      end repeat
      
      log nurneueID
      
      --Setze die zu importierenden Event´s fest
      
      
      set iCalEvents to every event of calendar Kalendername
      
      set Terminliste to {}
      
      repeat with i from 1 to the count of the iCalEvents
         set Eintrag to item i of the iCalEvents
         if the uid of Eintrag is in nurneueID then
            set the end of Terminliste to Eintrag
         else if the class of Eintrag is list then
            repeat with z from 1 to the count of Eintrag
               set Termin to item z of Eintrag
               if the class of Termin is event then
                  set the end of Terminliste to Termin
               end if
            end repeat
         end if
      end repeat
      
      
      set the AnzahlTermine to the count of Terminliste
      repeat with i from 1 to the AnzahlTermine
         set Termin to item i of Terminliste
         set the Termin_properties to the properties of Termin
         set iCal_ID to the uid of the Termin_properties
         set Beschreibung to the summary of the Termin_properties
         set Datum to short date string of (get start date of the Termin_properties)
         set Beginn to time string of (get start date of the Termin_properties)
         set Ende to time string of (get end date of the Termin_properties)
         set Notiz to the description of the Termin_properties
         if Notiz is missing value then set Notiz to "keine Angabe"
         set Ort to the location of the Termin_properties
         if Ort is missing value then set Ort to "keine Angabe"
         
         tell application "FileMaker Pro"
            tell database "DB.fp7"
               show layout "AuftragsTabelle"
               set neuerDS to create new record
               set cell "id" of neuerDS to iCal_ID
               set cell "Beschreibung" of neuerDS to Beschreibung
               set cell "Datum" of neuerDS to Datum
               set cell "Beginn" of neuerDS to Beginn
               set cell "Ende" of neuerDS to Ende
               set cell "Notiz" of neuerDS to Notiz
               set cell "Ort" of neuerDS to Ort
               
            end tell
         end tell
         
      end repeat
      
   end tell
   
end iCal2FileMaker


Also, wenn´s jemandem hilft ! Hat mich gut zwei Tage gekostet, und ohne hilfe würde ich jetzt noch dran sitzen !

Bis zum nächsten mal
Stefan
SBurger163
 
Beiträge: 9
Registriert: Fr 2. Sep 2011, 11:38

Re: iCal Import via Applescript...

Beitragvon halooos111 » Sa 21. Apr 2012, 16:02

hi Stefan, ich finde das toll mit der Lösung so was habe ich lang gesucht!!!!
kannst du bitte noch ein bespiel Datei von filemaker hochladen? ich bekomme immer error "Objekt nicht vorhanden." number -1728 beim zugriff auf DB.fp7

Vielen Dank und Viele Grüße
Tony
halooos111
 
Beiträge: 1
Registriert: Sa 21. Apr 2012, 15:52


Zurück zu Daten Import und Export