Обновлять изображение в Google Slides, когда изображение обновляется на Google Диске

Моя цель - автоматизировать создание и обновление презентации Google Slides на основе изображений в папке:

Текущий рабочий процесс, который работает правильно, но который я хочу автоматизировать, выглядит следующим образом:

  1. Изображения находятся в папке на Google Диске
  2. Я вручную добавляю изображения на каждый слайд с помощью меню выбора файлов (Вставка -> Изображение -> Диск).
  3. Изображения в папке периодически обновляются внешним сценарием, заменяя предыдущие изображения с тем же именем файла. Изображения сохраняют тот же идентификатор файла на Google Диске.
  4. Изображения в слайдах обновляются автоматически, и изменения видны при перезагрузке презентации слайдов в браузере.

Чего я пытаюсь достичь:

Вместо создания слайдов и вставки изображений с помощью средства выбора файлов по одному используйте сценарий, который создает презентацию на основе файлов изображений в папке на Диске.

Я использовал Учебник на страницах разработчиков Google и создал Слайды работают нормально. Однако, в отличие от ручной вставки, изображения на слайдах, созданных сценарием, не обновляются. Скрипт выбирает изображения только один раз и, кажется, использует «копию изображений».

Мой тестовый код:

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, который остается неизменным, и таким образом обновляет изображение при обновлении файла на Диске. При использовании 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 при вставке слайдов? Как я могу воспроизвести тот же оператор Insert и ссылку на файл, что и средство выбора файлов, с помощью скрипта приложения Google?


person Core Tek    schedule 18.02.2018    source источник
comment
Здравствуйте, Вы нашли приемлемое решение этой проблемы? Я сталкиваюсь с тем же; Но я готов нажать на кнопку, чтобы запустить процесс обновления слайда. Спасибо   -  person Fabrice    schedule 28.02.2020


Ответы (3)


Я использовал этот скрипт для обновления всех изображений на одном слайде. В настоящее время я ищу автоматизацию этой функции, когда пользователь загружает изображения через форму 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);
}}
////////////////////////////////////

С уважением, Люк

person lukeo25    schedule 20.07.2018

Итак, я сделал еще одну вещь - использовал ".replace" для замены большого двоичного объекта на новый 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")
    } 
person lukeo25    schedule 30.07.2018

Единственный способ, который я нашел (в Python), чтобы сделать базу обновления content_url на ТАКОМ ИСТОЧНИКЕ source_url, где исходное изображение обновляется на диске, - это регенерировать source_url с помощью access_token.

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

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

Подробнее читайте в блоге.

Как только вам удастся получить новый URL-адрес, вы можете обновить его, запросив замену изображения.

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

person the pillow    schedule 09.01.2019