Search code examples
google-apps-scriptgoogle-slides-apigoogle-slides

Google Suite - Apps Script - Download Slides as PNG files via API


Good Morning All. I have written a short script which batch-creates [single page] Google Slides based on rows from a spreadsheet. While in the loop for each creation, I would like to create a PNG of the Slide in Google Drive (or download on the user's desktop). These pictures should be the same specs as if a user clicked File>Download>PNG - the heavy small text requires full projector HD - so I don't believe I can use the "Thumbnail" function which appears limited to 1600 pixels.

My code below generates the error "Converting from text/html to image/png is not supported" - so I'm not sure if this is a limitation of the API or a problem with my coding. Thank you in advance.

  var options =
     {
       "contentType" : "image/PNG"
     };
  var url = 'https://docs.google.com/presentation/d/' + presentationCopyId + '/export/PNG';
  var response = UrlFetchApp.fetch(url, options);
  var image = response.getAs(MimeType.PNG);
  image.setName(SlideName);
  DriveApp.createFile(image);  

Solution

  • Yes, It is possible.

    You can use Google slide API and make a PNG file of every page of Google slide.

    Here is the code, BUT first you have to enable API as following

    1. open script editor
    2. click on resources-> Advanced Google Services
    3. Enable Google slide API and Drive API .
    4. click on ok

    now copy and paste this code, and write your slide ID in presentationID.

    function generateScreenshots() {
      
      var presentationId = "***ADD YOUR Google Slide ID Only***";
      var presentation = SlidesApp.openById(presentationId);
      var baseUrl =
        "https://slides.googleapis.com/v1/presentations/{presentationId}/pages/{pageObjectId}/thumbnail";
      var parameters = {
        method: "GET",
        headers: { Authorization: "Bearer " + ScriptApp.getOAuthToken() },
        contentType: "application/json",
        muteHttpExceptions: true
      };
    
      // Log URL of the main thumbnail of the deck
      Logger.log(Drive.Files.get(presentationId).thumbnailLink);
    
      // For storing the screenshot image URLs
      var screenshots = [];
    
      var slides = presentation.getSlides().forEach(function(slide, index) {
        var url = baseUrl
          .replace("{presentationId}", presentationId)
          .replace("{pageObjectId}", slide.getObjectId());
        var response = JSON.parse(UrlFetchApp.fetch(url, parameters));
    
        // Upload Googel Slide image to Google Drive
        var blob = UrlFetchApp.fetch(response.contentUrl).getBlob();
        DriveApp.createFile(blob).setName("Image " + (index + 1) + ".png");
    
        screenshots.push(response.contentUrl);
      });
    
      return screenshots;
    }