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);
}
}
}
}
}
ベストプラクティスではないとおもいますが、備忘録として置いておく。