Java调用Google Apps Script API执行函数时遇400错误求助
我之前也碰到过这种模糊的400错误,确实头疼,给你几个具体的排查方向,一步步来定位问题:
1. 先在Apps Script编辑器里手动测试函数
先抛开API调用,直接在Apps Script编辑器里运行你的main2函数,传入和API调用完全相同的参数:
main2("15gXG9frqV0VrF57BjDqOe0pCHPWxVJ1ucV0Fl3zR0J4", '{"num":"035","digital_key":"https://docs.google.com/document/d/15gXG9frqV0VrF57BjDqOe0pCHPWxVJ1ucV0Fl3zR0J4","Title":"Build Control for Image Enhancement","Author":"Evan Ruff","Date":"05/11/18"}')
如果手动运行也报错,那问题出在函数本身的逻辑里,比如JSON解析失败、权限不足访问文档等;如果手动运行正常,那问题肯定出在API调用的参数传递或配置上。
2. 检查参数传递的类型是否匹配
这是最常见的坑!看你的Java代码,第二个参数是把键值对转成了JSON字符串传递,但要确认你的main2函数是否真的期望接收一个字符串:
- 如果
main2的逻辑是先把字符串解析成对象(比如用JSON.parse(jsonStr)),那没问题; - 如果
main2其实期望直接接收一个对象(比如function main2(fileId, dataObj)),那你现在传递字符串就会导致参数类型不匹配,触发invalid argument错误。
如果是后者,修改Java代码,直接传递Map对象而不是JSON字符串:
Map<String, Object> dataMap = new HashMap<>(); dataMap.put("num", "035"); dataMap.put("digital_key", "https://docs.google.com/document/d/15gXG9frqV0VrF57BjDqOe0pCHPWxVJ1ucV0Fl3zR0J4"); dataMap.put("Title", "Build Control for Image Enhancement"); dataMap.put("Author", "Evan Ruff"); dataMap.put("Date", "05/11/18"); List<Object> params = Lists.newArrayList(); params.add(fileId); params.add(dataMap); // 直接传对象,不是字符串 ExecutionRequest request = new ExecutionRequest() .setFunction("main2") .setParameters(params); script().scripts().run(TEMPLATE_FILLER_SCRIPT_ID, request).execute();
3. 检查服务账号的脚本共享权限
确保你的服务账号邮箱已经被添加到Apps Script项目的共享列表中,并且拥有编辑权限。服务账号是独立的身份,如果脚本没有共享给它,即使你有域级权限,也可能触发参数相关的模糊错误(虽然通常权限问题是403,但偶尔会被包装成400)。
4. 启用Apps Script的详细日志排查
在main2函数开头添加日志打印,确认参数是否正确接收:
function main2(fileId, jsonStr) { console.log("Received fileId:", fileId); console.log("Received JSON string:", jsonStr); // 后续逻辑... }
然后调用API后,去Google Cloud Console的日志资源管理器,筛选你的Apps Script项目的日志,看看是否有这些打印内容。如果没有日志,说明函数根本没执行,问题出在API调用的参数或权限;如果有日志,看参数是否和你传递的一致,再排查后续逻辑。
5. 简化参数做最小化测试
先把参数简化到极致,比如只传递fileId,修改main2函数只处理第一个参数,看API调用是否成功:
List<Object> params = Lists.newArrayList(); params.add(fileId); ExecutionRequest request = new ExecutionRequest() .setFunction("main2") .setParameters(params); script().scripts().run(TEMPLATE_FILLER_SCRIPT_ID, request).execute();
如果成功,再逐步添加第二个参数,先传一个简单的JSON字符串(比如"{\"test\":\"hello\"}"),看是否触发错误,这样能快速定位是参数内容的问题还是传递方式的问题。
6. 升级Google API Java客户端版本
你当前用的是Google-HTTP-Java-Client/1.23.0,这个版本比较老旧,可能存在一些已知的序列化bug。尝试升级到最新版的google-api-client和google-http-client,看看是否能解决参数传递的问题。
内容的提问来源于stack exchange,提问作者Evan Ruff

