Mam trochę AppleScript, który frustruje mnie. Muszę uzyskać listę wszystkich kart Safari, a następnie je odfiltrować. Spodziewałem się, że będzie to bardzo proste. To nie jest.
tell application "Safari"
set tabSet to {}
repeat with w in (get every window)
repeat with t in (get every tab of w)
set the end of tabSet to t
end repeat
end repeat
--set tabSet to every tab of every window -- a one-liner here would be convenient
set firstTab to first item of tabSet -- works, see edit
set targetTab to first item of tabSet whose name is "Untitled" -- this fails
end tell
Po pierwsze, every tab of every window
zwraca zagnieżdżoną listę list kart (pogrupowanych według okien) zamiast zwykłej listy. Właśnie skończyłem z powtórzeniami. (Jezeli tam jest sposobem na uczynienie tego jednym linerem, byłoby miło). Jak na razie, całkiem nieźle.
Wynik, z którego czerpałem first item of tabSet
wyrzucał mnie, ponieważ wyglądało na to, że zwraca formę całej listy:
item 1 of {tab 1 of window id 15557 of application "Safari", tab 2 of window id 15557 of application "Safari", tab 3 of window id 15557 of application "Safari", tab 4 of...
Rzeczywisty problem występuje na linii filtrów, gdzie próbuję uzyskać first item of tabSet whose name is "Untitled"
. (Zastąp oczywiście prawidłową nazwą). Wtedy pojawia się ten błąd:
error "Safari got an error: Can’t get tab 1 of window id 15561 whose name = \"Untitled\". Invalid index." number -1719
EDYCJA 2:
Dodałem następujący blok:
repeat with t in tabSet
set n to (get name of t)
try
set targetTab to (first item in tabSet whose name is n)
set targetWindow to (first window whose tabs contains targetTab)
log (get id of targetWindow) & (get name of t)
on error
log "ERROR: " & n
end try
end repeat
To ujawniło, że po raz kolejny problem nie był taki, jak się wydawało, ale był w rzeczywistości czymś zupełnie innym:
Tylko karty w pierwszym oknie można filtrować. Wydaje się, że oświadczenie first item of tabSet whose name is "Untitled"
kończy się niepowodzeniem, jeśli karta „Bez tytułu” znajduje się w dowolnym innym oknie niż okno znajdujące się na pierwszym planie.
Jakieś pomysły?
whose...
oświadczenie po prostu nie działa. Zmodyfikowałem to pytanie, aby to odzwierciedlić. Z jakiegoś powodu,first item of tabSet whose name is "Untitled"
daje błąd. Kopię trochę więcej, aby zobaczyć, co jeszcze mogę znaleźć.