Markierte URL per Short-Cut auslesen und in Excel-Tabelle abspeichern

M

McSwitch

Mitglied
Thread Starter
Dabei seit
17.05.2005
Beiträge
22
Reaktionspunkte
0
Hallo,

ich will eine (für meine Applescript-Kenntnisse) recht komplizierte Anwendung schreiben und erhoffe mir hier ein paar Tips zur Vorgehensweise zu bekommen.
Ich will in Safari eine URL markieren und den angezeigten URL-Namen, als auch die eigentliche Adresse dahinter in einer Excel-Tabelle abspeichern.

Ich hab' mir jetzt eine Javascript-Funktion gebaut, die diese beiden Werte in zwei Variablen abspeichert. Nun wäre der nächste Schritt dieses Javascript in mein Applescript einzubinden, aber da ich vorher noch nie mit Applescript gearbeitet habe weiß ich nicht wie man da vorgeht. Kann ich das Javascript.js aus meinem Applescript heraus aufrufen und die darin ausgelesen Werte an Applescript übergeben, so dass dieses es wieder an Excel weiterreichen kann?

Würde mich sehr freuen, wenn mir jemand weiterhelfen könnte und schon mal vielen Dank.
McSwitch
 
Ciao McSwitch,
Apple hat für die AppleScript-Steuerung von Safari interessanterweise JavaScript gewählt, d. h. Du kannst fast alles was mit Webinhalten in Safari zu tun hat direkt mit JavaScript ansprechen.
Die Syntax ist:
Code:
tell application "Safari"
do JavaScript [nameJS] in front document -- oder in document 1
end tell
z.B.:
PHP:
set meinJavaScript to "alert(\"Hello World!\")"
tell application "Safari"
	do JavaScript meinJavaScript in front document
end tell
Wenn das AppleScript das Ergenis eines JavaScripts auslesen soll, ist die Syntax:
Code:
set ASVariable to (do JavaScript [nameJS] in front document)

Good scripting
Farid
 
So ganz krieg ichs nicht hin.
Also ich hab hier folgendes Javascript:

Code:
function selectFunction() {

var select = window.getSelection();
var url;

for (var i = 0; i < document.links.length; ++i){
  	if (document.links[i].text == select) 
		url = document.links[i];
	}
}

Kann ich das JSFile aus dem Applescript aufrufen, oder muss ich den kompletten Code einbinden? Das Aufrufen, so wie das verstanden hab' mit [JS-Filename] hat nämlich nicht funktioniert. Und wie kann ich die beiden Variablen aus dem JS-Script ansprechen da mein Skript ja zwei unterschiedliche Werte liefert?

Sorry für solche Newbie-Fragen. Aber mit dem Skripten hab ich n bisschen Anlaufschwierigkeiten.
 
Sorry, ich habe mich nicht eindeutig ausgedrückt: Du kannst mit "do JavaScript" alle gültigen JavaScript-Befehle direkt in Safari ausführen. Meines Wissens kannst Du aber nicht einen externen JavaScript-File javascript.js ausführen, das bedeutet, Du mußt die JS-Terminologie in gültige AppleScript-Syntax übersetzen.
Wenn ich Deine Fragestellung richtig verstanden habe, sollte dieses AS funktionieren:
PHP:
tell application "Safari"
	-- selektierten Text einlesen
	set sel to (do JavaScript "window.getSelection() + ' ' " in document 1)
	
	-- Anzahl Links
	set n to (do JavaScript "document.links.length" in document 1) as integer
	
	-- selektierteLinks ausfiltern (Record-List enthält alle Linktexte und die dazugehörenden URLs)
	set selektierteLinks to {}
	repeat with i from 0 to n - 1 -- JavaScript-Arrays starten mit "0"
		set getLinksHref to ("document.links[" & i & "].href") as string
		set getLinksText to ("document.links[" & i & "].text") as string
		set einLinkHref to (do JavaScript getLinksHref in document 1)
		set einLinkText to (do JavaScript getLinksText in document 1)
		if einLinkText is in sel then
			set end of selektierteLinks to {LinkText:einLinkText, LinkURL:einLinkHref}
		end if
	end repeat
end tell

-- Zum guten Schluß, Export in Excel:
tell application "Microsoft Excel"
	make new document
	repeat with i from 1 to (count of selektierteLinks)
		set formula of cell 1 of row i of sheet 1 of document 1 to (LinkText of item i of selektierteLinks)
		set formula of cell 2 of row i of sheet 1 of document 1 to (LinkURL of item i of selektierteLinks)
	end repeat
end tell

Good scripting
Farid
 
Hallo,
wow. Vielen Dank! Es funktioniert zwar noch nicht ganz so wie ich es benötige, aber das bringt mich meinem Ziel schon mal ein gutes Stück näher! :) Find ich echt super, dass du so hilfsbereit bist. Hab' auch in deinen anderen Beiträgen gelesen, und scheinst ja hier immer gerne Tips und Rat zu geben!
Allerdings funktioniert der Code nicht ganz so wie er sollte (glaub ich).

Ich hab' noch ein paar Verständnis-Fragen zur Applescript- Syntax und dem Code an sich, die ich hier der Reihe nach einfach mal aufliste:

Zunächst mal:

a)


Code:
set sel to (do JavaScript "window.getSelection() + ' ' " in document 1)

Ich hatte bei meinen Tests das Problem, dass der Variablen kein Wert übergeben wurde. Mit dem Hinzufügen von "+ ' ' " im JS-Code scheint dieses Problem nun gelöst zu sein. Kannst du kurz erklären, warum das so ist? Würd mich einfach interessieren.


b)

mit dem Anfügen von

Code:
as datentyp

ist in Applescript also das Casten auf bestimmte Datentypen möglich?


c)

Zum "Bug": in der ersten Schleife findet ja in der if-Abfrage die Überprüfung statt, ob Der LinkText dem Selektierten Text entspricht. Wenn true, fügt "set end of" ein Key-Value-Paar mit dem Text und eines mit der URL in die Liste ein.
Allerdings werden in die Excel-Tabelle alle Links eingetragen. Ich verstehe nur nicht ganz, wo der Fehler liegt. Hab' mir versucht mit dem "display dialog" ein kleines Trace zu schreiben, aber da kommen wir dann schon zum nächsten Fragezeichen: :)

wenn ich in der IF-Abfrage mittels display dialog

Code:
if einLinkText is in sel then
	display dialog einLinkText
	set end of selektierteLinks to {LinkText:einLinkText, LinkURL:einLinkHref}
			end if


den Inhalt von einLinkText anzeigen lassen möchte, ist die Dialog-Box leer. Eigentlich müsste da ja dann der Inhalt von sel drin stehen. Wenn ich

display dialog sel

ins Script schreibe wird dieser dann auch ausgegeben. Woran liegt das?
(Das hat jetzt zwar nichts direkt damit zu tun, warum in die selektierteLinks-Liste alle URLs eingetragen werden, ich würde es nur einfach gern verstehen, interessehalber.


Mhh, hätte nicht gedacht das dass so knifflig wird.

Ich beschreibe auch am besten mal genau, was die Anwendung später leisten soll (im Eingangspost war das nicht bis ins Detail erklärt):

Ich habe in Safari eine ganze Reihe von Tabs geöffnet. In jedem Tab muss ich einen speziellen Link von Hand selektieren, dieser soll in ein bereits bestehendes Excel-Dokument eingetragen werden. Wie beschrieben, eine Spalte URL-Name, die nächste enhält den dazugehörigen Link. Danach soll sich der Tab schließen so dass direkt der nächste in den Vordergrund tritt und ich den nächsten Link auswählen kann und dieser dann in die nächste Zeile der Excel-Tabelle eingefügt wird.
Das Ganze würde ich gerne mit einem Short-Cut realisieren.


Viele Grüße
McSwitch
 
a)
Code:
set sel to (do JavaScript "window.getSelection() + ' ' " in document 1)
Ich hatte bei meinen Tests das Problem, dass der Variablen kein Wert übergeben wurde. Mit dem Hinzufügen von "+ ' ' " im JS-Code scheint dieses Problem nun gelöst zu sein. Kannst du kurz erklären, warum das so ist? Würd mich einfach interessieren.
Weiß ich selbst nicht :D Hab' ich mir irgendwann mal mal ergooglet weil ich ein ähnliches Problem hatte. Durch ergänzen von "+ ' '" wird JavaScript anscheinend gezwungen, einen String zu kreieren.

b) mit dem Anfügen von
Code:
as datentyp
ist in Applescript also das Casten auf bestimmte Datentypen möglich?
Genau.

c) Zum "Bug": in der ersten Schleife findet ja in der if-Abfrage die Überprüfung statt, ob Der LinkText dem Selektierten Text entspricht.
Genauer: ob der LinkText im selektierten Text enthalten ist.

Allerdings werden in die Excel-Tabelle alle Links eingetragen. Ich verstehe nur nicht ganz, wo der Fehler liegt. Hab' mir versucht mit dem "display dialog" ein kleines Trace zu schreiben, aber da kommen wir dann schon zum nächsten Fragezeichen: :)
<schnipp>
Hab das Script noch mal gecheckt: anscheinend hatte ich heute morgen beim Testen Glück mit den Seiten, auf denen ich es ausprobiert habe.
Ich glaube das Problem sind Links die effektiv keinen Text haben, z.B. verlinkte Images und Icons, die in der ersten Version miterfaßt worden sind.
Mit dieser Korrektur sollte es funktionieren:
PHP:
if einLinkText is not "" and einLinkText is in sel then
			set end of selektierteLinks to {LinkText:einLinkText, LinkURL:einLinkHref}
		end if

Ciao
Farid
 
Zurück
Oben Unten