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

Applescript unterbechen und per Tastendruck fortführen
Gehe zu Seite Zurück  1, 2, 3, 4  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Fischer-Bayern.de Foren-Übersicht -> AppleScript X
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ShooTerKo
•--->
•--->


Anmeldedatum: 21.03.2006
Beiträge: 221
Wohnort: Hamburg

BeitragVerfasst am: 20.07.2006 - 11:23    Titel: Antworten mit Zitat

Google ist unser Freund Very Happy Very Happy
Gesucht nach: applescript excel "startup dialog"

Habe ich folgenden Hinweis gefunden: http://lists.apple.com/archives/applescript-users/2004/May/msg00769.html

Dort heisst es unter anderem:
Zitat:
(I realize you can bypass the Project Gallery by setting Excel preferences
or by telling Excel to "launch" if it is not running.


tell application "Microsoft Excel"
   launch
   activate

...

Excel per launch starten verhindert den Dialog Cool Cool Cool

Nun denn, so sei es... Wo auch immer das dokumentiert sein soll Twisted Evil

Melde mich gleich wieder zum Zellen auslesen!

CU
ShooTerKo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
ShooTerKo
•--->
•--->


Anmeldedatum: 21.03.2006
Beiträge: 221
Wohnort: Hamburg

BeitragVerfasst am: 20.07.2006 - 11:53    Titel: Antworten mit Zitat

Schritt 4: Lesen der einzelnen Reihen in unserem Bereich schreiben der Werte in eine Liste

Vor dem tell application "Microsoft Excel" deklarieren wir erstmal zwei Listen: Eine Liste, in die wir die Strings hineinschreiben, die gesucht werden sollen und eine, in die wir die Strings hineinschreiben, durch die ersetzt werden soll, z.B. so:

set toSearchForList to {}
set toReplaceWithList to {}


Am Anfang sind diese Listen natürlich leer, innerhalb des Excel-Blocks werden die Listen mit Inhalten füllen Smile

Zurück in unseren tell used range-Block:
Hier stehen uns jetzt die benutzten Reihen (rows), Spalten (columns) und Zellen (cells) des Sheets zur Verfügung. Zählen wir doch mal, wie viele rows uns zur Verfügung stehen und lassen uns diese anzeigen, um sicherzustellen, dass wir noch auf dem richtigen Weg sind:
         set numberOfRows to (count rows)
         set numberOfColumns to (count columns)
         display dialog numberOfRows
         display dialog numberOfColumns


Das Ergebnis ist überwältigend Cool Erst eine 3, dann eine 2 Razz . Wir sind auf dem richtigen Weg!

Also: Folgende Aufgabe für dich:
Prüfe, ob mehr als eine Reihe vorhanden ist. Wenn ja, gehe in eine Schleife, in der du ab der zweiten Reihe die Reihen durchgehst, und schreibe den
(string value of cell 1)
jeder Reihe ans Ende der toSearchForList

und

(string value of cell 2)
jeder Reihe ans Ende der toReplaceWithList!

Idea Tipp: Um etwas ans Ende einer Liste zu setzen, ist die Syntax
Code:
set end of toSearchForList to irgendwas

die kürzeste und einfachste Exclamation

Ich beobachte den Thread wg. deiner Lösung oder Fragen

CU
ShooTerKo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
spirigwi
•----->
•----->


Anmeldedatum: 10.07.2003
Beiträge: 1529
Wohnort: Olten-CH

BeitragVerfasst am: 20.07.2006 - 14:21    Titel: Antworten mit Zitat

ShooTerKo hat Folgendes geschrieben:
gibt m.E. keinen Grund ein anderes Programm dazu zu bringen, mir eine Exceldatei zu öffnen, also erst ein tell "Finder" zum Öffnen und danach dann doch den tell "Excel" Handler zu schreiben.


Jetzt wisst ihr ja, warum ich mir diese Gepflogenheit für alle Programme angeeignet habe, insebesondere aber für Mikro-Schrott-Produkte, nämlich deswegen:

ShooTerKo hat Folgendes geschrieben:
I realize you can bypass the Project Gallery by....


dabei ist diese Lösung des Problems idiotensicher:
tell application "Finder" to open file PFAD?deineDatei?

Folgende higegen finde ich super, aber nicht ganz einfach herauszufinden und ist sie denn wirklich vielseitig erprobt :

ShooTerKo hat Folgendes geschrieben:
tell application "Microsoft Excel"
   
launch
   
activate


Excel per launch starten verhindert den Dialog

_________________
 Skript-Fan => ein � -Fan =>Scr¿¿-KongFuSius_Kurpfusius
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
ShooTerKo
•--->
•--->


Anmeldedatum: 21.03.2006
Beiträge: 221
Wohnort: Hamburg

BeitragVerfasst am: 20.07.2006 - 15:34    Titel: Antworten mit Zitat

Ja, stimmt schon, dass es in diesem Fall gut klappen kann.
Was aber, wenn ich z.B. ein Word-Dokument mit Word öffnen möchte, der Finder aber denkt, ach, die Apple Pages Demo ist mir lieber für den Dateityp.
Oder auch ein Beispiel: PDFs die bei Doppelklick in Vorschau statt Acrobat aufgehen.
Deine Lösung ist zwar auch gut, aber spätestens, wenn man das Script an jemand anders schickt, ist es m.E. besser, Applescript genau zu sagen, was es machen soll und welchem Programm.
Ich weiß auch, dass man dem Finder sagen kann, mit welchem Programm er eine bestimmte Datei öffnen soll, aber das ist doch irgendwie umständlich, wenn ich danach sowieso das Programm direkt weiterscripte.
Aber bei Applescript gibt es halt immer tausende Lösungen, da muss sich jeder seinen eigenen für sich selber verständlichsten Weg suchen. cool man

CU
ShooTerKo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
Imion
•-->
•-->


Anmeldedatum: 07.04.2005
Beiträge: 28

BeitragVerfasst am: 20.07.2006 - 15:41    Titel: Antworten mit Zitat

So, ich glaube ich habe es:


Code:
set toSearchForList to {}
set toReplaceWithList to {}
tell application "Microsoft Excel"
   launch
   activate
   open file "Harddisk:Users:Imion:Desktop:SearchReplace.xls"
   tell active sheet
      tell used range
         set numberOfRows to (count rows)
         set numberOfColumns to (count columns)
         if numberOfRows > 1 then
            try
               repeat with i from 2 to numberOfRows
                  set end of toSearchForList to string value of cell 1 of row i
                  set end of toReplaceWithList to string value of cell 2 of row i
               end repeat
            end try
         end if
      end tell
   end tell
end tell
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ShooTerKo
•--->
•--->


Anmeldedatum: 21.03.2006
Beiträge: 221
Wohnort: Hamburg

BeitragVerfasst am: 20.07.2006 - 17:19    Titel: Antworten mit Zitat

Very Happy Very Happy SUPER, läuft klasse! Applaus Applaus

Für uns doch unnötig ist folgende Zeile:
set numberOfColumns to (count columns)
Die war nur da, um den Zugriff auf die Excel-Elemente zu testen.

Auch würde ein
close active window
kurz vor dem letzten end tell super passen. Wozu sollte das Fenster noch aufbleiben? Die Daten haben wir ausgelesen, also weg damit!

Um zu testen, ob nach Verlassen des Excel-tell-Blocks noch die korrekten Werte in den Arrays stehen, kannst du (wenn du möchtest) hinter dem tell application "Microsoft Excel"-Block folgendes durchführen:

repeat with i from 1 to count toSearchForList
   activate
   display dialog "\"" & (item i of toSearchForList) & "\" soll durch \"" & (item i of toReplaceWithList) & "\" ersetzt werden!"
end repeat


Damit ist für heute das Excel-Kapitel abgeschlossen und morgen werden wir uns Quark 6.5 und dessen Dictionary ansehen.

Für heute erstmal: Cheers und ausspannen Musik hören

CU
ShooTerKo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
Imion
•-->
•-->


Anmeldedatum: 07.04.2005
Beiträge: 28

BeitragVerfasst am: 21.07.2006 - 07:51    Titel: Antworten mit Zitat

*freu* *verneig* Very Happy

Ich muss Dir aber auch ein Kompliment aussprechen,
Du machst das wirklich großartig.
Ich glaube ich habe noch nirgendwo ein Tutorial gelesen oder von jemandem etwas erklärt bekommen, das so fruchtet und verständlich ist.
Weiß gar nicht wie ich mich da bedanken soll.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
olley
•-->
•-->


Anmeldedatum: 27.03.2001
Beiträge: 62
Wohnort: iPhone: /dev/null/

BeitragVerfasst am: 21.07.2006 - 08:12    Titel: Antworten mit Zitat

Imion hat Folgendes geschrieben:

Weiß gar nicht wie ich mich da bedanken soll.


Schick ShooTerKo doch eine Flasche Wein oder einen Gutschein für den ITMS oder oder oder Very Happy
_________________
Olley
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
ShooTerKo
•--->
•--->


Anmeldedatum: 21.03.2006
Beiträge: 221
Wohnort: Hamburg

BeitragVerfasst am: 21.07.2006 - 08:56    Titel: Antworten mit Zitat

Embarassed
Ach, Blödsinn Cool Immer mach ich so etwas auch nicht. Momentan passt es nur ganz gut, hier in der Firma habe ich so Sachen (Prooferkalibrierung Twisted Evil ), wo ich zwischendurch einfach immer Wartezeiten habe und da ist das eine schöne Abwechslung.
Es macht mir ja auch Spaß Razz Razz

So, bis gleich dann!

CU
ShooTerKo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
ShooTerKo
•--->
•--->


Anmeldedatum: 21.03.2006
Beiträge: 221
Wohnort: Hamburg

BeitragVerfasst am: 21.07.2006 - 09:13    Titel: Antworten mit Zitat

Räumen wir erst mal etwas auf und bauen uns ein hübsches Script mit einem eigenen Handler:

on run
   -- die Variablen toSearchForList und toReplaceWithList werden durch die beiden Rückgabewerte des Handlers gefüllt
   set {toSearchForList, toReplaceWithList} to getSearchAndReplacePairsFromExcel("Harddisk:Users:Imion:Desktop:SearchReplace.xls")
   
   -- Nur zum Testen
   repeat with i from 1 to count toSearchForList
      activate
      display dialog "\"" & (item i of toSearchForList) & "\" soll durch \"" & (item i of toReplaceWithList) & "\" ersetzt werden!"
   end repeat
end run

on getSearchAndReplacePairsFromExcel(aFilePath)
   -- Bekommt einen Pfad zur Exceldatei übergeben
   -- liest die beiden ersten Zellen der Reihen 2 - Ende aus
   -- und gibt diese als Einzellisten zurück
   set searchFor to {}
   set replaceWith to {}
   tell application "Microsoft Excel"
      launch
      activate
      open file aFilePath
      tell active sheet
         tell used range
            set numberOfRows to (count rows)
            if numberOfRows > 1 then
               try
                  repeat with i from 2 to numberOfRows
                     set end of searchFor to string value of cell 1 of row i
                     set end of replaceWith to string value of cell 2 of row i
                  end repeat
               end try
            end if
         end tell
      end tell
      close active window
   end tell
   -- liefert zwei Listen zurück
   return {searchFor, replaceWith}
end getSearchAndReplacePairsFromExcel



Schaue es dir in Ruhe an, gehe es im Geiste durch und versuche, es zu verstehen Exclamation
Der on run-Handler ist die Funktion, die aufgerufen word, wenn ein Script gestartet wird. Hat man keinen (wie wir bisher) wird einfach das vorhandene Script ausgeführt.
Eigene Handler kann man benennen, wie man will, solange es keine eigenen Handler von Applescript gibt, die so heißen (z.B. on open etc)
Beachte auch die elegante Art und Weise, wie in Applescript mehrere Werte von einer Funktion zurückgegeben werden können und wie man diese empfängt.

Melde dich, wenn es weiter gehen kann!

CU
ShooTerKo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
ShooTerKo
•--->
•--->


Anmeldedatum: 21.03.2006
Beiträge: 221
Wohnort: Hamburg

BeitragVerfasst am: 21.07.2006 - 10:53    Titel: Antworten mit Zitat

Vorbereitung:
Ich werde im bald folgenden Script von einer Datei wie der folgenden ausgehen:
http://homepage.mac.com/shooterko/.Public/SearchReplace.xls.zip
Dort sind sowohl mehrere Rahmen, mehrere Schriften und Farebn etc. enthalten.

CU
ShooTerKo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
ShooTerKo
•--->
•--->


Anmeldedatum: 21.03.2006
Beiträge: 221
Wohnort: Hamburg

BeitragVerfasst am: 21.07.2006 - 10:55    Titel: Antworten mit Zitat

Embarassed Blödsinn Exclamation
Natürlich meine ich diese hier:
http://homepage.mac.com/shooterko/.Public/MyQuarkTestDoc.zip

CU
ShooTerKo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
ShooTerKo
•--->
•--->


Anmeldedatum: 21.03.2006
Beiträge: 221
Wohnort: Hamburg

BeitragVerfasst am: 21.07.2006 - 12:31    Titel: Antworten mit Zitat

Teil 1 des Quarkteils:

Ich stelle mir folgendes Grundgerüst eines Handlers vor:


on replaceTextInQuark(theQuarkDoc, qxpSearchList, qxpReplaceList)
   -- ersetzt in allen Textkästen die Elemente der qxpSearchList durch qxpReplaceList
   
   -- 1. Schritt: Quarkdokument theQuarkDoc öffnen
   
   -- 2. Schritt: Textkästen des Dokuments durchgehen
   
   -- 3. Schritt: Für jedes Element in qxpSearchList prüfen, ob es im Textkasten enthalten ist
   -- 3a: Wenn ja, ersetzen durch Element in qxpReplaceList
   
   -- 4. Schritt: Dokument sichern (Überlegung: Unter neuem Namen?)
   
   -- 5. Schritt: Dokument schließen
end replaceTextInQuark



Man könnte sich noch überlegen, was performanter wäre:

Äußere Schleife geht die Textkästen durch, für jeden Textkasten die Such- und Ersetzlisten durchgehen

oder

Äußere Schleife geht die Such- und Ersetzlisten durch, für jeden Suchbegriff werden alle Textkästen geprüft.

Hängt aber stark von der Art der Quarkdokumente sowie der Länge der Listen ab Confused , muss man dann sehen.

Melde mich wieder! Cool

CU
ShooTerKo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
ShooTerKo
•--->
•--->


Anmeldedatum: 21.03.2006
Beiträge: 221
Wohnort: Hamburg

BeitragVerfasst am: 21.07.2006 - 13:44    Titel: Antworten mit Zitat

Bevor wir beginnen können, müssen wir noch dafür sorgen, dass unser Handler noch aus dem run-Handler heraus aufgerufen wird. Er sieht jetzt folgendermaßen aus:

on run
   -- die Variablen toSearchForList und toReplaceWithList werden durch die beiden Rückgabewerte des Handlers gefüllt
   set {toSearchForList, toReplaceWithList} to getSearchAndReplacePairsFromExcel("Harddisk:Users:Imion:Desktop:SearchReplace.xls")
   
   replaceTextInQuark("Harddisk:Users:Imion:Desktop:MyQuarkTestDoc", toSearchForList, toReplaceWithList)
   
end run




Schritt 1: Öffnen des Dokuments in Quark

Schauen wir uns hierfür ins Quark-Dictionary:
Zitat:
open v : Open the specified object(s)
open reference : list of objects to open
[use doc prefs yes/no/ask] : use document or application preferences
[remap fonts no/ask] : remap document fonts which don't exist in the current system
[do auto picture import yes/no/ask] : whether or not to re-import any missing pictures
[reflow boolean] : "with reflow" will update the flow version of the document


Wow! Das sind doch eine Menge mehr Möglichkeiten als bei Excel Shocked
Was sollen diese Möglichkeiten?
- use doc prefs : Jeder, der Quark kennt, kennt den Dialog bei Öffnen eines Dokuments, ob die Quarkeinstellungen oder die Dokumenteinstellungen verwendet werden sollen. Natürlich wollen wir die Dokumenteinstellungen verwenden, es soll so bleiben wie es ist!
- remap fonts : Er soll gar nichts mit fehlenden Schriften anfangen, alles so lassen, wie es ist, bitte!
- do auto picture import : Nein, auch das nicht. Wir werden das Dokument jetzt nicht ausdrucken oder eine PS erstellen oä.
- reflow : Was auch immer das heisst: Nein, nichts ändern, bitte!

Unser replaceTextInQuark-Handler wird also mit diesen Zeilen beginnen:

on replaceTextInQuark(theQuarkDoc, qxpSearchList, qxpReplaceList)
   -- ersetzt in allen Textkästen die Elemente der qxpSearchList durch qxpReplaceList
   
   tell application "QuarkXPress Passport"
      -- 1. Schritt: Quarkdokument theQuarkDoc öffnen
      open file theQuarkDoc use doc prefs yes remap fonts no do auto picture import no reflow false


Exclamation Achtung! Der Compiler verändert bestimmte Dinge automatisch, wie z.B. manche Boolean-Parameter! So wird aus einem getippten "reflow false" nach prüfen des Codes ein "without reflow" Exclamation

on replaceTextInQuark(theQuarkDoc, qxpSearchList, qxpReplaceList)
   -- ersetzt in allen Textkästen die Elemente der qxpSearchList durch qxpReplaceList
   
   tell application "QuarkXPress Passport"
      -- 1. Schritt: Quarkdokument theQuarkDoc öffnen
      open file theQuarkDoc use doc prefs yes remap fonts no do auto picture import no without reflow


Ausprobieren und vielleicht mit den einzelnen Möglichkeiten (yes, ask, no) spielen.

Melde mich später wieder!

CU
ShooTerKo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
ShooTerKo
•--->
•--->


Anmeldedatum: 21.03.2006
Beiträge: 221
Wohnort: Hamburg

BeitragVerfasst am: 21.07.2006 - 16:19    Titel: Antworten mit Zitat

Die nächsten Schritte:

Ich habe etwas herumexperimentiert eins auf die Fresse eins auf die Fresse . War gar nicht so einfach Shocked . Man kann z.B. innerhalb eines Dokuments die Wörter zählen lassen, aber nicht direkt auf sie zugreifen etc. SO einige Fallstricke haben da noch gelauert Shocked . Folgende Strategie klappt bei mir:

1. Dokument öffnen
2. tell document 1
3. stories zählen
4. in einer Schleife die stories durchgehen, Inhalt der story in ein Variable schreiben
5. in einer inneren Schleife qxpSearchList durchgehen
6. wenn die jetzige storie das jetzige item der qxpSearchList enthält, den Inhalt tauschen (wie das mit reinem Applescript geht, zeige ich gleich)
7. nach Abschluss der inneren Schleife den Inhalt der jetzigen story neu setzen
8. nach Durchlaufen aller stories Dokument schließen (sage ich gleich auch etwas zu)

zu Punkt 6:
Ein kleiner Applescript-Trick
------------------------------------------------
-- Teile in einem String mit reinem Applescript tauschen:
------------------------------------------------
                  
-- searchItem als Texttrenner bestimmen
set AppleScript's text item delimiters to searchItem
                  
-- durch searchItem getrennte Einzelteile holen
set allStoryItems to text items of thisStoryContent
                  
-- replaceItem zum Texttrenner machen
set AppleScript's text item delimiters to replaceItem
                  
-- eine Liste as unicode text ausgeben verwendet als "Bindemittel" den Textrenner!
set thisStoryContent to allStoryItems as Unicode text
                  
-- Den Textrenner zurücksetzen
set AppleScript's text item delimiters to ""
------------------------------------------------


Erklärung:
Man nehme einen String wie z.B. "abc123ghi". Setzt man nun die AppleScript's text item delimiters auf z.B. "123", so erhält man mit Aufruf von
Code:
set textItems to text items of "abc123ghi"
folgende Liste zurück
Code:
{"abc,"ghi"}
, also die Einzelteile ohne den Texttrenner Idea .
Setze ich jetzt den
AppleScript's text item delimiters to "def"
und rufe folgendes auf
Code:
set newString to {"abc,"ghi"} as unicode text
(oder "as string" oder "as text", glaube ich) so erhalte ich "abcdefghi" als Ergebnis, habe also praktisch "123" durch "def" ersetzt. Danach sollte man die AppleScript's text item delimiters wieder auf den Standardwert ("") setzen.


zu Punkt 8:
Das Quarkdictionary sagt uns folgendes zum close-Handler:
Zitat:
close v : Close an object
close reference : the object to close
[saving yes/no/ask] : specifies whether changes should be saved before closing
[saving in alias] : the file in which to save the object
Man hat also jetzt die Wahl: Schließen und speichern, schließen und nicht speichern oder soll der User gefragt werden. Auch kann man sich entscheiden, dass das Dokument beim Schließen gleichneu gespeichert werden soll, quasi als Kopie. Die letzte Möglichkeit finde ich super!
Also noch im tell document 1-Block:
close saving in (theQuarkDoc & "_korr")

So Laughing Viel Spaß beim Basteln Laughing

Falls du nicht mehr weiter weisst (und wirklich erst mal selbst probieren!) findest du hier die fertige Lösung: http://homepage.mac.com/shooterko/.Public/Excelscript.zip

Wenn noch Fragen sind: Einfach fragen, ich schaue weiter in diesen Thread Cool

Am Montag können wir uns noch genauer andere Dinge anschauen, die irgendwie noch fehlen:
- Den User fragen, welche Dokumente verwendet werden sollen
- Fehler (Dokument existiert nicht oä.) abfangen
- ... was dir noch einfällt

CU und schonmal ein schönes Wochenende!

ShooTerKo
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden AIM-Name
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
Gehe zu Seite Zurück  1, 2, 3, 4  Weiter
Seite 2 von 4

 
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