見出し画像

【GAS】Google Apps Script 活用事例 Google Slidesの全てのスライドをJPGに変換するスクリプト

【GAS】Google Apps Script 活用事例 Google Slidesの各スライドをイメージ画像に変換しようとしたら、出来なかった話。

2020/11/13 エントリー当初は、上記タイトルだったものを、リライトしました。この場を借りて、きぬあささん、たらこさんにお礼申し上げます。

スプレッドシートにスライドのスクリーンショットを追加してくださいと、実務で依頼され、GASで書いてみました。当初はうまく出来なくて、手動でやりました。

手動だと、1枚ずつであれば出来る。

スクリーンショット_2020-08-18_9_39_47

スクリプトは、こんな感じ

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の画像が下記フォルダに保存されました。');
}

スクリーンショット 2020-11-14 10.26.58

createPresentationFileを実行すると、下記のようなメッセージが表示されます。クリックすると、JPGが保存されているフォルダに直接アクセスすることが出来ます。探す時間を減らすということも自動化・効率化において、重要だと考えています。

スクリーンショット 2020-11-14 10.29.32

UrlFetchApp.fetch(url, options); は、一定期間に大量に行うとリクエストのし過ぎです。みたいなエラーが出る事があります。その場合は、for ofの部分を少し変えてみてください。

肝心の画像は、やや画素が粗い

iPhoneなどスマホで撮影した画像は、大体4MBくらいに対して、Slidesを書き出した際の画像は、40KB。1MBが1000KBなので、約 1/100のサイズなので、荒くて当たり前か.....。

スクリーンショット 2020-11-14 10.46.51

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の倍数になると処理が休止されます。

きぬあささんに助言を頂きました。

たらこさんに、Google Slides全ページをJPGに変換するスクリプトを書いて頂きました。

今回は書いて頂いた、こちらの記事をベースに、痒いところに手が届くスクリプトに編集した感じです。

久しぶりにHTML書いたら、ほとんど忘れていました。

Google Slidesを一瞬で英語訳するスクリプト

スプレッドシートをPDFに変換するスクリプト

GoogleドキュメントをPDFに変換するスクリプト


この記事が気に入ったらサポートをしてみませんか?