OK, I took a run at this and ran into a roadblock...
As I noted in my earlier post, I was thinking to have a background script actively check which slide was currently visible.
I created an Intro slide with all the category and question values, along with 36 slides for the individual questions.
It's easy enough to setup each question value to jump to a corresponding question slide (Format -> Add Link -> Slide -> Slide #n), and I set each of the question slides to jump back to the master (Format -> Add Link -> Slide -> First Slide). This works fine for the basic flow.
I then wrote an AppleScript that starts the presentation and periodically polls to see which slide is currently showing. At the beginning this would be 'Slide 1', and as you click on any question button, Keynote would switch to the corresponding question slide. The script could detect this change and know that we had to change the initial slide to hide the button corresponding to this question. There's some shenanigans involved in tracking this, but it's a solvable problem.
What's not solvable, though, is that Keynote actively prohibits changing slide elements while the presentation is running. Upon changing to a question slide, I try:
set opacity of shape (current_slide_number) of slide 1 to 0
which should have the effect of hiding the button that linked to this slide. However, Keynote complains:
> You can’t execute the command “set” on a locked iWork document.
Which I'm interpreting as Keynote having locked the slides because a presentation is in flight.
Indeed, I can kind of get around this by editing the script:
stop
set opacity of shape (current_slide_number) of slide 1 to 0
start
which briefly stops the presentation long enough to change the opacity of the relevant button, then start-up again, but this has the annoying (unacceptable? unavoidable?) screen flash as the presentation stops and starts.
I'll keep poking at this, but here's the framework of what I started with as a baseline:
local current_slide_number, previous_slide_number
-- This quick and dirty script assumes the first slide in a presentation
-- has a number of buttons that correspond to slides in the presentation.
--
-- Clicking a button on the first slide jumps to the relevant slide
-- based on matching numbers (e.g. shape 3 will link to slide 3, etc.)
-- and the script hides that button so that it's not available again when
-- the presentation comes back to the intro screen.
-- Note: uses standard Keynote linking to navigate between slides.
tell application "Keynote"
tell document 1
set previous_slide_number to 1
start
delay 1
repeat
set current_slide_number to slide number of (get current slide)
if current_slide_number is not previous_slide_number then
-- we changed slide
if current_slide_number > 1 then
-- we just changed to a question slide, not back to the first
-- Dirty hack to unlock the slide elements
stop
-- this assumes the buttons map to the slides in a n->n order
-- i.e. button 2 links to slide 2, button 3 -> slide 3, etc.
set opacity of shape (current_slide_number) of slide 1 to 0
-- and resume the presenation
start
end if
set previous_slide_number to current_slide_number
end if
-- wait a bit before checking again
delay 2
end repeat
end tell
end tell
There might be some way to refine it further via transitions to mask the stop/start, but I'd really like to find a way to edit the first slide while the presentation is running.