You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:00:46