Programatically modify tag visibility, order

Here's a partial solution that might serve until I can see something more effective. Instead of trying to track down the correct place to modify the Finder settings under the hood — which is surprisingly difficult — this GUI-scripts the Finder to turn on only those tags you want to use at a given moment. The script presents you with a token field, where you enter the names of the tags you want activated (commas and returns are the separation characters), then it opens the Finder preferences window, loops through all the items in the table view, and clicks them on or off as needed so you'll only see the ones you want. It's slow and occasionally throws an error (typical of GUI scripting) but it gets the job done.


  • Script updated 11/29/20 with trap some GUI synchronization issues..

global click_error_depth, seek_error_depth

set {click_error_depth, seek_error_depth} to {0, 0}

set tag_string to text returned of (display dialog "Enter a list of tags" default answer "")
set tid to my text item delimiters
set my text item delimiters to {",  ", ", ", ","}
set tag_list to text items of tag_string
set my text item delimiters to tid

tell application "Finder"
    open window of Finder preferences
    tell Finder preferences
        tell its window
            set (current panel) to Label Preferences panel
        end tell
    end tell
end tell
tell application "System Events"
    tell process "Finder"
        tell window "Finder Preferences"
            tell first scroll area's first table
                with timeout of 3600 seconds
                    set curretly_tagged to first checkbox of first UI element of (every row whose first UI element's first checkbox's value is 1)
                end timeout
                repeat with this_checkbox in curretly_tagged
                    my clickErrorTrap(this_checkbox)
                end repeat
                repeat with a_tag in tag_list
                    set target_checkbox to my seekErrorTrap(a_tag)
                    if class of target_checkbox is checkbox then
                        my clickErrorTrap(target_checkbox)
                    end if
                end repeat
            end tell
        end tell
    end tell
end tell
tell application "Finder"
    tell Finder preferences
        tell its window
            close
        end tell
    end tell
end tell

on clickErrorTrap(a_checkbox)
    try
        tell application "System Events"
            tell a_checkbox
                click
            end tell
        end tell
        return true
    on error
        if click_error_depth < 10 then
            set click_error_depth to click_error_depth + 1
            delay 0.1
            set flag to clickErrorTrap(a_checkbox)
        else
            return false
        end if
        set click_error_depth to click_error_depth - 1
        return flag
    end try
end clickErrorTrap

on seekErrorTrap(a_tag)
    try
        tell application "System Events"
            tell process "Finder"
                tell window "Finder Preferences"
                    tell first scroll area's first table
                        set target_checkbox to first checkbox of first UI element of (first row whose first UI element's name is a_tag)
                        return target_checkbox
                    end tell
                end tell
            end tell
        end tell
    on error
        if seek_error_depth < 5 then
            set seek_error_depth to seek_error_depth + 1
            delay 0.1
            set target_checkbox to seekErrorTrap(a_tag)
            set seek_error_depth to seek_error_depth - 1
            return target_checkbox
        else
            return false
        end if
    end try
end seekErrorTrap