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?
źródło
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źć.first item of tabSet whose name is "…"
działa idealnie dla mnie. Czy na pewno masz kartę z nazwą Bez tytułu?