使用Python调用Google Forms API删除指定问题遇400错误求助
问题:通过Google Forms API删除含特定标题的问题时触发400错误
我已通过Python连接Google Forms API并成功创建表单,现在尝试删除标题包含“Location”的问题,但持续收到400错误,具体信息如下:
Delete Requests: [{'itemId': '694f1da7'}, {'itemId': '71bc64d4'}, {'itemId': '4e41b483'}, {'itemId': '0e213f54'}, {'itemId': '6317804d'}, {'itemId': '63b56594'}, {'itemId': '3f950e5c'}, {'itemId': '4da4f659'}, {'itemId': '7b1d6335'}, {'itemId': '4f8ebf91'}, {'itemId': '41a10b4d'}, {'itemId': '32f9b1e8'}, {'itemId': '7e0e35eb'}, {'itemId': '4d1cbb79'}, {'itemId': '72945c2c'}, {'itemId': '1fe45ba1'}] Error during delete operation: <HttpError 400 when requesting https://forms.googleapis.com/v1/forms/1g3dWknRPyyt7Dap46Bmo3IMAuNfz_12_uURJNzRyrWk:batchUpdate?alt=json returned "Invalid JSON payload received. Unknown name "itemId" at 'requests[0]': Cannot find field. Invalid JSON payload received. Unknown name "itemId" at 'requests[1]': Cannot find field. Invalid JSON payload received. Unknown name "itemId" at 'requests[2]': Cannot find field. Invalid JSON payload received. Unknown name "itemId" at 'requests[3]': Cannot find field. Invalid JSON payload received. Unknown name "itemId" at 'requests[4]': Cannot find field. Invalid JSON payload received. Unknown name "itemId" at 'requests[5]': Cannot find field. Invalid JSON payload received. Unknown name "itemId" at 'requests[6]': Cannot find field. Invalid JSON payload received. Unknown name "itemId" at 'requests[7]': Cannot find field. Invalid JSON payload received. Unknown name "itemId" at 'requests[8]': Cannot find field. Invalid JSON payload received. Unknown name "itemId" at 'requests[9]': Cannot find field. Invalid JSON payload received. Unknown name "itemId" at 'requests[10]': Cannot find field. Invalid JSON payload received. Unknown name "itemId" at 'requests[11]': Cannot find field. Invalid JSON payload received. Unknown name "itemId" at 'requests[12]': Cannot find field. Invalid JSON payload received. Unknown name "itemId" at 'requests[13]': Cannot find field. Invalid JSON payload received. Unknown name "itemId" at 'requests[14]': Cannot find field. Invalid JSON payload received. Unknown name "itemId" at 'requests[15]': Cannot find field.". Details: "[{'@type': 'type.googleapis.com/google.rpc.BadRequest', 'fieldViolations': [{'field': 'requests[0]', 'description': 'Invalid JSON payload received. Unknown name "itemId" at \'requests[0]\': Cannot find field.'}, {'field': 'requests[1]', 'description': 'Invalid JSON payload received. Unknown name "itemId" at \'requests[1]\': Cannot find field.'}, {'field': 'requests[2]', 'description': 'Invalid JSON payload received. Unknown name "itemId" at \'requests[2]\': Cannot find field.'}, {'field': 'requests[3]', 'description': 'Invalid JSON payload received. Unknown name "itemId" at \'requests[3]\': Cannot find field.'}, {'field': 'requests[4]', 'description': 'Invalid JSON payload received. Unknown name "itemId" at \'requests[4]\': Cannot find field.'}, {'field': 'requests[5]', 'description': 'Invalid JSON payload received. Unknown name "itemId" at \'requests[5]\': Cannot find field.'}, {'field': 'requests[6]', 'description': 'Invalid JSON payload received. Unknown name "itemId" at \'requests[6]\': Cannot find field.'}, {'field': 'requests[7]', 'description': 'Invalid JSON payload received. Unknown name "itemId" at \'requests[7]\': Cannot find field.'}, {'field': 'requests[8]', 'description': 'Invalid JSON payload received. Unknown name "itemId" at \'requests[8]\': Cannot find field.'}, {'field': 'requests[9]', 'description': 'Invalid JSON payload received. Unknown name "itemId" at \'requests[9]\': Cannot find field.'}, {'field': 'requests[10]', 'description': 'Invalid JSON payload received. Unknown name "itemId" at \'requests[10]\': Cannot find field.'}, {'field': 'requests[11]', 'description': 'Invalid JSON payload received. Unknown name "itemId" at \'requests[11]\': Cannot find field.'}, {'field': 'requests[12]', 'description': 'Invalid JSON payload received. Unknown name "itemId" at \'requests[12]\': Cannot find field.'}, {'field': 'requests[13]', 'description': 'Invalid JSON payload received. Unknown name "itemId" at \'requests[13]\': Cannot find field.'}, {'field': 'requests[14]', 'description': 'Invalid JSON payload received. Unknown name "itemId" at \'requests[14]\': Cannot find field.'}, {'field': 'requests[15]', 'description': 'Invalid JSON payload received. Unknown name "itemId" at \'requests[15]\': Cannot find field.'}]}]">
以下是我用于删除问题的代码:
from googleapiclient.discovery import build from google.oauth2 import service_account from googleapiclient import discovery import requests import time import os #NFL Libraries import nfl_data_py as nfldt os.environ['OAUTHLIB_INSECURE_TRANSPORT'] = '1' # Replace with your service account credentials JSON file path SERVICE_ACCOUNT_FILE = 'credentials.json' # Replace with your Google Form ID FORM_ID = 'Insert Form ID Here' # Define the scopes for Google Forms API SCOPES = ['https://www.googleapis.com/auth/forms', 'https://www.googleapis.com/auth/forms.body', "https://www.googleapis.com/auth/drive"] # Authenticate and create the service credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES) form_service = discovery.build( 'forms', 'v1', credentials=credentials, discoveryServiceUrl='https://forms.googleapis.com/$discovery/rest?version=v1', static_discovery=False ) # Retrieve the current form metadata form_metadata = form_service.forms().get(formId=FORM_ID).execute() print(form_metadata) def delete_questions_with_location_in_title(FORM_ID): try: # Fetch form metadata to get all items form_metadata = form_service.forms().get(formId=FORM_ID).execute() items = form_metadata.get('items', []) # Prepare a list to hold the delete requests delete_requests = [] # Iterate over the items and find the ones to delete for item in items: if 'title' in item and 'questionItem' in item: if 'Location' in item['title']: item_id = item['itemId'] delete_requests.append({ "deleteItem": { 'itemId': item_id #I THINK THE ERROR IS HERE } }) # Print the delete requests for debugging print(f"Delete Requests: {delete_requests}") # Execute the batch update if there are delete requests if delete_requests: batch_delete_request = { "requests": delete_requests } response = form_service.forms().batchUpdate(formId=FORM_ID, body=batch_delete_request).execute() print(f"Deleted {len(delete_requests)} questions from the form.") print(response) # Print the response for debugging else: print("No items with 'Location' in title found for deletion.") except Exception as e: print(f"Error during delete operation: {e}") # Call the function to delete questions with 'Location' in title delete_questions_with_location_in_title(FORM_ID)
我怀疑问题出在'itemId': item_id这部分,但不确定具体原因。
解决方案
从错误信息和打印的请求内容可以看出,实际发送的请求结构不符合Google Forms API的要求:
- API要求批量删除请求的每个元素必须是
{"deleteItem": {"itemId": "目标ID"}}的格式 - 但你的打印结果显示,请求列表里的元素直接是
{"itemId": "xxx"},缺少外层的deleteItem字段
检查代码可以发现,你写的代码逻辑是正确的,但打印结果和代码不符,推测可能是实际运行的代码存在疏漏(比如误删了"deleteItem"键)。请确保delete_requests的每个元素结构正确:
delete_requests.append({ "deleteItem": { "itemId": item_id } })
另外,注意字段名的大小写:API要求itemId是驼峰写法,你的代码里用的是小写开头的itemId是正确的,无需修改。
确认结构正确后重新运行代码,即可正常删除目标问题。
内容的提问来源于stack exchange,提问作者John Tayson
相关产品推荐
相关产品推荐

