You could maintain a last_updated value. Have a method poll every k seconds to check if the table has been updated.
Ex:
k <- 5
last_updated <- reactiveVal(as.Date("1970-01-01"))
observe({
last_sheet_updated <- ... # look up google sheet last updated time
if ( isolate(last_updated()) - last_sheet_updated < 0) {
# set the last updated time
isolate(last_updated(last_sheet_updated))
# update the browser
update_user_table_method() # must be created
}
# Test again in k seconds
invalidateLater(k * 1000)
})