[GastForen Programmierung/Entwicklung AppleScript Zeiterfassung für aktives Fenster oder eine geöffnete Datei

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Anonym
Beiträge gesamt: 22827

8. Nov 2006, 19:26
Beitrag # 1 von 28
Bewertung:
(5545 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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
X

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Hans Haesler
  
Beiträge gesamt: 5826

8. Nov 2006, 20:49
Beitrag # 2 von 28
Beitrag ID: #421295
Bewertung:
(5544 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Crow,

herzlich willkommen im PAGE-Forum! :-)

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


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Anonym
Beiträge gesamt: 22827

8. Nov 2006, 21:34
Beitrag # 3 von 28
Beitrag ID: #421296
Bewertung:
(5544 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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.


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Hans Haesler
  
Beiträge gesamt: 5826

8. Nov 2006, 22:48
Beitrag # 4 von 28
Beitrag ID: #421297
Bewertung:
(5544 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Crow,

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


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Anonym
Beiträge gesamt: 22827

9. Nov 2006, 08:23
Beitrag # 5 von 28
Beitrag ID: #421298
Bewertung:
(5544 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Hans Haesler
  
Beiträge gesamt: 5826

9. Nov 2006, 09:58
Beitrag # 6 von 28
Beitrag ID: #421299
Bewertung:
(5544 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Crow,

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


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Anonym
Beiträge gesamt: 22827

9. Nov 2006, 18:03
Beitrag # 7 von 28
Beitrag ID: #421300
Bewertung:
(5544 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Hans Haesler
  
Beiträge gesamt: 5826

9. Nov 2006, 20:06
Beitrag # 8 von 28
Beitrag ID: #421301
Bewertung:
(5544 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Crow,

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


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Hans Haesler
  
Beiträge gesamt: 5826

10. Nov 2006, 07:50
Beitrag # 9 von 28
Beitrag ID: #421302
Bewertung:
(5544 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Crow,

danke für das Senden der Infos.

Ich kann nicht sofort mit dem Entwickeln der Scripts beginnen, werde
aber versuchen, übers Wochenende eine erste Version herzustellen.

Gruss, Hans


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Hans Haesler
  
Beiträge gesamt: 5826

11. Nov 2006, 10:04
Beitrag # 10 von 28
Beitrag ID: #421303
Bewertung:
(5544 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Crow,

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.
Code
 -- die Variable 'logFolder' als 'property' definieren, damit der Pfad zum Logdatei-Ordner gespeichert wird 
property logFolder : ""
-- zwei weitere Variablen als 'global' definieren, damit sie in den Handlern erkannt werden
global logPath
global tSecs

on open allObjects
  -- den gespeicherten Pfad des Logdatei-Ordners prüfen
  try
    alias logFolder
  on error
    set logFolder to (choose folder with prompt "Bitte den Logdatei-Ordner wählen.") as Unicode text
  end try
 
  -- das akuelle Datum speichern
  set curDate to current date
  -- davon Jahr, Monat, Tag, Stunde, Minuten, Sekunden ausziehen und zusammensetzen
  set y to text -2 thru -1 of ((year of curDate) as string)
  set m to text -2 thru -1 of ((month of curDate as number) as string)
  set d to text -2 thru -1 of ((day of curDate) as string)
  set hh to text -2 thru -1 of ("0" & (hours of curDate))
  set mm to text -2 thru -1 of ("0" & (minutes of curDate))
  set ss to text -2 thru -1 of ("0" & (seconds of curDate))
  set timeString to y & m & d & "_" & hh & mm & ss
 
  -- den  Pfad zur Logdatei zusammensetzen
  set logPath to logFolder & "Log_" & timeString & ".txt"
 
  -- das Datum in eine Textkette verwandeln und ...
  set dateString to (curDate as string) & return
  -- ... als ersten Eintrag in die Logdatei schreiben
  writeLog(dateString)
 
  -- die Variable 'tSecs' initialisieren
  set tSecs to 0
 
  -- Wiederholungsschleife, welche alle gedroppten Objekte zum Handler 'processObject' schickt
  repeat with aObject in allObjects
    processObject(aObject)
  end repeat
 
  -- das Total Sekunden ins Format "hh:mm:ss" umrechnen lassen
  set timeString to convToTime(tSecs)
  -- die aktuelle Textkette zusammensetzen
  set aString to (return & return & "Total" & tab & timeString) as string
  -- und zum Handler schicken, welcher damit die Logdatei ergänzt
  writeLog(aString)
 
  -- den Anwender informieren
  display dialog "Fertig." buttons "OK" default button 1 with icon 1 giving up after 1
end open

-- im folgenden Handler wird festgestellt, ob das Objekt ein Ordner oder eine Datei ist
-- bei Ordnern wird eine Liste des Inhalts erstellt und die Elemente rekursiv behandelt
-- (d.h. zum aktuellen Handler geschickt)
-- Dateien werden zum Handler 'processFile' gesandt
on processObject(aObject)
  -- wenn der Pfad mit einem Doppelpunkt endet, ist das Objekt ein Ordner
  -- die Liste dessen Inhalts wird erstellt (ohne unsichtbare Dateien)
  if (aObject as string) ends with ":" then
    set contentsList to list folder aObject without invisibles
    -- dies ist das rekursive Teil: die Wiederholschleife schickt alle Objekte zum Handler,
    -- in welchem sie sich selbst befindet
    repeat with anItem in contentsList
      set objPath to ((aObject as string) & anItem)
      processObject(objPath as alias)
    end repeat
    -- wenn das Objekt eine Datei ist, dann wird der Pfad dem Handler 'processFile' übergeben
  else
    set okay to processFile(aObject as string)
  end if
end processObject

-- in diesem Handler werden die Details zusammengetragen
on processFile(aFile)
  -- die Infos der Datei werden gespeichert
  set fileInfo to (info for file aFile)
  -- der Name der Datei wird ausgezogen
  set fileName to name of fileInfo
  -- das Erstellungs- und das Änderungsdatum
  set creDate to creation date of fileInfo
  set modDate to modification date of fileInfo
  -- daraus die Sekunden errechnen
  set nSecs to modDate - creDate
  -- das Ergebnis zum Total addieren
  set tSecs to tSecs + nSecs
  -- zum Handler schicken, welcher die Sekunden in "hh:mm:ss" verwandelt
  set timeString to convToTime(nSecs)
  -- die aktuelle Textkette zusammensetzen
  set aString to (return & fileName & tab & timeString) as string
  -- und zum Handler schicken, welcher damit die Logdatei ergänzt
  writeLog(aString)
end processFile

on writeLog(aString)
  try
    open for access file logPath with write permission
    write aString to file logPath starting at eof
    close access file logPath
  on error
    try
      close access file logPath
    end try
  end try
end writeLog

on convToTime(nSecs)
  set hh to text -2 thru -1 of ("0" & (nSecs div 3600))
  set restSecs to nSecs mod 3600
  set mm to text -2 thru -1 of ("0" & (restSecs div 60))
  set ss to text -2 thru -1 of ("0" & (restSecs mod 60))
  return hh & ":" & mm & ":" & ss
end convToTime

Das andere Script wird etwas schwieriger zu realisieren sein ...

Gruss, Hans


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Anonym
Beiträge gesamt: 22827

11. Nov 2006, 18:51
Beitrag # 11 von 28
Beitrag ID: #421304
Bewertung:
(5544 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,
vielen, vielen Dank, das ging ja wirklich schnell, ich werde das Script testen und Dir dann Bescheid geben.

Wirklich toll :-)

Gruss crow


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Hans Haesler
  
Beiträge gesamt: 5826

11. Nov 2006, 20:45
Beitrag # 12 von 28
Beitrag ID: #421305
Bewertung:
(5544 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Crow,

bitteschön!

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


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Anonym
Beiträge gesamt: 22827

12. Nov 2006, 20:34
Beitrag # 13 von 28
Beitrag ID: #421306
Bewertung:
(5544 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

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


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Hans Haesler
  
Beiträge gesamt: 5826

12. Nov 2006, 22:26
Beitrag # 14 von 28
Beitrag ID: #421307
Bewertung:
(5544 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Ben,

bitteschön. :-)

Ich habe heute Morgen begonnen, das zweite Script zu entwickeln.
Es lässt sich gut an.

Aber am Nachmittag war ich anderweitig beschäftigt und heute
Abend musste ich auch andere Dinge erledigen.

Ich kann voraussichtlich nicht vor morgen Abend weiterfahren.

Gruss, Hans


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Anonym
Beiträge gesamt: 22827

13. Nov 2006, 09:24
Beitrag # 15 von 28
Beitrag ID: #421308
Bewertung:
(5544 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,
lass Dir nur Zeit, ich muß bis zum Ende der Woche eine Broschüre fertig bekommen.

Gruss
Ben


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Hans Haesler
  
Beiträge gesamt: 5826

13. Nov 2006, 21:48
Beitrag # 16 von 28
Beitrag ID: #421309
Bewertung:
(3229 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Ben,

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? ;-)
Code
 property ctr : 0 
property logFolder : ""
global logPath

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
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
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

Keine Kommentare diesmal. Der Code ist eigentlich selbsterklärend.
Falls Du dennoch Fragen haben solltest, gebe ich gerne Auskunft.

Gruss, Hans


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Anonym
Beiträge gesamt: 22827

14. Nov 2006, 05:01
Beitrag # 17 von 28
Beitrag ID: #421310
Bewertung:
(3229 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,
ich habe gerade dein Droplet bekommen und funktioniert fantastisch, genau das habe ich mir vorgestellt. Wirklich Klasse !!!!

Danke

Gruss
Ben


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Hans Haesler
  
Beiträge gesamt: 5826

14. Nov 2006, 07:04
Beitrag # 18 von 28
Beitrag ID: #421311
Bewertung:
(3229 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Ben,

bitteschön!

Aber immer daran denken: Es ist nur soviel Klasse wie sein Benutzer. :-)

Gruss, Hans


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Anonym
Beiträge gesamt: 22827

14. Nov 2006, 17:38
Beitrag # 19 von 28
Beitrag ID: #421312
Bewertung:
(3229 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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.

Vielen Dank für deine Hilfe.

--
property ctr : 0
property logFolder : ""
global logPath

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


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Hans Haesler
  
Beiträge gesamt: 5826

14. Nov 2006, 19:20
Beitrag # 20 von 28
Beitrag ID: #421313
Bewertung:
(3229 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Ben,

ja, gute Idee. :-)

Und wie schon erwähnt: Zum Stoppen der Zeit
kannst Du irgendeine Datei auf das Droplet ziehen.
Sogar die Logdatei!

Gruss, Hans


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Anonym
Beiträge gesamt: 22827

14. Nov 2006, 19:24
Beitrag # 21 von 28
Beitrag ID: #421314
Bewertung:
(3231 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,
nochmals Danke, ich versuche gerade noch die Totalzeit mit einzubauen.

Gruss
Ben


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Hans Haesler
  
Beiträge gesamt: 5826

14. Nov 2006, 19:39
Beitrag # 22 von 28
Beitrag ID: #421315
Bewertung:
(3231 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Ben,

okay! Aber das ist recht kompliziert ...

Dies hatte ich für eine weitere Version aufgespart.
Doch ich lasse dich gerne üben. ;-)

Gruss, Hans


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Anonym
Beiträge gesamt: 22827

14. Nov 2006, 19:42
Beitrag # 23 von 28
Beitrag ID: #421316
Bewertung:
(3231 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,
das lass mich mal üben, mal sehn ob ich schon was gelernt habe. ;-)

Gruss
Ben


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Anonym
Beiträge gesamt: 22827

15. Nov 2006, 18:56
Beitrag # 24 von 28
Beitrag ID: #421317
Bewertung:
(3231 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

ich habe es hinbekommen, aber leider funktioniert es nur zweimal, ich habe irgendwo noch einen Fehler.

Gruss
Ben

--
property ctr : 0
property logFolder : ""
global logPath

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

--


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Hans Haesler
  
Beiträge gesamt: 5826

15. Nov 2006, 23:10
Beitrag # 25 von 28
Beitrag ID: #421318
Bewertung:
(3231 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Ben,

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.
Code
 property ctr : 0 
property logFolder : ""
global logPath

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 = 6 then
    writeBegin1(logFile, curDate, docName)
  else if nPara = 8 then
    writeEnd(logFile, curString, curDate)
    set curString to readCur(logFile)
    writeTotal(logFile, curString)
    display dialog "Der Eintrag ist gemacht." buttons ¬
    "OK" default button 1 with icon 1 giving up after 1
  else if nPara > 8 then
    if ctr mod 2 is 1 then
    writeBegin2(logFile, curString, curDate, docName)
    else
    writeEnd(logFile, curString, curDate)
    set curString to readCur(logFile)
    writeTotal(logFile, curString)
    display dialog "Der Eintrag ist gemacht." buttons ¬
      "OK" default button 1 with icon 1 giving up after 1
    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, docName)
set aString to text 1 thru -17 of curString as string
set newString to aString & docName & return & "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 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 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

Das modifizierte Droplet stelle ich Dir gleich zu.

Gruss, Hans


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Anonym
Beiträge gesamt: 22827

16. Nov 2006, 16:17
Beitrag # 26 von 28
Beitrag ID: #421319
Bewertung:
(3231 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
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


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Hans Haesler
  
Beiträge gesamt: 5826

16. Nov 2006, 19:47
Beitrag # 27 von 28
Beitrag ID: #421320
Bewertung:
(3231 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Ben,

bitteschön!

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


als Antwort auf: [#421294]

Zeiterfassung für aktives Fenster oder eine geöffnete Datei

Anonym
Beiträge gesamt: 22827

17. Nov 2006, 06:35
Beitrag # 28 von 28
Beitrag ID: #421321
Bewertung:
(3231 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,
danke für das Kompliment, ich werde auf jeden Fall dran bleiben!

Gruss
Ben


als Antwort auf: [#421294]
X

Aktuell

Veranstaltungskalender

Hier können Sie Ihre Anlässe eintragen, welche einen Zusammenhang mit den Angeboten von HilfDirSelbst.ch wie z.B. Adobe InDesign, Photoshop, Illustrator, PDF, Pitstop, Affinity, Marketing, SEO, Büro- und Rechtsthemen etc. haben. Die Einträge werden moderiert freigeschaltet. Dies wird werktags üblicherweise innert 24 Stunden erfolgen.

pdf-icon Hier eine kleine Anleitung hinsichtlich Bedeutung der auszufüllenden Formularfelder.

Veranstaltungen
17.04.2024

Online
Mittwoch, 17. Apr. 2024, 10.00 - 10.30 Uhr

Webinar

Komplizierte, kleinteilige Aufträge; alles sehr speziell; seit Jahren bewährte Prozesse – da können wir nichts standardisieren und automatisieren! Das sagen viele Großformatdrucker – aber stimmt das wirklich, ist dem tatsächlich so? Günther Business Solutions und Impressed treten in einem Webinar den Gegenbeweis an. Experten beider Unternehmen zeigen, wie Großformatdrucker vom Einsatz zweier bewährter Lösungen profitieren können: • von advanter print+sign von Günther Business Solutions, dem ERP-System für den Großformatdruck, dass alle Phasen der Wertschöpfung im Large Format Printing abdeckt • von Impressed Workflow Server, der smarten PDF-Workflow-Lösung für Druckereien, die Datenmanagement, Preflight und Produktionssteuerung übernimmt Über die Kombination beider Lösungen können Großformatdrucker ihre Prozesse mit modernen Workflows Schritt für Schritt automatisieren – und so zügig deutliche Zeit- und Kosteneinsparungen realisieren. Das Webinar sollten Sie sich nicht entgehen lassen – damit Sie keine Effizienzpotenziale mehr liegen lassen. Melden Sie sich am besten gleich an, wir freuen uns auf Sie! PS: Melden Sie sich in jedem Fall an – sollten Sie zum Termin verhindert sein, erhalten Sie die Aufzeichnung.

kostenlos

Ja

Organisator: Impressed / Günther Business Solutions

https://www.impressed.de/schulung.php?c=sDetail&sid=326

Und es geht doch: Automatisierung im Großformatdruck!