Недавно мне было поручено создать слайд-шоу из общей папки Google Диска, содержащей изображения нескольких разных форматов. Попробовав несколько надстроек для слайдов, я решил «укусить пулю» и написать скрипт приложений, что на самом деле оказалось не так сложно, как я предполагал. Скрипт, который прилагается ниже, работал правильно в течение нескольких дней, но теперь выдает следующую ошибку: Exception: Service Slides failed while accessing document with id [removed, but was the correct document ID]. at updateSlideshow(Update Slideshow:18:68)
.
Я провел небольшое исследование, и он не похож на эту конкретную ошибку очень распространено.
Несколько других примечаний, которые могут иметь отношение:
- Скрипт выполняется с привязкой к контейнеру к рассматриваемому документу Slides, который является слайд-шоу изображений.
- Скрипту требуется время для завершения (265 секунд при последнем успешном запуске).
Вот полный скрипт приложений:
function updateSlideshow() {
// Setup
var pres = SlidesApp.getActivePresentation();
var presWidth = pres.getPageWidth();
var presHeight = pres.getPageHeight();
// Clear everything
var slides = pres.getSlides()
while (slides.length > 0) {
slides.pop().remove();
};
// Add all images from Drive folder
var parentId = DriveApp.getFileById(pres.getId()).getParents().next().getId();
var srPicIter = DriveApp.searchFiles(
'(mimeType contains "png" or mimeType contains "jpg" or mimeType contains "jpeg" or mimeType contains "bmp") and "' + parentId + '" in parents');
while (srPicIter.hasNext()) {
var file = srPicIter.next();
// Place image on slide
var image = pres.appendSlide(SlidesApp.PredefinedLayout.BLANK).insertImage(file.getBlob());
// Determine fit-to-page scale ratio
if (image.getWidth()/image.getHeight() > presWidth/presHeight) {
// Image is wider than slide
var ratio = presWidth/image.getWidth();
} else {
// Image is taller than slide
var ratio = presHeight/image.getHeight();
};
// Apply scaling ratio and align center
image.scaleWidth(ratio).scaleHeight(ratio).alignOnPage(SlidesApp.AlignmentPosition.CENTER);
};
};