AppScript中InsertImage()函数报错:Invalid image data异常(大尺寸图片问题)
解决AppScript插入大图片时的Invalid image data异常
这个问题是因为Google Docs对插入的图片有像素面积上限(2500万像素),当图片的宽×高超过这个数值时,就会触发Invalid image data错误。
解决方案:插入前自动压缩图片尺寸
添加一个图片尺寸检查与压缩的函数,在获取图片Blob后先处理到允许的范围内,再插入文档。
修改后的完整代码如下:
function replaceTextToImage(body, searchText, image, width) { var next = body.findText(searchText); if (!next) return; var r = next.getElement(); r.asText().setText(""); var img = r.getParent().asParagraph().insertInlineImage(0, image); if (width && typeof width == "number") { var w = img.getWidth(); var h = img.getHeight(); img.setWidth(width); img.setHeight(width * h / w); } return next; } function getImageLinks(text){ var linkArray = text.toString().split(", "); console.log(linkArray); linkArray = linkArray.map(getOnlyId); console.log(linkArray); return linkArray; } // 新增:检查并调整图片尺寸到允许范围 function resizeImageIfNeeded(imageBlob) { const MAX_PIXEL_AREA = 25000000; const metadata = imageBlob.getAs("image/png").getMetadata(); const width = metadata.width; const height = metadata.height; if (width * height <= MAX_PIXEL_AREA) { return imageBlob; } // 计算缩放比例,确保宽高乘积不超过上限 const scale = Math.sqrt(MAX_PIXEL_AREA / (width * height)); const newWidth = Math.floor(width * scale); const newHeight = Math.floor(height * scale); // 转换Blob并调整尺寸 return imageBlob.getAs(`image/png;resize=${newWidth},${newHeight}`); } function replacePhotosBasedOnList(text, listOfPlaceHolders, body, width){ var listOfLinks = text; var count; if(listOfLinks[0] != ""){ for (count = 0; count < listOfLinks.length; count++){ var imageBlob = DriveApp.getFileById(listOfLinks[count]).getBlob(); // 先处理图片尺寸 var resizedImage = resizeImageIfNeeded(imageBlob); replaceTextToImage(body, listOfPlaceHolders[count], resizedImage, width); } } for(var i = count; i < listOfPlaceHolders.length; i++){ body.replaceText(listOfPlaceHolders[i], '') } }
关键说明
resizeImageIfNeeded函数先获取图片的原始尺寸,计算像素面积是否超限- 如果超限,按比例计算新的宽高,确保总面积不超过2500万
- 通过
getAs()方法的resize参数生成压缩后的图片Blob,属于Google Apps Script原生支持的功能,无需额外授权
注意事项
- 若图片是透明背景的PNG,建议保留
image/png格式;若是照片,可换成image/jpeg并添加质量参数(如image/jpeg;quality=80;resize=...)进一步减小文件体积 - 确保脚本拥有访问Drive文件和处理图片的权限
内容的提问来源于stack exchange,提问作者Isabella Sampaio
相关产品推荐
相关产品推荐

