在Google云端硬盘中更新图片时更新Google幻灯片中的图片

时间:2018-02-18 11:51:52

标签: google-apps-script google-drive-api google-slides-api google-slides

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

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

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

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

    我使用了Tutorial on the 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​​ - 也测试过)时,Image似乎使用了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
            }
          }
        }
      ]
    }
    

    reference of the API中未记录sourceUrl。

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

3 个答案:

答案 0 :(得分: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);
}}
////////////////////////////////////

问候 卢克

答案 1 :(得分: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")
    } 

答案 2 :(得分: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