Make sure that you name the field. (It looks like you have.)
Tell it to render as a number.
Tell it to render numbers as progress.
Set the range.
For the range, I thought it would auto-scale based on the maximum value. I think this might only be for datasets and the sample table component data in this case is JSON. In your case it doesn't matter as long as you don't expect to display over 100%.
Why not make the LineID a parameter for the view, and then use that in your indirect bindings. Then instead of copy/paste the binding 29 times, just use the same view and send the appropriate parameter value?
Perhaps, I don't understand what you mean when you say Dataset. When I say dataset, I mean an object containing potentially multiple rows of data, which is often bound to a tables data property. Is that what you mean?
I can, but it will not be until later, unfortunately. If no one else has offered help by then, I will see what I can throw together.
I was actually about to look up which one was more performant, I know they're technically both terrible for performance if overused but I never remember which is less bad.
EDIT: Yeah, found the thread. Something about transforms adds a really nasty bottleneck to execution. Nothing that matters if your script only executes once every second, but adds up if you have multiple.
As a bonus, with runScript() you'd be able to set up a polling rate naturally, whereas with the script transform, you'd have to call now() in the base expression since otherwise it will never refresh.