見出し画像

【GAS】Google Apps Script 活用事例 ファイル名が連番の画像を、順序通りスライドに一括挿入するスクリプト

こちらの記事がとても参考になりました。

こちらの記事で紹介されているスクリプトに少し手を入れて、
下記のようにドライブに保存されている画像を1, 2, 3, 4と昇順で挿入するスクリプトを書いてみました。

スクリーンショット 2022-04-07 19.32.55

ちなみにファイル名の連番は、I love PDFというPDFからJPGに変換してくれるサービスの利用時に割り当てられたものです。リネームにスクリプトを使用していません。

しかし、while文を使うと順不同で画像が挿入されてしまう.....。
そこで、一旦ファイルIDを配列に保存し、2次元配列をsortして昇順に並び変える。そしてmapでファイルIDを一つずつ取り出して、画像を挿入します。

スクリーンショット 2022-04-07 20.08.33

スクリプトはこんな感じです。

function myFunction() {
 const folder = DriveApp.getFolderById('***************');
 const files  = folder.getFiles();
 const values = [];

 let count  = 0;
 let string = '';

 while(files.hasNext()){
   const file = files.next();
   if(file.getMimeType().match(/^image\/(?:jpeg|gif|png)$/i)) {
     values.push([file.getName(), file.getId()]);
     count  += 1;
   }
 }

 //連番通りにファイルIDを格納した2次元配列を作成する。
 values.sort(compareValues_);
 console.log(values);


//['fileName', 'fileId']
//row[1] fileIdのみを取り出す
 const presentation = SlidesApp.getActivePresentation(); 
 values.map(row => addImageSlide_(presentation, DriveApp.getFileById(row[1]).getBlob()));

 //挿入件数を表示させる
 string += `<p>画像 ${count} 件を、挿入しました。</p>`;

 console.log(string);
 console.log(`${count} 件`);

 const html = HtmlService.createHtmlOutput(string)
 .setWidth(450)
 .setHeight(300);

 SlidesApp.getUi().showModelessDialog(html, 'htmlを表示するよ');

}



/**
* 2次元配列をsortする
* 
*/
function compareValues_(a, b) {
 return a < b ? -1:1;
}



/**
* 1スライドにつき1枚の画像を挿入する。
* @param {object} presentation
* @param {object} image
* 
*/
function addImageSlide_(presentation, imageBlob) {
 const slide       = presentation.appendSlide(SlidesApp.PredefinedLayout.BLANK);
 const image       = slide.insertImage(imageBlob);

 const imageWidth  = image.getWidth();
 const imageHeight = image.getHeight();
 const pageWidth   = presentation.getPageWidth();
 const pageHeight  = presentation.getPageHeight();

 const newX = (pageWidth / 2) - (imageWidth / 2);
 const newY = (pageHeight / 2) - (imageHeight / 2);
 image.setLeft(newX).setTop(newY); //画像中央揃え
}

下記の三項演算子は、説明出来るほど理解して使用しているわけではないので、週末などに空き時間を使って、勉強しようかなと思っています。

function compareValues_(a, b) {
 return a < b ? -1:1;
}

こんな記事も書いています。


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