4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

フォルダ内のGoogleスライドを一括でPNG化

Last updated at Posted at 2021-10-19

GoogleSlidesのPNG化が地味にめんどくさかったのでGASで自動化してみた

Googleスライドは1ページずつしかPNG化できずめんどくさかったので連番で出力しフォルダ格納までを自動化した。

いままでどうしていたのか

10p以上のスライドを一枚ずつPNG化、それを数ファイルするとなると、かなりめんどくさかった。
さすがに1ページずつはだるかったので、1ファイルずつPDFで出力⇒AcrobatでPNG化⇒バッチ処理で名前変更していたが、まぁまぁめんどくさかった。
またこの場合、PNGに不具合があった場合どこの手順(スライド⇒PDF)かPDF⇒PNG)かがわからず困ることもあった。

引っかかったポイント

  • PNG化のメソッドが存在しない
    GoogleDevelopersを漁ったが見当たらなかった。
    コンバート処理とかあればいいのにー。
    GUIでファイル⇒ダウンロード⇒PNG形式を選択するようなかたちで解決した。
    また、この方法の場合は1ページずつの処理になるので前ページ出力できるようにした。

参考
https://www.ka-net.org/blog/?p=12905

  • 大量のスライドにスクリプトを貼るのがめんどう

全ページ出力のスクリプトを書いて満足しつつあったが、そのスクリプトを1ファイルずつ書いたり、ライブラリから引っ張ってくるのがめんどうだった。
そのため、フォルダ内のすべてのスライドに処理ができるようにした。

  • スライドデータショートカットがショートカットになっている
    スライドデータショートカットがショートカットになっている場合はgetFilesByType(MimeType.GOOGLE_SLIDES) ではなく
    getFilesByType(MimeType.SHORTCUT) でショートカットのID
    IDを取得した後に id.getTargetID で本体のIDを取得必要がある。

参考
https://developers.google.com/apps-script/reference/drive/file?hl=en

書いたコード


function slides2Png() {

  let folder = DriveApp.getFolderById("folderID"); //スライドを格納しているフォルダIDを指定
  let files = folder.getFilesByType(MimeType.GOOGLE_SLIDES); ///ショートカットの場合はMimeTypeをSHORTCUTにする  スライドの場合はGOOGLE_SLIDES

  while (files.hasNext()) {

    let file = files.next();
    let id = file.getId();
    //この下はショートカットの場合元ファイルIDを取得する分岐をいれている
    const targetId = file.getTargetId();
    if (targetId != null) {
      id = targetId;
      const presentation = SlidesApp.openById(id);
      const slides = presentation.getSlides(); //スライド枚数
      const presentationId = presentation.getId();
      const fileName = presentation.getName();

      const format = 'png'; //出力形式
      const pngName = fileName.replace(/(^\d{1,3}_)(.*)(_.*$)/, "$2"); //元ファイル名から正規表現で変換

      let parentFolder = DriveApp.createFolder(pngName); //格納するフォルダ名を指定(今回はマイドライブ上に作成)

      let slidesNumber = 1; //スライドPNGに連番をつけるためにslidesNumberをつけておく

      for (const slide of slides) {
        const page_id = slide.getObjectId();
        const file = convertPresentation(presentationId, page_id, format, slidesNumber, pngName, parentFolder);
        slidesNumber += 1;

      }
    }

    function convertPresentation(presentation_id, page_id, format, slidesNumber, pngName, parentFolder) {
      const url = "https://docs.google.com/presentation/d/" + presentation_id + "/export/" + format + "?id=" + presentation_id + "&pageid=" + page_id;
      const options = {
        method: "get",
        headers: { "Authorization": "Bearer " + ScriptApp.getOAuthToken() },
        muteHttpExceptions: true
      };

      const response = UrlFetchApp.fetch(url, options);
      if (response.getResponseCode() === 200) {
        //連番がすべて2桁で出力されるように分岐
        if (slidesNumber < 10) {
          return parentFolder.createFile(response.getBlob()).setName(pngName + "_0" + slidesNumber + "." + format);
        } else {
          return parentFolder.createFile(response.getBlob()).setName(pngName + "_" + slidesNumber + "." + format);
        }
      }
    }
  }
}

ベストプラクティスではないとおもいますが、備忘録として置いておく。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?