使用Google Docs REST API batchUpdate替换图片遇权限禁止错误
Google Docs API批量替换图片权限异常问题
问题背景
使用Google Docs REST API的batchUpdate接口替换Docs文件内图片,最初遇到的权限错误已通过相关方案解决,但近期未修改代码的情况下,相同权限错误再次出现。当前必须使用服务账号操作,且目标图片权限仍设置为「任何人可通过链接访问」。
报错信息
error={message=Invalid requests[12].replaceImage: Access to the provided image was forbidden., code=400.0, status=INVALID_ARGUMENT}
代码片段
function postGoogleAPI(url, payload){ var service = getOAuthService(); service.reset(); var response = UrlFetchApp.fetch(url, { method: "POST", contentType : "application/json", headers: { Authorization: 'Bearer ' + service.getAccessToken() // 获取访问令牌的函数 }, payload: JSON.stringify(payload), muteHttpExceptions: true }); return JSON.parse(response); } function getGoogleAPI(url) { var service = getOAuthService(); service.reset(); var response = UrlFetchApp.fetch(url, { headers: { Authorization: 'Bearer ' + service.getAccessToken() // 获取访问令牌的函数 }, muteHttpExceptions: true }); return response; } function getReplaceImageRequest(imageFileId, docsFileId, mergeField) { let requestData = []; let url = Utilities.formatString("https://www.googleapis.com/drive/v3/files/%s?supportsAllDrives=true&fields=webContentLink", imageFileId); let response = getGoogleAPI(url); let logoUri = JSON.parse(response).webContentLink url = Utilities.formatString("https://docs.googleapis.com/v1/documents/%s?fields=inlineObjects", docsFileId); response = getGoogleAPI(url); let inlineObjects = JSON.parse(response.getContentText()); for(const key in inlineObjects.inlineObjects){ let title = inlineObjects.inlineObjects[key].inlineObjectProperties.embeddedObject.title; if(title != null && title == mergeField){ requestData.push({ "replaceImage": { "imageObjectId": key, "uri": logoUri, "imageReplaceMethod": "CENTER_CROP" } }); } } return requestData; } getReplaceImageRequest(<图片文件ID>, <Docs文件ID>, <合并字段标识>); let url = "https://docs.googleapis.com/v1/documents/<Docs文件ID>:batchUpdate"; let payload = { "requests" : requests } let response = postGoogleAPI(url, payload); // 错误发生在此处
已尝试操作
- 手动重置图片的公开访问权限,无效果
- 上传新图片后,接口恢复正常功能
恳请各位提供解决方案,感谢!
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

