通过Google Forms API创建的表单无法查看及获取回复求助
问题解决:Google Forms API创建的表单不可见及回复获取问题
问题1:表单在个人谷歌账号/云端硬盘中不可见
原因
通过服务账号调用Forms API创建的表单,默认归属该服务账号的独立云端硬盘,而非你的个人谷歌账号。服务账号是独立的身份实体,与个人账号的资源完全隔离,因此你无法在个人账号的表单页面或云端硬盘中找到它。
解决方法
将表单共享至个人账号
调用Forms API的batchUpdate方法,添加个人账号邮箱为表单的查看/编辑者:batch_update_body = { "requests": [ { "addEditor": { "emailAddress": "你的个人邮箱@example.com" } } ] } form_service.forms().batchUpdate(formId=FORM_ID, body=batch_update_body).execute()执行后,你可在个人账号的「与我共享」文件夹中找到该表单。
创建时指定个人云端硬盘的父文件夹
先在个人云端硬盘创建一个文件夹,将该文件夹共享给服务账号(服务账号邮箱可在credentials.json的client_email字段中找到)并赋予「编辑」权限。创建表单时指定该文件夹ID:create_form_body = { "info": { "title": "你的表单标题" }, "parentFolderId": "个人云端硬盘文件夹ID" } form = form_service.forms().create(body=create_form_body).execute()
问题2:获取表单回复及关联Google表格
步骤1:关联表单到Google表格
有两种关联方式可选:
手动关联(快速测试用)
通过responderUri打开表单,点击右上角「回应」标签页,选择「链接到表格」,可创建新表格或关联已有表格,后续回复会自动同步至表格。API方式关联
调用Forms API的batchUpdate方法设置回复目标为指定表格:batch_update_body = { "requests": [ { "setDestination": { "destination": { "type": "SPREADSHEET", "id": "目标表格ID" } } } ] } form_service.forms().batchUpdate(formId=FORM_ID, body=batch_update_body).execute()注意:需确保服务账号对该表格拥有编辑权限。
步骤2:修复回复获取代码的问题
你的代码失效可能源于以下问题,对应修复方案如下:
- 权限不足:将服务账号添加为关联表格的查看/编辑者;
- 表格未正确关联:确认表格已与表单绑定,且存在回复数据;
- 范围设置过窄:扩大数据读取范围,避免遗漏列。
优化后的代码示例:
from googleapiclient.discovery import build from google.oauth2 import service_account import pandas as pd SCOPES = ["https://www.googleapis.com/auth/spreadsheets.readonly"] SERVICE_ACCOUNT_FILE = 'C:/python/nfl_poll_py/credentials.json' SPREADSHEET_ID = '实际表格ID' RANGE_NAME = 'Sheet1!A:ZZ' # 扩大范围避免遗漏数据 credentials = service_account.Credentials.from_service_account_file( SERVICE_ACCOUNT_FILE, scopes=SCOPES) sheets_service = build('sheets', 'v4', credentials=credentials) try: result = sheets_service.spreadsheets().values().get( spreadsheetId=SPREADSHEET_ID, range=RANGE_NAME).execute() values = result.get('values', []) if not values: print('无数据返回,请确认表格已关联表单且有回复') else: df_responses = pd.DataFrame(values[1:], columns=values[0]) print(df_responses) except Exception as e: print(f"获取回复时出错: {e}")
内容的提问来源于stack exchange,提问作者John Tayson
相关产品推荐
相关产品推荐

