we have been using this hack for a while for situations similar to your demo.
but the way we trigger the rule is much simpler and easier to set up than what you have shown.
the table has a hidden button column called ‘WhenChanged’ and that button will be pressed when ANY item on the row is changed!
the table also has a date-time column called ‘Changed’ but it does NOT have a formula (instead it is set to Now() at the end of the ‘WhenChanged’ action.
the ‘WhenChanged’ button has a Disable If clause as follows
Modified(thisRow)-thisRow.Changed<=Seconds(2)
this means that the button is only enabled when the user changes any item on the row, making the Modified() function return a recent timestamp (ie: greater than the old saved timestamp). the 2 seconds lee-way is needed due to a delay of zero to two seconds in the Modified() function.
like you, we use a checkbox (called Active) that is set ON to run the automations, and can be set OFF if you need to stop the loop. this is an important fail-safe in case you have errors in your actions!
we have two global buttons to run the loop called ‘Start’ and ‘Repeat’.
the ‘Repeat’ button is disabled when Active is OFF - and that stops the loop (important).
the action for the ‘Start’ button is
RunActions(MyTable.WhenChanged, Repeat)
you can add further tables to the list if needed, before the ‘Repeat’.
and the action for ‘Repeat’ is
RunActions( _Delay(Start, 0 ))
remember, the ‘Repeat’ button is disabled if the Active checkbox is false!
the RunActions() are needed - i think they prevent the browser crashes that you experienced
and, as you discovered, the _Delay() is needed to allow the coda user interface to run at the same time as the loop - otherwise the UX freezes up.
finally, the ‘WhenChanged’ button action looks like this…
thisRow.ModifyRows(
thisRow.someColum,someComputedValue,
<any other changes to the row>
thisRow.Changed, Now()
)
that last part is important. the last thing the action does is set the ‘Changed’ timestamp to Now() to record when the row was last changed by the action.
of course, you can add other actions inside the ‘WhenChanged’ button to modify other tables or control-values etc.
so basically, instead of having to shadow several columns to detect changes, we ‘shadow’ the Modified() time-stamp to detect when any column has changed.
we have not experienced any browser locking or crashes.
i hope i have explained it clearly. if not, let me know and i will rustle-up a sample doc
respect
max