如何用Python调用Google Forms API更新表单答案与响应验证
Google表单简答题:更新正确答案与响应验证指南
问题背景
我有一个包含两道简答题的Google表单,已启用响应验证。想知道如何用Python更新表单的正确答案,以及是否能更新响应验证规则。另外,我尝试将其中一道题设为无响应验证,用service.forms().get对比两道题后没发现差异,不清楚该修改哪些内容?
当前使用的代码:
from __future__ import print_function from apiclient import discovery from httplib2 import Http from oauth2client import client, file, tools from googleapiclient.discovery import build SCOPES = "https://www.googleapis.com/auth/forms.body" DISCOVERY_DOC = "https://forms.googleapis.com/$discovery/rest?version=v1" store = file.Storage('token.json') creds = None if not creds or creds.invalid: flow = client.flow_from_clientsecrets('client_secrets.json', SCOPES) creds = tools.run_flow(flow, store) service = discovery.build('forms', 'v1', http=creds.authorize( Http()), discoveryServiceUrl=DISCOVERY_DOC, static_discovery=False) form_id = '1q4pJMDtiLxQ2cjmLXxowqJ5Vy6REe9PpLAPfI68bUUo' form = service.forms().get(formId=form_id).execute()
另外,我是否仍需要用以下方法进行更新?
req = { "requests": [ { "updateItem": { "item": { "itemId": topItem[1], "videoItem": { "video": { "youtubeUri": after, } }, }, "location": {"index": topItem[0]}, "updateMask": "videoItem.video.youtubeUri", } } ] } service.forms().batchUpdate(formId=formId, body=req).execute()
解答
1. 核心结论
可以通过Google Forms API的batchUpdate方法,同时更新简答题的正确答案和响应验证规则。你之前的代码是针对视频题的更新逻辑,不适用于简答题,需要调整字段结构。
2. 为何get方法看不到验证差异
响应验证的配置存在于item.questionItem.question.validation字段,正确答案则在item.questionItem.question.grading下。无响应验证的题目不会有validation字段,有验证的题目会包含textValidation等子结构。你需要检查这两个字段的内容,才能看到差异。
3. 正确的更新代码示例
更新正确答案
form_id = '你的表单ID' target_item_id = '要更新的简答题itemId' update_answer_req = { "requests": [ { "updateItem": { "item": { "itemId": target_item_id, "questionItem": { "question": { "grading": { "pointValue": 1, # 可自定义分值 "correctAnswers": { "answers": [ {"value": "这里填正确答案"} ] } } } } }, "updateMask": "questionItem.question.grading" } } ] } service.forms().batchUpdate(formId=form_id, body=update_answer_req).execute()
更新响应验证(示例:必填+文本长度限制)
update_validation_req = { "requests": [ { "updateItem": { "item": { "itemId": target_item_id, "questionItem": { "question": { "validation": { "required": True, "textValidation": { "type": "LENGTH", "minValue": "3", "maxValue": "50" } } } } }, "updateMask": "questionItem.question.validation" } } ] } service.forms().batchUpdate(formId=form_id, body=update_validation_req).execute()
同时更新答案与验证
将两个请求合并到同一个requests数组,一次提交即可:
combined_req = { "requests": [ # 更新正确答案的请求体 { "updateItem": { "item": { "itemId": target_item_id, "questionItem": { "question": { "grading": { "pointValue": 1, "correctAnswers": { "answers": [{"value": "正确答案"}] } } } } }, "updateMask": "questionItem.question.grading" } }, # 更新响应验证的请求体 { "updateItem": { "item": { "itemId": target_item_id, "questionItem": { "question": { "validation": { "required": True, "textValidation": {"type": "LENGTH", "minValue": "3"} } } } }, "updateMask": "questionItem.question.validation" } } ] } service.forms().batchUpdate(formId=form_id, body=combined_req).execute()
4. 关于你提供的更新方法
你之前的代码是针对视频类型题目(videoItem)的更新逻辑,和简答题的questionItem结构完全不同,所以不能直接复用。需要替换为上述针对简答题的字段结构,并调整updateMask到正确的字段路径。
内容的提问来源于stack exchange,提问作者LUN
相关产品推荐
相关产品推荐

