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
相关产品推荐
相关产品推荐

