Thanks for this solution, @jcarlson! I was able to work with @PrachiPatel to write a script using the template you provided.
Instead of setting up a recurring task, I stored it as a Google Cloud Function and then added the URL of the function as a webhook that runs when the survey is submitted. There's a blog post that explains doing this here: Calling Python scripts with Survey123, Integromat,... - Esri Community.
I used this code to get the object id of the submitted survey.
def update_table(request):
request_json = request.get_json(silent=True)
object_id = request_json['feature']['result']['objectId']
Then, instead of truncating and recreating the entire chart_table, I filtered the survey_layer by the object id, did my reshaping on just the submitted row, and added the reshaped rows to the chart_table.
survey_data = survey_layer.query(where='objectid = ' + str(object_id), as_df=True)
# In this section (omitted) the submitted row gets pivoted to 12 rows (one per month)
chart_table.edit_features(adds=pivoted_data.spatial.to_featureset())