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

PowerShell调用Google Docs API更新团队盘文档报400错误解决方法

问题根因

返回400错误和batchUpdate对象的传递位置无关,核心是你的PowerShell代码构造请求体的方式完全错误:

  • 你用{}包裹内容直接赋值给变量的写法,在PowerShell中是创建脚本块而非结构化对象,传给接口的内容是脚本块的文本表示,完全不符合JSON格式要求
  • 你写的类JavaScript键值对语法PowerShell无法原生识别,必须使用PowerShell原生的哈希表@{}结构构造数据,再序列化为标准JSON字符串后才能作为请求体传递
  • PowerShell默认的JSON序列化深度为2,你构造的嵌套结构如果不手动指定更高深度,会被序列化为空值,导致接口参数校验失败
修复方案

Google Docs的batchUpdate接口的请求体直接放在POST请求的Body中即可,不需要放到其他特殊位置,只要保证传递的Body是符合接口格式要求的合法JSON字符串就能正常调用。

核心修正逻辑

  • 用PowerShell原生哈希表结构构造所有请求参数,不要用类JS的对象写法、不要直接用脚本块传参
  • 构造完参数后用ConvertTo-Json命令转为标准JSON字符串,手动指定序列化深度为5及以上,避免嵌套结构被截断
  • 发请求时给Content-Type加上utf-8编码声明,避免特殊字符解析失败
  • 修复Get-Auth函数的变量作用域问题,保证access_token能被正常传递
修正后的完整代码
function Get-Auth{
    $refresh_body = @{
        client_id='338139966542-qaa4me7l4fs0l1ltl2e6kjidjr9tf3up.apps.googleusercontent.com'
        client_secret='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'
        refresh_token='1//04GjkX_q30ioyCgYIARAAGAQSNwF-L9IrKggdZo-Pq9E_t3qEbmhHmQe8JVVDW4vaXGoeFiRxxJ5KRu7f7TpQVDsHrwMdmc7Xqn4'
        grant_type="refresh_token"
    }
    $refresh_result = Invoke-RestMethod -Uri "https://www.googleapis.com/oauth2/v4/token" -Method POST -Body $refresh_body
    # 直接返回access_token,避免局部变量作用域问题
    return $refresh_result.access_token
}

# 获取有效access token
$access_token = Get-Auth

# 获取文档基础信息
$document = Invoke-RestMethod -Headers @{Authorization = "Bearer $access_token"} -ContentType "application/json" -Method GET -Uri "https://docs.googleapis.com/v1/documents/1K8_q_VCTWin_s8aVb0D16DNujqA72eravHojMfM9cyo" 
$revId = $document.revisionId

# 用哈希表构造batchUpdate请求体
$updateBody = @{
    requests = @(
        @{
            insertText = @{
                text = "The Red Dog Crosses the Road"
                endOfSegmentLocation = @{
                    segmentId = ""
                }
            }
        }
    )
    writeControl = @{
        requiredRevisionId = $revId
    }
}

# 序列化为合法JSON字符串,指定足够的序列化深度
$updateJson = $updateBody | ConvertTo-Json -Depth 5

# 发起更新请求
$response = Invoke-RestMethod -Headers @{Authorization = "Bearer $access_token"} -ContentType "application/json; charset=utf-8" -Method POST -Uri "https://docs.googleapis.com/v1/documents/1K8_q_VCTWin_s8aVb0D16DNujqA72eravHojMfM9cyo:batchUpdate" -Body $updateJson
日志场景优化建议
  • 写入日志时可以不传writeControl.requiredRevisionId参数,接口会默认基于文档最新版本追加内容,避免因为本地缓存的revisionId和服务端不一致导致的版本冲突错误,更适合持续写日志的场景
  • 不要手动拼接JSON字符串写入内容,所有结构化内容都通过哈希表构造后序列化,避免引号、特殊字符转义导致的格式错误
  • 如果需要追加换行日志,直接在text参数值里加\n即可,序列化时会自动转义为合法的JSON换行符

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 05:49:19