如何在Google Apps Script中复制粘贴含裁剪信息的图片
解决方案:复制图片裁剪信息并应用到新文档中的PositionedImage
好问题!其实Google Apps Script的Document Service完全支持提取和应用图片的裁剪信息,不管原图片是InlineImage还是PositionedImage,都能通过对应API完美处理。下面是具体的实现步骤和代码示例:
1. 提取原图片的裁剪属性
不管是内嵌图还是定位图,都可以调用getCropProperties()方法获取裁剪信息,这个方法会返回一个CropProperties对象,包含四个核心比例值(范围0-1,0表示无裁剪,1表示完全裁掉对应方向区域):
top: 顶部裁剪比例bottom: 底部裁剪比例left: 左侧裁剪比例right: 右侧裁剪比例
示例提取代码:
// 提取原文档中的内嵌图裁剪信息 const inlineImage = sourceDoc.getBody().getImages()[0]; const inlineCropProps = inlineImage.getCropProperties(); // 提取原文档中的定位图裁剪信息 const positionedImage = sourceDoc.getBody().getPositionedImages()[0]; const positionedCropProps = positionedImage.getCropProperties();
2. 在新文档中插入图片并应用裁剪
将图片Blob插入新文档成为PositionedImage后,直接调用setCropProperties()方法传入提取到的裁剪属性对象,就能完美还原原图片的裁剪效果。
完整实现代码:
function copyImagesWithCropPreserved() { const sourceDocId = "你的原文档ID"; const targetDocId = "你的目标文档ID"; const sourceDoc = DocumentApp.openById(sourceDocId); const targetDoc = DocumentApp.openById(targetDocId); const targetBody = targetDoc.getBody(); // 处理原文档中的内嵌图,转为带裁剪的定位图 const inlineImages = sourceDoc.getBody().getImages(); inlineImages.forEach(img => { const imgBlob = img.getBlob(); const cropProps = img.getCropProperties(); // 插入定位图并保留原尺寸(可按需调整位置) const newPositionedImg = targetBody.appendPositionedImage(imgBlob) .setLeftOffset(50) .setTopOffset(50) .setWidth(img.getWidth()) .setHeight(img.getHeight()); // 应用裁剪属性 newPositionedImg.setCropProperties(cropProps); }); // 处理原文档中的定位图,保留位置、尺寸和裁剪 const positionedImages = sourceDoc.getBody().getPositionedImages(); positionedImages.forEach(img => { const imgBlob = img.getBlob(); const cropProps = img.getCropProperties(); const newPositionedImg = targetBody.appendPositionedImage(imgBlob) .setLeftOffset(img.getLeftOffset()) .setTopOffset(img.getTopOffset()) .setWidth(img.getWidth()) .setHeight(img.getHeight()); newPositionedImg.setCropProperties(cropProps); }); targetDoc.saveAndClose(); }
关键注意点
- 如果原图片没有裁剪,
getCropProperties()会返回默认值(四个方向均为0),此时应用裁剪不会有任何变化,无需额外判断。 - 务必保持新图片的宽高和原图片一致,再配合裁剪属性,就能完全避免变形问题。
- 确保你拥有原文档和目标文档的编辑权限,否则会抛出权限错误。
内容的提问来源于stack exchange,提问作者Briony Doyle




