Fischer-Bayern.de
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Applescript, Mysql, Shell Script und iCal

 
Neues Thema eröffnen   Neue Antwort erstellen    Fischer-Bayern.de Foren-Übersicht -> AppleScript X
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
BTB
•->
•->


Anmeldedatum: 15.09.2017
Beiträge: 2

BeitragVerfasst am: 15.09.2017 - 23:19    Titel: Applescript, Mysql, Shell Script und iCal Antworten mit Zitat

Hallo zusammen,

seit geraumer Zeit beschäftige ich mich mit applescript und bin dabei schon oft auf dieser Seite unterwegs gewesen. Die besten Inhalte findet man definitiv hier... Smile

Aktuell versuche ich, Daten aus einer lokalen Datenbank auszulesen und diese anschließend via Applescript in Verbund mit Shell Skript an iCal zu übergeben.

Folgende (in Teilen komplizierte aber funktionierende) Lösung habe ich mittlerweile hinbekommen:


Code:


set activities to paragraphs of (do shell script ("/Applications/XAMPP/xamppfiles/bin/mysql -u user -pmeinkennwort -D meinedatenbank -e \"SELECT date, date_ende, beschreibung, ort FROM activities WHERE YEAR(date)=2017 AND MONTH (date)=09 AND DAY(date)=15 ORDER BY date\"| tail -n +2"))

repeat with activity in activities
   
   set jj_start to get numbers from character 1 to character 4 of activity as text
   set mm_start to get numbers from character 6 to character 7 of activity as text
   set dd_start to get numbers from character 9 to character 10 of activity as text
   set uhrzeit_start to get numbers from character 12 to character 16 of activity as text
   set start to date (dd_start & "." & mm_start & "." & jj_start & " " & uhrzeit_start)
   
   set jj_ende to get numbers from character 21 to character 24 of activity as text
   set mm_ende to get numbers from character 26 to character 27 of activity as text
   set dd_ende to get numbers from character 29 to character 30 of activity as text
   set uhrzeit_ende to get numbers from character 32 to character 36 of activity as text
   set ende to date (dd_ende & "." & mm_ende & "." & jj_ende & " " & uhrzeit_ende)
   
   tell application "Calendar"
      activate
      set theDate to current date
      set neuerEintrag to (make new event at the end of events in calendar "Mein Kalender")
      tell neuerEintrag
         set start date to start
         set end date to ende
         set summary to "Titel"
         set location to "ort"
         set description to "beschreibung"
      end tell
      save
      
   end tell
   
end repeat



Erläuterungen:

Mit dem Shell Skript wird ein select Befehl an die MSQL Datenbank geschickt, wobei die Einträge des heutigen Tages selektiert werden.

Anschließend wird das Skript etwas "komplizierter". So wie ich es verstanden habe, muss das Start- und Enddatum für iCal entsprechend mit "as date" formatiert werden. Dazu wird jedes Datum zunächst in Jahre, Monate und Tage und Uhrzeit zerlegt und entsprechend neu zusammengesetzt. Das funktioniert auch so weit. (Das Datenbank-Format Datetime kann anscheinend nicht übernommen werden.)

Aufgrund unterschiedlicher String-Längen bei dem Titel, der Beschreibung und dem Ort ist die von mir gewählte Vorgehensweise nicht mehr möglich. Und nicht nur deshalb... Wink

Für mich stellt sich nun die Frage, ob ich - analog zu PHP in Verbindung mit MYSQL - die Daten in Arrays speichern kann und diese anschließend für den Export an iCal einsetzen kann.

So sollte es aussehen:

1. Suche alle Datenbankeinträge aus der Datenbank, die dem heutigen Tag entsprechen

2. Führe für jeden Eintrag Folgendes durch:

- erstelle eine Variable für das Startdatum (diese wird anschließend mit date formatiert) - ggf. so wie oben beschrieben
- erstelle eine Variable für das Enddatum (diese wird anschließend mit date formatiert) - ggf. so wie oben beschrieben
- erstelle eine Variable für den Titel
- erstelle eine Variable für die Beschreibung
- erstelle eine Variable für den Ort

3. Erstelle für jeden Datenbankeintrag ein Ereignis bzw. einen Termin in Calendar

Nach tagelangem Suchen im Netz bin ich auf keine Lösung gestoßen, wie ich in Verbindung mit SHELL SKRIPT!!! Variablen definieren kann.

Der Tabellenaufbau ist wie folgt:

id date date_ende beschreibung titel ort
1 2017-09-15 15:00 2017-09-15 16:00 Beispiel Beschreibung 1 Beispiel Titel 1 Beispiel Ort 1
2 2017-09-15 16:00 2017-09-15 17:00 Beispiel Beschreibung 2 Beispiel Titel 2 Beispiel Ort 2
3 2017-09-15 17:00 2017-09-15 18:00 Beispiel Beschreibung 3 Beispiel Titel 3 Beispiel Ort 3
4 2017-09-15 18:00 2017-09-15 19:00 Beispiel Beschreibung 4 Beispiel Titel 4 Beispiel Ort 4
etc.

Mein Ziel ist es:

date als Variable speichern
date_ende als Variable speichern
Beschreibung als Variable speichern
Titel als Variable speichern
Ort als Variable speichen

Mit diesen Variablen soll dann durch die Repeat Schleife für jede Datenbankeintrag ein iCal Kalendereintrag erstellt werden.

Über Anregungen, Hinweise oder vielleicht auch einen angepassten Code würde ich mich sehr freuen.

Vielen Dank im Voraus!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Wolle-77
•--->
•--->


Anmeldedatum: 25.02.2003
Beiträge: 447
Wohnort: Geldern

BeitragVerfasst am: 28.09.2017 - 10:50    Titel: Antworten mit Zitat

Hallo BTB,

ich habe hier kein MySQL-Spielplatz, um das alles nachzuvollziehen, denke aber, wir können auch so ein wenig optimieren.

Erstmal der Handler für Calendar:

Code:
on kalendereintrag(kalenderbeschreibungsname, beschreibung, schicht, dertag, monat, jahr)
tell application "Calendar"
         tell (calendar 1 whose description is kalenderbeschreibungsname)
            make new event with properties {allday event:false, url:"", end date:ende, class:event, start date:beginn, description:kennung, summary:beschreibung, location:""}
         end tell
      end tell
end kalendereintrag

Damit hast Du das schon mal zentraler. Und zu Deinem array: Da Du keine Angst vor do shell script hast, kann ich Dir eine schicke Methode zeigen, mit der Du in einem Rutsch einen string (Rückgabe vom Terminal), sofern er strukturiert und immer gleich ist, in einem Rutsch in ein AS-Array (hier heißt das jedoch Liste oder Record) bekommst.

Nehmen wir mal an, sowas hier wird vom Terminal zurückgegeben:

Tu, 7 Mar 2006 0:29 MEZ login true

Und Du möchtest jetzt direkt auf die einzelnen Teile zurückgreifen und diese in die Variablen Wochentag wt, Tag t, Monat m, Jahr j, Uhrzeit uhr, Ereignis e [login] und Schaltvorgang s [true] überführen. Die Zeitzone brauchst Du nicht und ignorierst Du sie.

Dann wäre das eine schöne und saubere Methode:

Code:
set ruckgabe to "Tu, 7 Mar 2006 0:29 MEZ login true"
set {wt, t, m, j, uhr, e, s} to (run script (do shell script "sed -E 's/([^,]{2}), ([0-9]{1,2}) ([A-Za-z]{3}) ([0-9]{4}) ([^ ]+) [A-Z]+ ([^ ]+) ([^ ]+)/{\"\\1\",\\2,\"\\3\",\\4,\"\\5\",\"\\6\",\\7}/' <<< " & quoted form of ruckgabe))


Der Trick von sed-Einsatz ist, daß die Bestandteile in eine AS-Liste in Textform überführt wird, teilweise mit Anführungszeichen für Text wie Tu, teilweise auch direkt in Zahlen wie das Jahr oder die boolsche Variable am Ende.

Und diese AS-Liste wird jetzt einfach in einem Rutsch in die 7 Variablen mit run script überführt.

So würde ich das auch mit Deiner MySQL-Abfrage machen.
_________________
Martin Wolter
--
Apple rocks the planet!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
BTB
•->
•->


Anmeldedatum: 15.09.2017
Beiträge: 2

BeitragVerfasst am: 29.09.2017 - 23:20    Titel: Ziel erreicht Antworten mit Zitat

Hallo Wolle-77,

vielen Dank für Deinen Beitrag und die äußerst interessanten Tipps zu "sed". Ich bin überzeugt, dass dieses Tool sehr viele interessante Möglichkeiten bietet und werde mich damit definitiv noch intensiver beschäftigen.

Als Anfänger in diesem Bereich habe ich mein Skript mit Deinen Tipps so gut es ging wie folgt optimiert.

Vorab: Nach tagelangem Probieren VOR DEINER LÖSUNG hab ich den iCloud Kalender etwas "durcheinandergebracht". Nun läuft das Skript so wie ich es mir vorgestellt habe: Daten werden aus einer Datenbank selektiert. Anschließend werden die einzelnen Datenbankeinträge in den Apple Calendar geschrieben. Event für Event Smile

Der Code sieht aktuell wie folgt aus:
Code:

-- Datenbank auswählen
display dialog "Bitte geben Sie den Namen für die Datenbank ein." default answer "" with title "Name eingeben" with icon stop giving up after 10 with hidden answer
set database to text returned of the result

--Kennwort eintragen
display dialog "Bitte geben Sie das Kennwort für den Zugriff auf die Datenbank ein." default answer "" with title "Kennwort eingeben" with icon stop giving up after 10 with hidden answer
set pw to text returned of the result

--der individuelle sql Befehl
set sql to "SELECT * FROM ..."

--shell skript an die mysql Datenbank (Verzeichnis von mysql engine ggf. anpassen)
set activities to paragraphs of (do shell script ("/Applications/XAMPP/xamppfiles/bin/mysql -u user -p" & pw & " -D " & database & " -N -e '" & sql & "'")) as list

--alle in die Liste eingelesen Elemente nacheinander in den Kalender eintragen > repeat...
repeat with activity in activities
   
   -- die Ergebnisse des SELECTs erscheinen als Tabulator-getrennte Werte
   -- 2017-09-18 08:00:00   2017-09-18 17:00:00   Straße Nr   12345   Musterstadt      Titel       Beschreibung
        -- deswegen muss man die Text-Trennzeichen mit nachstehendem Befehl definieren und erhält in meinem Beispiel die 6 genannten Blöcke als Text

   set text item delimiters to {"   "}
   
   set queryResults to the text items of activity

   -- Anwendung Deiner Hinweise :-)
   set {jahr1, monat1, tag1, stunde1, minute1, sekunde1} to (run script (do shell script "sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})/{\"\\1\",\"\\2\",\"\\3\",\"\\4\",\"\\5\",\"\\6\"}/' <<< " & quoted form of item 1 of queryResults))
   set start to date (tag1 & "." & monat1 & "." & jahr1 & " " & stunde1 & ":" & minute1)

   -- Anwendung Deiner Hinweise :-)   
   set {jahr2, monat2, tag2, stunde2, minute2, sekunde2} to (run script (do shell script "sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})/{\"\\1\",\"\\2\",\"\\3\",\"\\4\",\"\\5\",\"\\6\"}/' <<< " & quoted form of item 2 of queryResults))
   set ende to date (tag2 & "." & monat2 & "." & jahr2 & " " & stunde2 & ":" & minute2)

   -- ort, Beschreibung und Titel definieren
   set ort to items 3 thru 5 of queryResults as text
   set beschreibung to item 6 of queryResults
   set titel to item 7 of queryResults

   --handler aufrufen
   kalendereintrag(beschreibung, titel, ort, start, ende)
   
end repeat


--handler definieren
on kalendereintrag(beschreibung, titel, ort, start, ende)
   tell application "Calendar"
                -- Kalendername anpassen
      tell calendar "Kalendername"
         set theNewEvent to make new event at end with properties {description:beschreibung, summary:titel, location:ort, start date:start, end date:ende}
      end tell
   end tell
end kalendereintrag


Ich denke, dass man den noch weiter optimieren könnte. Vielleicht gibt es ja noch den ein oder anderen Tipp von interessierten Lesern (Umgang mit Tabulatoren bei sed, etc.).

Nochmals vielen Dank für die Hilfe und ein schönes Wochenende!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Fischer-Bayern.de Foren-Übersicht -> AppleScript X Alle Zeiten sind GMT + 2 Stunden
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2002 phpBB Group
Deutsche Übersetzung von phpBB.de


AppleScript für absolute Starter