3
1

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 1 year has passed since last update.

【GAS】複数ファイルに分散したスライドを1つのファイルに自動でまとめる

Last updated at Posted at 2021-12-29

実施した環境:MacOS Big sur, Google Chrome 96.0.4664.11
実施日:2021/12/29

概略

複数のスライドを確認する際に、1つ1つファイルを開いて中身を確認するのは面倒です。 Google slideの標準機能に「インポート」は存在するが、1つのファイルしか選択ができません(執筆時点)。 そのため、確認したいスライドのファイルが20個ある場合、標準機能ではすべてのファイルを開くかインポートを手作業で20回繰り返すしかないです。 その作業を省くためのGASを作成しました。以下、概略図です。

1つのファイルへ.jpg

フォルダAには複数のスライドファイルがあります。これから紹介するGASのコードで自動変換することで、フォルダBに1つにまとめたファイルを生成します。なお、フォルダAにはスライド以外のスプレッドシート等のファイルがあっても問題ありません。スライドのファイルだけを抽出して処理を行います。また、フォルダAのスライドはコピーで1つのファイルにインポートするので、元ファイルは残ります。

各自で手入力しなければない値は、下記の3つ(概略図の青字部分)だけです。
・フォルダAのURL
・フォルダBのURL *フォルダAと同じURLでもOK
・生成するファイルの名前

使用シーン

複数ファイルのスライドを1ファイルで一気に見たい時にこのGASが有効です。 Google for educationを使用している場合は、classroomで収集した生徒のスライドを1つにまとめることもできます。そうすることで、先生が一度にすべての生徒の提出物を確認できるます。また各生徒に写真をスライドに貼って提出させ、1ファイルにまとめればクラスの写真集を作成することもできます。

コード

```Javascript function folderToslides() { //手入力する設定値 const slidesFolderURL = 'https://drive.google.com/xxxxxxxx'; //フォルダAのURL const destinationFolderURL = 'https://drive.google.com/yyyyyyyyyy'; //フォルダBのURL const fileTitle = '〇〇集'; //生成するファイル名

//スライドが集められているフォルダAから、スライドのファイルだけ抽出
const slidesFolderArray = slidesFolderURL.split('/');
const slidesFolderId = slidesFolderArray[slidesFolderArray.length-1];
const slidesFolder = DriveApp.getFolderById(slidesFolderId);
const subSlides = slidesFolder.getFilesByType(MimeType.GOOGLE_SLIDES);

//雛形となるファイル(スライド)を作成し、格納先フォルダBへ移動
const tempSlideId = SlidesApp.create(fileTitle).getId();
const tempSlideDrive = DriveApp.getFileById(tempSlideId);
const destinationFolderArray = destinationFolderURL.split('/');
const destinationFolderId = destinationFolderArray[destinationFolderArray.length-1];
const destinationFolder = DriveApp.getFolderById(destinationFolderId);
tempSlideDrive.moveTo(destinationFolder);

//デフォルトのスライドが残らないように1枚目を削除
const slideFile = SlidesApp.openById(tempSlideId);
slideFile.getSlides()[0].remove();

//複数のスライドを雛形のファイルにインポートする
while (subSlides.hasNext()){
const file = subSlides.next();
var slideUrl = file.getUrl();
var insertPre = SlidesApp.openByUrl(slideUrl);
var slideData = insertPre.getSlides();
for(var i=0;i<slideData.length;i++){
var template = insertPre.getSlides()[i];
slideFile.appendSlide(template);
}
}
}


<h2>コードの解説</h2>
コード内のコメントで内容がわかる部分については割愛します。
<h4>スライドのファイルを抽出</h4>

```Javascript
  //スライドが集められているフォルダAから、スライドのファイルだけ抽出
  const slidesFolderArray = slidesFolderURL.split('/');
  const slidesFolderId = slidesFolderArray[slidesFolderArray.length-1];
  const slidesFolder = DriveApp.getFolderById(slidesFolderId);
  const subSlides = slidesFolder.getFilesByType(MimeType.GOOGLE_SLIDES);

splitを使用して、手入力で設定したフォルダAのURLからIDだけを取得します。
取得したIDをもとに、フォルダAのスライドファイルだけをGETします。

雛形スライドの作成と移動

  //雛形となるファイル(スライド)を作成し、格納先フォルダBへ移動
  const tempSlideId = SlidesApp.create(fileTitle).getId();
  const tempSlideDrive = DriveApp.getFileById(tempSlideId);
  const destinationFolderArray = destinationFolderURL.split('/');
  const destinationFolderId = destinationFolderArray[destinationFolderArray.length-1];
  const destinationFolder = DriveApp.getFolderById(destinationFolderId);
  tempSlideDrive.moveTo(destinationFolder);

複数のスライドを1つにまとめる雛形のファイルを作成します。
雛形ファイルを作成した後、手入力したフォルダBのURLをもとに、こちらでもsplitを使用してIDを取得します。
取得したIDをもとに、雛形ファイルをフォルダBのへ移動させます。

雛形ファイルにあるスライドを削除

  //デフォルトのスライドが残らないように1枚目を削除
  const slideFile = SlidesApp.openById(tempSlideId);
  slideFile.getSlides()[0].remove();

スライドを新規作成すると、1枚目にデフォルトのスライドが挿入されている。
このまま複数のスライドを雛形ファイルにインポートすると、デフォルトで作成されるスライドが混入してしまう。
デフォルト設定の変更方法がわからなかったので、ここでは事前に雛形ファイルの1枚目を削除しています。

while文とfor文の内容

  //複数のスライドを雛形のファイルにインポートする
  while (subSlides.hasNext()){
    const file = subSlides.next();
    var slideUrl = file.getUrl();
    var insertPre = SlidesApp.openByUrl(slideUrl);
    var slideData = insertPre.getSlides();
      for(var i=0;i<slideData.length;i++){
        var template = insertPre.getSlides()[i];
        slideFile.appendSlide(template);
      }
  }

while文では、フォルダAにあるスライドファイルを1つずつ確認しています。hasNextやsubSlides.next()の使い方については、「フォルダコレクションの取得」で検索すれば調べることができます。要はフォルダ内のファイルを順番に取り出すときに使用する反復処理です。
For文では、対象ファイル内にあるスライドを1つずつ取り出し、雛形ファイルへインポートしています。

実例

たとえば、生徒に好きな食べ物を提出してもらうとしましょう。スライドに料理の写真をつけて提出させます。以下のように、Googleドライブにファイルが集まっています。3ファイルがあります。このフォルダがフォルダAとなります。 ちなみに3ファイルには、それぞれタイトルが書かれたスライドと料理写真が貼られたスライドの2スライドが作成されています。 ![スクリーンショット 2021-12-29 17.14.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353945/527beaf7-c27c-30c5-42ca-59735e1c8000.png)

上記のGASを使用します。ファイル名は「1年1組の提出物」にしました。
下の画像がフォルダBに作成されたファイルです。

スクリーンショット 2021-12-29 17.20.44.png

ファイルの中を確認してみます。「やきそば」「ピッツァ」「そうめん」の3ファイルがインポートされているのがわかります。
これで生徒の提出物を順番に確認することができます。また、複数のファイルを1つずつ開く必要もありません。

スクリーンショット 2021-12-29 17.25.09.png

備考

今回は2つのURLとファイル名を手入力でスクリプトに直接入力する想定でした。操作ミスや保守のことを考えると、スプレッドシートにバインドさせる形で実装し、設定値はスプレッドシートから取得するのがよろしいかと思います。
3
1
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?