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

如何通过API为Google Sheet创建命名版本?Python代码无效果

如何使用Python通过API为Google Sheet创建命名版本

你的代码逻辑方向正确,但存在几个关键细节问题导致命名版本未生成,以下是问题分析和修正方案:

问题根源

  1. 修订版触发问题:Google Sheets仅在文件内容/元数据发生变化时生成新修订版,如果文件近期无修改,你更新的可能是旧版修订,不会在「命名版本」中明显显示
  2. API字段指定缺失:Drive API的revisions.update操作需要显式指定返回字段,否则可能无法确认修改是否生效
  3. 权限验证:需确保服务账号拥有目标Sheet的编辑权限,仅查看权限无法修改修订版属性

修正后的完整代码

from googleapiclient.discovery import build
from google.oauth2.service_account import Credentials

SCOPES = ['https://www.googleapis.com/auth/drive']
SERVICE_ACCOUNT_FILE = 'path/to/client_key.json'

def create_named_version(file_id, version_name):
    creds = Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    drive_service = build('drive', 'v3', credentials=creds)

    try:
        # 可选:触发新修订版(基于当前Sheet状态创建命名版本时建议添加)
        # 通过临时修改标题触发修订,不影响实际内容
        sheet_service = build('sheets', 'v4', credentials=creds)
        current_meta = sheet_service.spreadsheets().get(spreadsheetId=file_id).execute()
        original_title = current_meta['properties']['title']
        
        # 临时修改标题
        sheet_service.spreadsheets().update(
            spreadsheetId=file_id,
            body={'properties': {'title': f"{original_title}_temp"}},
            fields='properties.title'
        ).execute()
        # 恢复原标题
        sheet_service.spreadsheets().update(
            spreadsheetId=file_id,
            body={'properties': {'title': original_title}},
            fields='properties.title'
        ).execute()

        # 获取最新修订版(指定返回字段确保数据完整)
        revisions = drive_service.revisions().list(
            fileId=file_id,
            fields='revisions(id,description,keepForever)'
        ).execute()
        latest_revision = revisions.get('revisions', [])[-1]
        revision_id = latest_revision['id']
        print(f"最新修订版ID: {revision_id}")

        # 更新修订版属性:标记为永久保留并添加命名
        revision_body = {'keepForever': True, 'description': version_name}
        updated_revision = drive_service.revisions().update(
            fileId=file_id,
            revisionId=revision_id,
            body=revision_body,
            fields='id,description,keepForever'
        ).execute()

        print("更新完成,修订版信息:")
        print(updated_revision)
        print(f"命名版本「{version_name}」已成功创建")

    except Exception as e:
        print(f"错误信息: {e}")

def list_revisions(file_id):
    # 辅助函数:列出所有修订版,用于验证命名版本
    creds = Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    drive_service = build('drive', 'v3', credentials=creds)
    try:
        revisions = drive_service.revisions().list(
            fileId=file_id,
            fields='revisions(id,description,keepForever,modifiedTime)'
        ).execute()
        for rev in revisions.get('revisions', []):
            print(f"ID: {rev['id']}, 名称: {rev.get('description', '无')}, 永久保留: {rev.get('keepForever', False)}, 修改时间: {rev['modifiedTime']}")
    except Exception as e:
        print(f"列出修订版失败: {e}")

if __name__ == "__main__":
    GOOGLE_SHEET_FILE_ID = '你的Google Sheet文件ID'
    VERSION_NAME = '我的命名版本'

    create_named_version(GOOGLE_SHEET_FILE_ID, VERSION_NAME)
    # 可选:执行以下命令验证结果
    # list_revisions(GOOGLE_SHEET_FILE_ID)

关键注意事项

  • 权限配置:必须将目标Sheet共享给服务账号的邮箱(在client_key.json的client_email字段中),并授予编辑权限
  • 触发修订的必要性:如果不需要基于当前状态创建新版本,可跳过标题修改步骤,直接指定目标修订版ID进行更新
  • 命名版本查看:创建完成后,打开Google Sheet,通过「文件」→「版本历史」→「命名版本」即可看到新创建的版本

内容的提问来源于stack exchange,提问作者Sammy Doodle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 19:50:57