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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 06:32:36