4

我的目标是根据文件夹中的图像自动创建和更新 Google 幻灯片演示文稿:

当前工作正常但我想自动化的工作流程如下:

  1. 图片位于 Google Drive 文件夹中
  2. 我使用文件选择器菜单(插入->图像->驱动器)手动将图像添加到每张幻灯片
  3. 文件夹中的图像由外部脚本定期更新,使用相同的文件名替换以前的图像。图片保留相同的 Google 云端硬盘文件 ID
  4. 幻灯片中的图像会自动更新,在浏览器中重新加载幻灯片演示文稿时可以看到更改

我试图达到的目标:

不要使用文件选择器一一创建幻灯片和插入图像,而是使用基于驱动器文件夹中的图像文件创建演示文稿的脚本。

我已经使用了Google Developers Pages 上的教程,并且幻灯片的创建工作正常。但是,与手动插入相比,脚本创建的幻灯片中的图像不会更新。该脚本只获取一次图像,并且似乎使用“图像的副本”。

我的测试代码是:

var NAME = "Dynamic Image Insert Test";
var presentation = SlidesApp.create(NAME);

function addImageSlide(fileID, index) {
    var slide = presentation.appendSlide(SlidesApp.PredefinedLayout.BLANK);    
    var imageurl = DriveApp.getFileById(fileID);
    var image = slide.insertImage(imageurl);
    var imgWidth   = image.getWidth();
    var imgHeight  = image.getHeight();
    var pageWidth  = presentation.getPageWidth();
    var pageHeight = presentation.getPageHeight();
    var newX = pageWidth/2.  - imgWidth/2.;
    var newY = pageHeight/2. - imgHeight/2.;
    image.setLeft(newX).setTop(newY);
}

function main() {
    var images = [
        "Insert ID of a File 1 on Google Drive here",
        "Insert ID of a File 2 on Google Drive here"      
    ];
    var [title, subtitle] = presentation.getSlides()[0].getPageElements();
    title.asShape().getText().setText(NAME);
    subtitle.asShape().getText().setText("Insert Files from Drive using File ID");
    images.forEach(addImageSlide);
}

此外,在检查幻灯片页面的对象属性时,似乎有 2 个参数:contentUrl 和 sourceUrl

当使用文件选择器插入时,图像似乎使用sourceUrl,它保持不变,这样当文件在 Drive 上更新时更新图像。当使用 AppScript(或使用 API - 也经过测试)时,图像似乎使用 contentUrl,它在每次创建图像时生成,因此不引用驱动器上的文件,因此不反映对文件的任何更改驱动器。

页面对象属性的记录器输出:

{
  "pageElements": [
    {
      "transform": {
        "scaleX": 171.123,
        "scaleY": 171.123,
        "unit": "EMU",
        "translateY": 1288327.54,
        "translateX": 2375975
      },
      "objectId": "MyImage_01",
      "image": {
        "sourceUrl": "https://lh3.google.com/u/0/d/This-is-the-static-file-id",
        "contentUrl": "https://lh6.googleusercontent.com/This-is-the-id-created-when-creating-the-image-on-the-slide",
        "imageProperties": {
          "shadow": {
            "color": {
              "rgbColor": {}
            },
            "blurRadius": {
              "unit": "EMU"
            },
            "type": "OUTER",
            "transform": {
              "scaleX": 1,
              "scaleY": 1,
              "unit": "EMU"
            },
            "alpha": 1,
            "propertyState": "NOT_RENDERED",
            "rotateWithShape": false,
            "alignment": "BOTTOM_LEFT"
          },
          "outline": {
            "dashStyle": "SOLID",
            "propertyState": "NOT_RENDERED",
            "weight": {
              "unit": "EMU",
              "magnitude": 9525
            },
            "outlineFill": {
              "solidFill": {
                "color": {
                  "themeColor": "DARK2"
                },
                "alpha": 1
              }
            }
          }
        }
      },
      "size": {
        "width": {
          "unit": "EMU",
          "magnitude": 23375
        },
        "height": {
          "unit": "EMU",
          "magnitude": 15000
        }
      }
    }
  ]
}

sourceUrl 也没有记录在API 的参考资料中

任何想法如何在插入幻灯片时使用sourceUrl而不是 contentUrl?如何使用 Google 应用脚本复制与文件选择器相同的插入语句和文件引用?

4

3 回答 3

0

我发现(在 Python 中)根据驱动器中更新源图像的 SAME source_url 进行 content_url 更新的唯一方法是使用 access_token 重新生成 source_url

img_url = '%s&access_token=%s' % (
    DRIVE.files().get_media(fileId=rsp['id']).uri, creds.access_token) 

http://wescpy.blogspot.com/search/label/API

阅读博客了解更多详情。

一旦您设法获取新网址,您可以使用替换图像请求对其进行更新

https://developers.google.com/slides/reference/rest/v1/presentations/request#ReplaceImageRequest

于 2019-01-09T17:23:52.570 回答
0

所以我做的另一件事是使用“.replace”将 blob 替换为新的 URL。

    function rePlace(){
    var IdBox = SlidesApp.getActivePresentation().getSlides()[0].getImages();
    //var L_nk = IdBox[1].
    IdBox[1].select();         
    var userProperties = PropertiesService.getUserProperties();
    var loopCounter = Number(userProperties.getProperty('loopCounter'));       
    IdBox[1].replace("your URL")
    } 
于 2018-07-30T22:50:04.550 回答
0

我已使用此脚本更新一张幻灯片上的所有图像。我目前正在考虑在用户通过 Google 表单加载图像时自动执行此功能。也许这可以帮助您解决问题。

/////////////////////////////////////////

var deck = SlidesApp.getActivePresentation()
var slide = deck.appendSlide(SlidesApp.PredefinedLayout.BLANK)
function main() {
var folder = DriveApp.getFolderById('your folder id goes here'); // Change the folder  
ID  here
var files = folder.getFiles();
while (files.hasNext()) {
var file = files.next();
Logger.log(file.getName());
var imageUrl = DriveApp.getFileById(file.getId()).getDownloadUrl() + "&access_token=" 
+ ScriptApp.getOAuthToken();
Logger.log(DriveApp.getFileById(file.getId()).getDownloadUrl() + "&access_token=" + 
ScriptApp.getOAuthToken()); 
var image = slide.insertImage(imageUrl);
}}
////////////////////////////////////

问候卢克

于 2018-07-20T21:52:52.767 回答