Python调用Google Slides API插入按时间排序JPG的400报错问题
报错根因定位
三个逻辑错配直接导致了400异常和代码跑不通的问题:
presentations().create()接口的入参仅支持演示文稿标题、区域设置两个字段,你把原本属于batchUpdate接口的requests字段塞到了create的请求体里,直接触发了“Unknown name requests”的校验错误。- 代码中后续调用batchUpdate时引用了未初始化的
slides_service变量,实际初始化的服务实例变量名是service,就算create的请求结构改对,运行到这一步也会抛NameError。 - 写死的
page_id是手动构造的UUID,新建的演示文稿中不存在这个ID的页面,即使能提交批量更新请求,也会因为找不到对应页面失败。
分步修复方案
修正接口请求结构
- 调用创建演示文稿接口时,请求体只传入演示文稿标题,不携带其他无关字段。接口返回后会自动生成演示文稿ID,同时文稿会默认附带1个空白首页。
- 拿到动态生成的演示文稿ID后,再调用
batchUpdate接口,把插入图片、新建幻灯片的操作列表传入该接口——只有这个接口支持requests字段。
修正变量引用错误
- 把所有引用
slides_service的位置替换为实际初始化的service实例,同时将批量更新请求中的presentationId替换为创建接口返回的动态ID,不要使用之前写死的旧演示文稿ID。
实现本地JPG按时间排序插入的核心逻辑
需要明确:Google Slides的createImage接口仅支持插入公网可访问的HTTP/HTTPS图片链接,无法直接解析本地磁盘路径,完整流程为:
- 扫描指定本地目录下所有后缀为
.jpg/.jpeg的文件,通过os.path.getmtime()获取每个文件的最后修改时间戳。 - 按照时间戳从小到大排序,排序结果对应从第1页(时间最早)到最后1页(时间最新)的图片顺序。
- 通过Google Drive API将所有排序后的JPG文件上传到个人云盘,设置权限为“获取链接即可查看”,拿到每张图片的公网直链。
- 演示文稿默认的首页插入排序后的第一张图片,从第二张图片开始,先为每张图新建空白幻灯片页面,再将对应图片插入到新建页面中,所有操作可以一次性打包到
batchUpdate请求中提交,减少API调用次数。
修复后的核心参考代码
# 1. 创建空白演示文稿 create_body = {"title": "JP_february13-2021"} presentation = service.presentations().create(body=create_body).execute() presentation_id = presentation.get("presentationId") print(f"新建演示文稿成功,ID: {presentation_id}") # 2. 构造批量更新请求列表 batch_requests = [] # 获取新建文稿默认首页的真实ID default_page_id = presentation.get("slides")[0].get("objectId") emu_unit = {"magnitude": 4000000, "unit": "EMU"} # 示例:在默认首页插入时间最早的第一张图片 # 替换为Drive上传后拿到的图片公网直链 first_img_url = "对应第一张图的公网直链" batch_requests.append({ "createImage": { "objectId": "img_earliest", "url": first_img_url, "elementProperties": { "pageObjectId": default_page_id, "size": {"height": emu_unit, "width": emu_unit}, "transform": { "scaleX": 1, "scaleY": 1, "translateX": 100000, "translateY": 100000, "unit": "EMU" } } } }) # 后续遍历排序后的其余图片:先调用createSlide新建空白页,再调用createImage插入对应图片 # 所有请求统一塞入batch_requests列表,最后一次性提交 # 3. 提交批量更新请求 update_response = service.presentations().batchUpdate( presentationId=presentation_id, body={"requests": batch_requests} ).execute() print("幻灯片图片插入完成")
内容的提问来源于stack exchange,提问作者LP0
相关产品推荐
相关产品推荐

