Hallo, bin leider ein absoluter Neuling in Applescript, ich suche ein Script oder einen Ansatz für folgendes Problem:
Ich möchte die Zeit für eine offne Datei erfassen, da ich viel von zu Hause arbeite und die Arbeitszeit bei meinen Chef abrechnen muss, leider immer viele einzelne Dateien (freistellen von Bilder, konvertieren u.s.w.). Oder gibt es vielleicht ein brauchbares Tool für Mac OS X?
Ich Danke euch in voraus
Zeiterfassung für aktives Fenster oder eine geöffnete Datei
Ich nehme mal an, dass Du die Dateien mit Photoshop bearbeitest. Richtig? ;-)
***** Wir hatten hier schon mal ein Zeiterfassungs-Problem zu lösen und zwar im Thema "Auftragserfassung per Script" http://www.page-online.de/page/forum/viewthread/2492/
Doch scheint mir die damals gefundene Lösung nicht geeignet für Deine Aufgabe.
***** Ich habe nun hier http://www.versiontracker.com/ im Suchen-Feld das Wort "timer" eingetippt. Das Ergebnis: 95 Produkte, unter denen sicher das eine oder das andere geeignet wäre. Wie zum Beispiel "Project Timer Pro 1.1.2".
***** Man könnte aber auch versuchen, ein AppleScript nach Mass zu entwickeln. Hier eine kurze Skizze: 1. Datei öffnen. 2. Ein Sichern-Unter vornehmen. 3. Bearbeiten. 4. Zwischenhinein normal Sichern. 5. Am Schluss ein letztes Sichern. 6. Datei schliessen.
Um dann von den einzelnen Dateien die aufgewendete Zeit zu erfassen, wählt man sie aus (oder den Ordner, in welchem sie sich befinden) und zieht sie auf ein als Droplet gesichertes Script.
Dieses Script notiert von jeder Datei den Namen, das Erstellungs- Datum (deshalb das Sichern-Unter), das Modifikations-Datum. Dann errechnet es daraus die Zeit und schreibt das Ergebnis in eine Rapport-Datei.
Das sind so die ersten Gedanken.
Gruss, Hans
Zeiterfassung für aktives Fenster oder eine geöffnete Datei
Hallo Hans, vielen Dank für deine schnelle Antwort. Project Timer und ähnliche Programme habe ich schon getestet, das ist aber nicht das was ich suche, näher kommt da schon dein Script im Thema "Auftragserfassung per Script". Mir gefällt hier das für jede Datei eine txt erzeugt wird in der die Daten stehen. Das Problem ist das es unterschiedliche Daten sind die ich aufbereiten muss (FreeHand, PhotoShop, InDesign, Word) es sind meist Kundendaten für die Druckerei, die natürlich so wenig Arbeit wie möglich (mit den Daten) haben wollen. Deshalb dachte ich an einer Zeiterfassung wie z.B.
tell active window set counter
oder so, leider habe ich nicht den Durchblick alleine.
Zeiterfassung für aktives Fenster oder eine geöffnete Datei
also ... mit einem AppleScript hat man sicher nicht die Möglichkeiten, welche eine professionelle Timer-Applikation bietet.
Für das Überwachen von offenen Fenstern sehe ich keine Möglichkeit.
Abgesehen vom manuellen Notieren der Zeiten kommt meiner Meinung nach nur die vorher skizzierte Lösung in Frage. Dazu müsste man aber konsequent jede Arbeitsperiode mit einem Sichern-Unter und dem abschliessenden Sichern abgrenzen und die Datei aufs Droplet ziehen, damit der Eintrag in die Rapport-Datei vorgenommen werden kann.
Gruss, Hans
Zeiterfassung für aktives Fenster oder eine geöffnete Datei
Hallo Hans, vielen Dank für die Antwort, schade das es nicht möglich ist, aber wäre es möglich das andere Script so zu gestalten, das sich die Datei die man auf Droplet zieht gleich öffnet, damit wäre ich schon mehr als zufrieden.
Gruss Crow
Zeiterfassung für aktives Fenster oder eine geöffnete Datei
meinst Du mit dem "anderen Script" das Droplet "AuftragErfassung_02d"?
Ja, es sollte möglich sein, die Datei zu öffnen. Aber was sollte gleichzeitig geschehen? Ein Eintrag in die Log-Datei mit Namen und Art der Datei, und der Startzeit? Ist auch denkbar.
Dann machst Du den Freisteller. Sicherst. Und beim Schliessen soll die aktuelle Zeit sowie die Dauer eingetragen werden? Da sehe ich keine Möglichket.
Es müsste wieder die Datei auf das Droplet gezogen werden. Doch wie soll das Script wissen, ob es die Datei öffnen lassen soll oder "nur" die Abrechnung in der Log-Datei eintragen?
Gut, es könnte die Aktionen abwechselnd machen. Bedingung wäre aber, dass der Vorgang für jede Datei komplett ausgeführt würde.
Die ganze Sache steht demnach auf tönernen Füssen. Ich ziehe immer noch die vorher skizzierte Lösung vor.
Gruss, Hans
Zeiterfassung für aktives Fenster oder eine geöffnete Datei
Hallo Hans, ich verstehe das Problem beim zweiten draufziehen würde open ja wieder gestartet werden, dumm von mir. Würdest Du mir denn beim Erstellen des Scriptes (dein Vorschlag) zur Seite stehen?
Gruss Crow
Zeiterfassung für aktives Fenster oder eine geöffnete Datei
nein, das ist nicht dumm von Dir. Aber das Script ist dumm. Oder nicht intelligent ... Doch wie sollte es Deine Gedanken erraten können?
Man könnte im Droplet einen Lichtschalter einbauen, d.h. einen Zähler. Bei ungeraden Werten würde versucht, die Datei zu öffnen. Bei geraden würde nur die Zeit gestoppt und abgerechnet. Das könnte wunderbar funktionieren. Tagelang. Bis der Anwender sich mal vertut und entweder vergisst, die Datei zurückzulegen oder stattdessen eine andere öffnen will.
In solch einem Fall würde man das Problem zwar sofort bemerken. Aber mindestens eine Zeitmessung wäre nicht gemacht.
Und nochmals nein: Bei Erstellen meines vorgeschlagenen Scriptes würde ich Dir nicht zur Seite stehen, sondern zuerst versuchen, eine Schneise in den Dschungel zu schlagen. :-) Bislang ist ja alles nur Theorie. Ich weiss noch nicht, ob sich meine Skizze wirklich in ein funktionierendes Script umsetzen lässt.
Ich finde, dass es am besten wäre, wenn ich beide Scripts entwickeln würde. Dann könntest Du sie testen und in der praktischen Erprobung würde sich die bessere Lösung rasch durchsetzen und allfällige Verbesserungswünsche würden auch laut.
Bitte teile mir per E-mail mit, welche Version des Mac OS X bei Dir läuft. Dies macht zwar vielleicht keinen Unterschied, aber dann hätte ich schon die Adresse, an welche ich die Droplets senden kann.
Gruss, Hans
Zeiterfassung für aktives Fenster oder eine geöffnete Datei
hier, wie versprochen, eine erste Version. Den folgenden Code im Format "Programm" speichern. Damit ergibt sich ein Droplet, welches ich Dir zustellen werde.
Zur Erinnerung: Damit das Ergebnis nicht verfälscht wird, musst Du daran denken, bei jeder Datei als erstes ein "Sichern-Unter" zu machen, damit das Erstellungsdatum mit dem Beginn der verrichteten Arbeit übereinstimmt.
Das Benutzen des Droplets ist einfach. Den Ordner, welcher die zu erfassenden Dateien enthält, auf das Icon des Droplets ziehen. Es können auch lose Dateien oder mehrere Ordner sein.
Bei allerersten Ausführen erscheint ein Dialog, in welchem der Ordner ausgewählt werden muss, in den die Logdatei geschrieben werden soll. Der Pfad zu diesem Ordner wird gespeichert. Der Dialog erscheint erst wieder, wenn der Logdatei-Ordner umbenannt oder veschoben wurde. Oder nach einem Kompilieren des Scripts.
Bei jeder Anwendung wird eine neue Logdatei erzeugt. Damit die schon bestehenden nicht überschrieben werden, setzt das Script das Datum samt Uhrzeit in den Namen, z.B. "Log_061111_102346.txt".
Von jeder Datei werden die Infos verlangt und daraus der Name, das Erstellungs- und das Änderungsdatum gezogen. Aus den beiden Daten wird die Zeitdifferenz errechnet und zusammen mit dem Namen in die Logdatei geschrieben.
Am Schluss wird noch das addierte Total angefügt. Das andere Script wird etwas schwieriger zu realisieren sein ...
Gruss, Hans
Zeiterfassung für aktives Fenster oder eine geöffnete Datei
Und wie per Mail gesagt: Der Code ist zwar ausgiebig mit Kommentaren versehen. Aber man kann nicht jedes Detail erklären (wegen der 6000-Zeichen-Limite). Wenn Du also Fragen hast, dann nur her damit!
Gruss, Hans
Zeiterfassung für aktives Fenster oder eine geöffnete Datei
das Droplet funktioniert super und ich kann mich nur bei Dir und diesem Forum bedanken, ich hoffe ich kann irgendwann auch mal jemanden helfen, ich werde auf jedemfall weiter aktiv bei diesem Forum teilnehmen.
Danke !!!
Gruss Ben
Zeiterfassung für aktives Fenster oder eine geöffnete Datei
und hier ist die Variante, welche die gedroppte Datei öffnet. Wie beim ersten Script muss beim ersten Ausführen der Ordner, in welchem die Logdatei erzeugt werden soll, gewählt werden.
Aus Erfahrung weiss ich, dass es gar nicht so einfach ist, per Script festzustellen, mit welchem Programm die aktuelle Datei geöffnet werden soll. Deshalb setze ich auf den "Finder"! :-) Und das funktioniert erstaunlich gut.
Damit im Ablauf keine unnötige Verzögerung auftritt, sollte das entsprechende Programm vorher gestartet werden. Es kann sonst ab und zu vorkommen, dass ein Dialog melden muss, dass die Datei nicht geöffnet werden kann.
Und wie "weiss" das Script, wann es die Datei öffnen und wann "nur" den Abschluss-Eintrag in die Logdatei vornehmen soll? Die Zählervariable ctr wird als property definiert und mit dem Wert Null initialisiert. Jedesmal, wenn man eine Datei auf das Droplet zieht, wird der Zähler um eins erhöht.
Und mit dem Test if ctr mod 2 is 1 then stellt man fest, ob der Zählerwert gerade oder ungerade ist. mod steht für modulo. Das Ergebnis der Rechnung ist der Restwert. Mit mod 2 kann dieser nur 1 oder 0 sein. 1 bedeutet einen ungeraden Wert (= die Datei muss geöffnet werden). 0 ergibt sich aus geraden Werten (= nur den Eintrag vornehmen).
Zum Stoppen der Zeit muss nicht zwingend dieselbe Datei gedroppt werden. Aber wichtig ist, dass es unmittelbar nach dem Schliessen des Dokuments gemacht wird. Sonst ist die eingetragene Zeit nicht korrekt.
Es braucht also gute Konzentration und eiserne Disziplin. Kein Problem für Dich, oder? ;-)
Keine Kommentare diesmal. Der Code ist eigentlich selbsterklärend. Falls Du dennoch Fragen haben solltest, gebe ich gerne Auskunft.
Gruss, Hans
Zeiterfassung für aktives Fenster oder eine geöffnete Datei
Hallo Hans, ich habe heute im laufe des Tages das Droplet ausprobiert und es funktioniert genau so wie ich es wollte, ich habe noch eine kleine Veränderung aus den ersten Script eingefügt, damit nicht vergesse die Datei ein zweites mal auf das Droplet ziehen.
on open droppedObject try alias logFolder on error set logFolder to (choose folder with prompt "Bitte den Logdatei-Ordner wählen.") as Unicode text end try set filePath to item 1 of droppedObject as Unicode text if not (filePath ends with ":") then set ctr to ctr + 1 set docName to name of (info for file filePath) as string set logFile to logFolder & "Zeiterfassung.txt" if ctr mod 2 is 1 then try tell application "Finder" to open file filePath on error display dialog "Diese Datei kann nicht geöffnet werden." buttons "OK" default button 1 with icon 2 set ctr to ctr - 1 error number -128 end try end if set curDate to current date try alias logFile set curString to readCur(logFile) set nPara to count of paragraphs of curString if nPara = 3 then writeEnd(logFile, curString, curDate) display dialog "Der Eintrag ist gemacht." buttons ¬ "OK" default button 1 with icon 1 giving up after 1 else if nPara is greater than 5 then if ctr mod 2 is 1 then writeBegin(logFile, curDate, docName) else writeEnd(logFile, curString, curDate) display dialog "Der Eintrag ist gemacht." buttons ¬ "OK" default button 1 with icon 1 giving up after 1 end if end if on error writeBegin(logFile, curDate, docName) end try end if end open
on readCur(logFile) set curString to read file logFile return curString end readCur
on writeBegin(logFile, curDate, docName) set aString to docName & return & "Beginn: " & curDate & return try open for access file logFile with write permission write aString to file logFile starting at eof close access file logFile on error try close access file logFile end try end try tell application "Finder" to set label index of file logFile to 6 end writeBegin
on writeEnd(logFile, curString, curDate) set oldTime to date (text 9 thru -1 of paragraph -2 of curString) if oldTime > curDate then set oldTime to oldTime - 12 * hours set nSecs to curDate - oldTime set difTime to convToTime(nSecs) set newString to "Ende: " & curDate & return & "Dauer: " & difTime & return & return try open for access file logFile with write permission write newString to file logFile starting at eof close access file logFile on error try close access file logFile end try end try tell application "Finder" to set label index of file logFile to 2 end writeEnd
on convToSecs(nSecs, timeStr) set AppleScript's text item delimiters to {":"} set nSecs to nSecs + ((text item 1 of timeStr) as integer) * 3600 set nSecs to nSecs + ((text item 2 of timeStr) as integer) * 60 set nSecs to nSecs + ((text item 3 of timeStr) as integer) set AppleScript's text item delimiters to {""} return nSecs end convToSecs
on convToTime(nSecs) set difH to text -2 thru -1 of ("0" & (nSecs div 3600)) set restSecs to nSecs mod 3600 set difM to text -2 thru -1 of ("0" & (restSecs div 60)) set difS to text -2 thru -1 of ("0" & (restSecs mod 60)) return difH & ":" & difM & ":" & difS end convToTime
--
Gruss Ben
Zeiterfassung für aktives Fenster oder eine geöffnete Datei
on open droppedObject try alias logFolder on error set logFolder to (choose folder with prompt "Bitte den Logdatei-Ordner wählen.") as Unicode text end try set filePath to item 1 of droppedObject as Unicode text if not (filePath ends with ":") then set ctr to ctr + 1 set docName to name of (info for file filePath) as string set logFile to logFolder & " Zeiterfassung.txt" if ctr mod 2 is 1 then try tell application "Finder" to open file filePath on error display dialog "Diese Datei kann nicht geöffnet werden." buttons "OK" default button 1 with icon 2 set ctr to ctr - 1 error number -128 end try end if set curDate to current date try alias logFile set curString to readCur(logFile) set nPara to count of paragraphs of curString if nPara = 3 then writeEnd1(logFile, curString, curDate) display dialog "Der Eintrag ist gemacht." buttons ¬ "OK" default button 1 with icon 1 giving up after 1 else if nPara = 5 then writeBegin1(logFile, curDate, docName) else if nPara = 6 then writeEnd1(logFile, curString, curDate) set curString to readCur(logFile) writeTotal(logFile, curString) else if nPara > 6 then if ctr mod 2 is 1 then writeBegin2(logFile, curString, curDate) else writeEnd2(logFile, curString, curDate) display dialog "Der Eintrag ist gemacht." buttons ¬ "OK" default button 1 with icon 1 giving up after 1 set curString to readCur(logFile) writeTotal(logFile, curString) end if end if on error writeBegin1(logFile, curDate, docName) end try end if end open
on readCur(logFile) set curString to read file logFile return curString end readCur
on writeBegin1(logFile, curDate, docName) set aString to docName & return & "Beginn: " & curDate & return try open for access file logFile with write permission write aString to file logFile starting at eof close access file logFile on error try close access file logFile end try end try tell application "Finder" to set label index of file logFile to 6 end writeBegin1
on writeBegin2(logFile, curString, curDate) set aString to text 1 thru -17 of curString as string set newString to aString & "Beginn: " & curDate & return try open for access file logFile with write permission set eof of file logFile to 0 write newString to file logFile starting at eof close access file logFile on error try close access file logFile end try end try tell application "Finder" to set label index of file logFile to 6 end writeBegin2
on writeEnd1(logFile, curString, curDate) set oldTime to date (text 9 thru -1 of paragraph -2 of curString) if oldTime > curDate then set oldTime to oldTime - 12 * hours set nSecs to curDate - oldTime set difTime to convToTime(nSecs) set newString to "Ende: " & curDate & return & "Dauer: " & difTime & return & return try open for access file logFile with write permission write newString to file logFile starting at eof close access file logFile on error try close access file logFile end try end try tell application "Finder" to set label index of file logFile to 2 end writeEnd1
on writeEnd2(logFile, curString, curDate) set oldTime to date (text 9 thru -1 of paragraph -2 of curString) if oldTime > curDate then set oldTime to oldTime - 12 * hours set nSecs to curDate - oldTime set difTime to convToTime(nSecs) set newString to "Ende: " & curDate & return & "Dauer: " & difTime & return & return try open for access file logFile with write permission write newString to file logFile starting at eof close access file logFile on error try close access file logFile end try end try tell application "Finder" to set label index of file logFile to 2 end writeEnd2
on writeTotal(logFile, curString) set nPara to count of paragraphs of curString set nSecs to 0 repeat with i from 4 to nPara by 5 set timeStr to (text 9 thru -1 of paragraph i of curString) set nSecs to convToSecs(nSecs, timeStr) end repeat set totTime to convToTime(nSecs) set newString to "Total: " & totTime try open for access file logFile with write permission write newString to file logFile starting at eof close access file logFile on error try close access file logFile end try end try end writeTotal
on convToSecs(nSecs, timeStr) set AppleScript's text item delimiters to {":"} set nSecs to nSecs + ((text item 1 of timeStr) as integer) * 3600 set nSecs to nSecs + ((text item 2 of timeStr) as integer) * 60 set nSecs to nSecs + ((text item 3 of timeStr) as integer) set AppleScript's text item delimiters to {""} return nSecs end convToSecs
on convToTime(nSecs) set difH to text -2 thru -1 of ("0" & (nSecs div 3600)) set restSecs to nSecs mod 3600 set difM to text -2 thru -1 of ("0" & (restSecs div 60)) set difS to text -2 thru -1 of ("0" & (restSecs mod 60)) return difH & ":" & difM & ":" & difS end convToTime
--
Zeiterfassung für aktives Fenster oder eine geöffnete Datei
ein Teil des Problems hängt mit der Anzahl Absätze in der Logdatei zusammen. Bei jedem Droppen wird diese Datei eingelesen und anhand der Absätze entschieden, welcher Handler aufgerufen wird.
Beim allerersten Ausführen ist noch keine Datei vorhanden. Der Test alias logFile ist die erste Zeile im 'try'-Wickel. Weil die Datei nicht gefunden werden kann, wird der Befehl im 'on error'-Abschnitt ausgeführt: 'writeBegin1(logFile, curDate, docName)'
Jetzt sind in der Datei zwei Zeilen. Aber weil die zweite mit einem Return abgeschlossen ist, sind es drei Absätze. Demzufolge wird 'writeEnd()' aufgerufen.
Beim nächsten Lesen der Datei ist das Ergebnis 6 Absätze. Es wird also ein einfacher Beginn geschrieben.
Bei abschliessenden Droppen zählt das Script 8 Absätze, schreibt das Ende und das Total.
Von nun an ist die Anzahl Absätze grösser als 8 und der Wert des Zählers 'ctr' wird geprüft, um zu entscheiden, ob ein Beginn- oder ein Ende-Handler mit anschliessendem Total-Berechnen und -Einfügen ausgelöst weden soll.
Der zweite Teil des Problems war, dass dem Handler 'writeBegin2()' nicht der aktuelle Inhalt der eingelesenen Datei übergeben worden ist.
Das modifizierte Droplet stelle ich Dir gleich zu.
Gruss, Hans
Zeiterfassung für aktives Fenster oder eine geöffnete Datei
Hallo Hans, vielen Dank das Du das Script überarbeitet hast, es funktioniert jetzt genau so wie ich es wollte. Ich sehe auch wo der Fehler lag, aber für einen Neuling ist das alles noch etwas viel, aber deine Erklärung helfen da schon weiter. Auf jedenfall werde ich an Applescript dranbleiben und ich hoffe das ich irgendwann auch mal jemanden helfen kann.
Gruss und vielen Dank Ben
Zeiterfassung für aktives Fenster oder eine geöffnete Datei
Nun, als Neuling hast Du Dich ganz wacker gehalten ... Respekt! Du bist einer meiner besten Schüler. Nur weiter so.
Allein schon das Erkennen, dass das Zuweisen der Etikettenfarbe auch bei Deinem Projekt nützlich sein könnte. Und dann der Versuch, das Total hinzubekommen. Ist aber recht knifflig, weil im Gegensatz zum alten Musterscript der Dateiname berücksichtigt werden muss.
Da gibt es nichts anderes, als nach jedem Droppen die Logdatei zu öffnen, die Zeilen zu zähle, die Bedingungen für den nächsten Lauf zu analysieren und den Code entsprechend anzupassen.
Übrigens: Man kann die Logdatei geöffnet halten und jeder Eintrag wird aktualisiert. Mit BBEdit genügt ein Klick in das Fenster. Mit TextEdit muss die Datei doppelgeklickt werden.
Bei beiden ist eine Schrift von Vorteil, bei welcher alle Zeichen die gleiche Breite haben. Dann sind die Zeiten schön aliniert, weil nach "Ende:" drei Leerschläge folgen und nach "Dauer:" deren zwei.
Und ja, wir warten gespannt auf Deine weiteren Postings!
Gruss, Hans
Zeiterfassung für aktives Fenster oder eine geöffnete Datei