![見出し画像](https://assets.st-note.com/production/uploads/images/33042971/rectangle_large_type_2_de181eb03f7aa31f65c2915c09ff0c78.jpg?width=800)
【GAS】Google Apps Script 活用事例 Google Slidesの全てのスライドをJPGに変換するスクリプト
【GAS】Google Apps Script 活用事例 Google Slidesの各スライドをイメージ画像に変換しようとしたら、出来なかった話。
2020/11/13 エントリー当初は、上記タイトルだったものを、リライトしました。この場を借りて、きぬあささん、たらこさんにお礼申し上げます。
スプレッドシートにスライドのスクリーンショットを追加してくださいと、実務で依頼され、GASで書いてみました。当初はうまく出来なくて、手動でやりました。
手動だと、1枚ずつであれば出来る。
スクリプトは、こんな感じ
function onOpen() {
SlidesApp.getUi()
.createMenu('追加メニュー')
.addItem('Slidesを全てJPGとして書き出す', 'createPresentationFile')
.addToUi();
}
function createPresentationFile() {
const presentation = SlidesApp.getActivePresentation();
const slides = presentation.getSlides();
const presentationId = presentation.getId();
const fileName = presentation.getName();
const format = 'jpg';
console.log(presentation.getName());
console.log(presentationId);
console.log(`スライドの枚数: ${slides.length}`);
let slidesNumber = 1;
for(const slide of slides){
const page_id = slide.getObjectId();
const file = convertPresentation_(presentationId, page_id,format, slidesNumber);
slidesNumber += 1;
}//for
//JPG書き出しが終了したら、ダイアログが表示される。
showDialog_();
}//end
function convertPresentation_(presentation_id, page_id, format, slidesNumber) {
format = format.toLowerCase();
let ext = format;//ファイル名の拡張子
switch (format) {
case "pptx":
case "odp":
case "pdf":
case "txt":
case "png":
case "svg":
break;
case "jpg":
case "jpeg":
format = "jpeg";
ext = "jpg";
break;
default:
format = "pptx";
ext = "pptx"
break;
}
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) {
//フォルダIDを入れる https://drive.google.com/drive/folders/この部分がフォルダID
const folder = DriveApp.getFolderById("***************");
const presentaion = SlidesApp.openById(presentation_id);
return folder.createFile(response.getBlob()).setName(presentaion.getName() + '_' + slidesNumber + '.' + ext);
}//if
}//end
function showDialog_() {
const ui = SlidesApp.getUi();
//フォルダIDを入れる
const url = "https://drive.google.com/drive/folders/***************";
const html = HtmlService
.createHtmlOutput(
`<p><a href=${url} target="_blank">Google Driveのフォルダはこちら</a></p>`
)
.setWidth(300)
.setHeight(300);
ui.showModelessDialog(html, 'Slideの画像が下記フォルダに保存されました。');
}
createPresentationFileを実行すると、下記のようなメッセージが表示されます。クリックすると、JPGが保存されているフォルダに直接アクセスすることが出来ます。探す時間を減らすということも自動化・効率化において、重要だと考えています。
UrlFetchApp.fetch(url, options); は、一定期間に大量に行うとリクエストのし過ぎです。みたいなエラーが出る事があります。その場合は、for ofの部分を少し変えてみてください。
肝心の画像は、やや画素が粗い
iPhoneなどスマホで撮影した画像は、大体4MBくらいに対して、Slidesを書き出した際の画像は、40KB。1MBが1000KBなので、約 1/100のサイズなので、荒くて当たり前か.....。
noteのコーデエディタはインデントがズレる事があり、スペースで調整しています。......すみません。お手持ちのエディタで直してください。
for(const slide of slides){
const page_id = slide.getObjectId();
const file = convertPresentation_(presentationId, page_id,format, slidesNumber);
slidesNumber += 1;
}//for
for(const slide of slides){
//短期間に7回以上連続でリクエストすると、エラーになるため、7回おきに、10秒処理を休止する。
if(slidesNumber%7 === 0){
Utilities.sleep(10000);
const page_id = slide.getObjectId();
const file = convertPresentation_(presentationId, page_id,format, slidesNumber);
slidesNumber += 1;
}
else if(slideNumber%7 !== 0){
const page_id = slide.getObjectId();
const file = convertPresentation_(presentationId, page_id,format, slidesNumber);
slidesNumber += 1;
}
}//for
上記の例でいうと、Slidesの7枚目、14枚目......7の倍数になると処理が休止されます。
きぬあささんに助言を頂きました。
はじめまして。
— きぬあさ (@kinuasa) August 24, 2020
スライドの他形式への変換は、JPEG含めて下記記事のような形で実行できませんでしょうか?
(叩くURLに違いがあります)https://t.co/ygWxAbbVlt
portrait等のパラメーターは試したことがないのですが…💦
GASで検索したらたまたま見かけましたので、コメントさせていただきました🙇♂️
たらこさんに、Google Slides全ページをJPGに変換するスクリプトを書いて頂きました。
今回は書いて頂いた、こちらの記事をベースに、痒いところに手が届くスクリプトに編集した感じです。
久しぶりにHTML書いたら、ほとんど忘れていました。
Google Slidesを一瞬で英語訳するスクリプト
スプレッドシートをPDFに変換するスクリプト
GoogleドキュメントをPDFに変換するスクリプト
この記事が気に入ったらサポートをしてみませんか?