问题描述
我想使用 Google Slide App Scripts 将第一张幻灯片上的图像复制到另一张幻灯片。
为此,在将 blob 插入下一张幻灯片之前,我将图像中的数据作为 blob 获取。问题是,即使我设置了顶部、左侧、宽度和高度的值,我也不明白如何保持相同的比例(在我的情况下,我已经裁剪了图像)。
这是我的代码:
function myFunction() {
var slides = SlidesApp.getActivePresentation().getSlides();
var blop,width,height;
slides[0].getimages().forEach(function(image){
if(image.getTitle() == "image") {
blop = image.getBlob()
left = image.getLeft()
top = image.getTop()
width = image.getWidth()
height = image.getHeight()
}
});
slides[1].insertimage(blop,left,top,height)
}
你可以在这里看到它的样子: https://docs.google.com/presentation/d/1LlyHNbjcANWspPvJZedW9vgx9c9JHRD-kWOvXkwrDNo/edit?usp=sharing(查看器模式)
当我尝试应用转换时,结果确实不同...
解决方法
修改点:
-
不幸的是,在当前阶段,似乎在 Slides Service 和 Slides API 中,无法使用图像裁剪。这已经被报道过了。 Ref 所以,我认为在您的情况下,可能需要复制包含裁剪信息的图像。
-
在您的脚本中,使用了
insertImage(blobSource,left,top,width,height)
。在这种情况下,blob
是原始图像。由此,不包括作物信息。我认为这可能是您出现问题的原因。 -
在这种情况下,我想建议使用
insertImage(image)
。该方法的文档如下。在页面上插入提供的 Image 的副本。
当以上几点反映到你的脚本中时,它变成如下。
修改后的脚本:
function myFunction() {
var slides = SlidesApp.getActivePresentation().getSlides();
slides[0].getImages().forEach(function(image){
if(image.getTitle() == "image") {
slides[1].refreshSlide();
slides[1].insertImage(image);
slides[1].refreshSlide();
}
});
}
结果:
当以上修改后的脚本用于您的示例 Google 幻灯片时,将获得以下结果。
-
当我测试这个修改后的脚本时,我注意到一个重要的点。使用此脚本时,似乎需要使用
refreshSlide
。因为我确认,当不使用refreshSlide
时,不包括裁剪和坐标信息的图像被复制。 -
而且,在我的环境中,在大多数情况下,脚本运行良好。但是,我注意到,当我多次测试时,即使使用
refreshSlide
,也存在复制不包含裁剪和坐标信息的图像的情况。所以我认为insertImage(image)
可能有错误。- 如果在您的环境中,您遇到了同样的情况,那么向 Google 问题跟踪器报告如何? Ref