0

0

Python编程:在指定Google Drive文件夹中创建Google表单

碧海醫心

碧海醫心

发布时间:2025-12-03 13:52:24

|

299人浏览过

|

来源于php中文网

原创

python编程:在指定google drive文件夹中创建google表单

本文旨在解决Google Forms API无法直接在特定Google Drive文件夹中创建表单的问题。我们将详细介绍如何结合使用Google Forms API创建表单,并利用Google Drive API将其移动至目标文件夹,从而实现对表单存储位置的精确控制。教程将涵盖API认证、表单创建及文件移动的完整流程,并提供示例代码,帮助开发者高效管理Google表单。

1. 理解Google Forms API的局限性

在使用Python通过Google Forms API创建表单时,一个常见的挑战是无法直接指定表单的存储位置。默认情况下,所有新创建的Google表单都会被放置在用户的Google Drive根目录(My Drive)下。这是因为Google Forms API本身侧重于表单的结构和内容管理,而非其在Google Drive中的文件组织。尽管Google Drive API提供了parents参数来指定文件的父文件夹,但这个参数并非Google Forms API创建方法的一部分。

为了克服这一限制,我们需要采取一种间接但有效的方法:首先使用Google Forms API创建表单,然后利用Google Drive API来管理这个表单文件在Drive中的位置。

2. 解决方案概述:结合Google Drive API

Google表单在Google Drive中被视为一种特殊类型的文件。因此,一旦表单被创建并获得其文件ID,我们就可以像操作其他任何Google Drive文件一样,使用Google Drive API来移动它。核心思路是:

立即学习Python免费学习笔记(深入)”;

  1. 使用Google Forms API创建表单,获取其唯一的表单ID(该ID同时也是其在Google Drive中的文件ID)。
  2. 使用Google Drive API,通过表单的文件ID,将其从默认的根目录移动到指定的文件夹。

3. 环境准备与API认证

在开始之前,请确保你已经设置了Google Cloud项目,并启用了Google Forms API和Google Drive API。同时,你需要配置OAuth 2.0凭据(通常是credentials.json文件),以便Python应用能够访问这些API。

以下是必要的导入和认证代码示例:

import os
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.discovery import build

# 定义所需的API范围
SCOPES = [
    'https://www.googleapis.com/auth/forms',
    'https://www.googleapis.com/auth/drive'
]

def get_google_api_service(api_name, api_version, scopes):
    """
    获取Google API服务客户端
    """
    creds = None
    # token.json 存储了用户上一次的认证信息,如果存在则直接加载
    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json', scopes)

    # 如果没有有效的凭据,则进行用户认证
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', scopes)
            creds = flow.run_local_server(port=0)
        # 将凭据保存起来,以便下次使用
        with open('token.json', 'w') as token:
            token.write(creds.to_json())

    return build(api_name, api_version, credentials=creds)

# 获取Forms API服务和Drive API服务
forms_service = get_google_api_service('forms', 'v1', SCOPES)
drive_service = get_google_api_service('drive', 'v3', SCOPES)

注意事项:

Insou AI
Insou AI

Insou AI 是一款强大的人工智能助手,旨在帮助你轻松创建引人入胜的内容和令人印象深刻的演示。

下载
  • credentials.json 文件应从Google Cloud Console下载并放置在项目根目录。
  • token.json 文件会在首次认证成功后自动生成,用于存储刷新令牌,避免重复认证。
  • 确保SCOPES中包含了forms和drive的完整访问权限。

4. 创建Google表单

首先,我们使用Google Forms API创建一个新的表单。这个表单将默认创建在你的Google Drive根目录。

def create_google_form(title):
    """
    使用Forms API创建一个新的Google表单。
    """
    form_body = {
        "info": {
            "title": title,
            "documentTitle": title # 确保在Drive中显示正确的标题
        },
        # 可以在这里添加更多表单内容,例如问题
        # "items": [
        #     {
        #         "title": "您的姓名?",
        #         "questionItem": {
        #             "question": {
        #                 "textQuestion": {"autoValidation": False},
        #                 "required": True,
        #                 "type": "TEXT"
        #             }
        #         }
        #     }
        # ]
    }

    try:
        result = forms_service.forms().create(body=form_body).execute()
        form_id = result.get('formId')
        print(f"表单 '{title}' 已创建。ID: {form_id}")
        print(f"表单URL: {result.get('responderUri')}")
        return form_id
    except Exception as e:
        print(f"创建表单时发生错误: {e}")
        return None

# 示例:创建表单
form_title = "我的新项目表单"
new_form_id = create_google_form(form_title)

new_form_id就是我们接下来需要用来移动表单的Google Drive文件ID。

5. 将表单移动到指定Google Drive文件夹

获取到表单ID后,我们可以使用Google Drive API的files().update()方法来修改其父文件夹。这涉及到从当前父文件夹中移除表单,并将其添加到目标文件夹中。

def move_file_to_folder(file_id, target_folder_id):
    """
    使用Drive API将文件移动到指定文件夹。
    """
    try:
        # 获取文件的当前父文件夹(通常是'root')
        # 默认情况下,新创建的表单位于根目录,其父ID为'root'
        # 如果文件可能在其他位置,需要先查询其当前父ID
        # 但对于新创建的Forms API表单,通常可以直接假设其在root

        # 移动文件,addParents参数指定新父文件夹,removeParents参数指定要移除的旧父文件夹
        file = drive_service.files().update(
            fileId=file_id,
            addParents=target_folder_id,
            removeParents='root', # 默认从根目录移除
            fields='id, parents'
        ).execute()

        print(f"文件 '{file_id}' 已成功移动到文件夹 '{target_folder_id}'。")
        return True
    except Exception as e:
        print(f"移动文件时发生错误: {e}")
        return False

# 示例:移动表单到指定文件夹
if new_form_id:
    # 替换为你的目标Google Drive文件夹ID
    # 你可以在Google Drive中打开一个文件夹,URL中的最后一段就是文件夹ID
    target_folder_id = "YOUR_TARGET_FOLDER_ID_HERE" 

    if target_folder_id == "YOUR_TARGET_FOLDER_ID_HERE":
        print("请替换 'YOUR_TARGET_FOLDER_ID_HERE' 为你的实际目标文件夹ID。")
    else:
        move_file_to_folder(new_form_id, target_folder_id)

重要提示:

  • 请将"YOUR_TARGET_FOLDER_ID_HERE"替换为你要存放表单的实际Google Drive文件夹的ID。你可以在浏览器中打开目标文件夹,URL中的folder/后面的一串字符就是其ID。
  • removeParents='root'假设表单是在根目录创建的。如果你的表单可能在其他地方,你需要先通过drive_service.files().get(fileId=file_id, fields='parents').execute()查询其当前的父文件夹ID。

6. 完整示例代码

将上述代码片段整合,形成一个完整的自动化流程:

import os
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.discovery import build

# 定义所需的API范围
SCOPES = [
    'https://www.googleapis.com/auth/forms',
    'https://www.googleapis.com/auth/drive'
]

def get_google_api_service(api_name, api_version, scopes):
    """
    获取Google API服务客户端
    """
    creds = None
    if os.path.exists('token.json'):
        creds = Credentials.from_authorized_user_file('token.json', scopes)

    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', scopes)
            creds = flow.run_local_server(port=0)
        with open('token.json', 'w') as token:
            token.write(creds.to_json())

    return build(api_name, api_version, credentials=creds)

def create_google_form(forms_service, title):
    """
    使用Forms API创建一个新的Google表单。
    """
    form_body = {
        "info": {
            "title": title,
            "documentTitle": title
        }
    }

    try:
        result = forms_service.forms().create(body=form_body).execute()
        form_id = result.get('formId')
        print(f"表单 '{title}' 已创建。ID: {form_id}")
        print(f"表单URL: {result.get('responderUri')}")
        return form_id
    except Exception as e:
        print(f"创建表单时发生错误: {e}")
        return None

def move_file_to_folder(drive_service, file_id, target_folder_id):
    """
    使用Drive API将文件移动到指定文件夹。
    """
    try:
        file = drive_service.files().update(
            fileId=file_id,
            addParents=target_folder_id,
            removeParents='root',
            fields='id, parents'
        ).execute()

        print(f"文件 '{file_id}' 已成功移动到文件夹 '{target_folder_id}'。")
        return True
    except Exception as e:
        print(f"移动文件时发生错误: {e}")
        return False

if __name__ == "__main__":
    # 获取Forms API服务和Drive API服务
    forms_service = get_google_api_service('forms', 'v1', SCOPES)
    drive_service = get_google_api_service('drive', 'v3', SCOPES)

    # 1. 创建Google表单
    form_title = "客户满意度调查表"
    new_form_id = create_google_form(forms_service, form_title)

    if new_form_id:
        # 2. 指定目标文件夹ID
        # 请替换为你的目标Google Drive文件夹ID
        target_folder_id = "YOUR_TARGET_FOLDER_ID_HERE" 

        if target_folder_id == "YOUR_TARGET_FOLDER_ID_HERE":
            print("\n!!! 警告: 请将代码中的 'YOUR_TARGET_FOLDER_ID_HERE' 替换为你的实际目标文件夹ID。")
            print("表单已创建但未移动,它仍然在你的Google Drive根目录。")
        else:
            # 3. 移动表单到指定文件夹
            move_file_to_folder(drive_service, new_form_id, target_folder_id)

7. 总结

通过结合使用Google Forms API和Google Drive API,我们可以有效地解决在特定Google Drive文件夹中创建Google表单的问题。核心在于利用Forms API创建表单以获取其文件ID,然后利用Drive API的files().update()方法将该文件移动到目标文件夹。这种两步走的策略为Python开发者提供了灵活且强大的Google表单管理能力。在实际应用中,请务必注意API认证、权限范围以及错误处理,以确保程序的健壮性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

登录token无效
登录token无效

登录token无效解决方法:1、检查token的有效期限,如果token已经过期,需要重新获取一个新的token;2、检查token的签名,如果签名不正确,需要重新获取一个新的token;3、检查密钥的正确性,如果密钥不正确,需要重新获取一个新的token;4、使用HTTPS协议传输token,建议使用HTTPS协议进行传输 ;5、使用双因素认证,双因素认证可以提高账户的安全性。

6655

2023.09.14

登录token无效怎么办
登录token无效怎么办

登录token无效的解决办法有检查Token是否过期、检查Token是否正确、检查Token是否被篡改、检查Token是否与用户匹配、清除缓存或Cookie、检查网络连接和服务器状态、重新登录或请求新的Token、联系技术支持或开发人员等。本专题为大家提供token相关的文章、下载、课程内容,供大家免费下载体验。

844

2023.09.14

token怎么获取
token怎么获取

获取token值的方法:1、小程序调用“wx.login()”获取 临时登录凭证code,并回传到开发者服务器;2、开发者服务器以code换取,用户唯一标识openid和会话密钥“session_key”。想了解更详细的内容,可以阅读本专题下面的文章。

1092

2023.12.21

token什么意思
token什么意思

token是一种用于表示用户权限、记录交易信息、支付虚拟货币的数字货币。可以用来在特定的网络上进行交易,用来购买或出售特定的虚拟货币,也可以用来支付特定的服务费用。想了解更多token什么意思的相关内容可以访问本专题下面的文章。

2209

2024.03.01

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号