Google Drive フォルダ内の画像集を Google Slides に挿入する Google App Script

# はじめに

1. 資料提供のない Webinar や 研修の録画を見ながら、macOS スクリーンショットを取得

   >  [Macのスクリーンショットの保存先が不明なときの調べ方 | Macのアンチョコ](https://yama-mac.com/screenshot_location_unknown/)

2. `~/Google\ Drive/My\ Drive/Destination_Folder/` に保存

3. Google Drive フォルダにあるスクリーンショット画像集を Google Slides に挿入したい **<-- イマココ**

# Google App Script による自動挿入

1.  Google Slides を新規作成

2. Tools > Script editor から `Code.gs` に以下のスクリプトを貼り付け、保存して、`onOpen` 関数を実行 --> パーミッションを確認して承認

3. insertImageFromDrive > ドライブフォルダからイメージを新スライドとして挿入、を実行
   ![image-20221020235808405](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20221020235808405.png)

4. Google Drive フォルダの ID を入力して OK する
   （`https://drive.google.com/drive/folders/XXXXX` の `XXXXX` 部分）

   ![image-20221020235915704](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20221020235915704.png)

```javascript:Code.gs
function onOpen() {
SlidesApp.getUi()
.createMenu('insertImageFromDrive') // メニューの追加、（セルを結合した表が一つでもあると、処理が行われません。）
.addItem('ドライブフォルダからイメージを新スライドとして挿入','insertImageFromDrive')
.addToUi();
}

function insertImageFromDrive() {

  // Load the Google Slides presentation.
  var presentation  = SlidesApp.getActivePresentation();

  // Get Drive Folder Id from prompt
  const ui            = SlidesApp.getUi();
  const response      = ui.prompt(
    'フォルダ ID 入力',
    '挿入したいイメージがあるフォルダ ID を入力してください。',
    ui.ButtonSet.OK_CANCEL
  )

  let DRIVE_FOLDER_ID = response.getResponseText();

  switch(response.getSelectedButton()){
    case ui.Button.OK:
      console.log('フォルダ ID は、%s です。', DRIVE_FOLDER_ID);
      break;
  
    case ui.Button.CANCEL:
      console.log('キャンセルが押されたため、処理を中断しました。');
      break;
      
    case ui.Button.CLOSE:
      console.log('閉じるボタンが押されました。');
  }

  // Load the folder from Google Drive
  console.log(DriveApp.getFolderById(DRIVE_FOLDER_ID).getName());
  var files = DriveApp.getFolderById(DRIVE_FOLDER_ID).getFiles();
  while (files.hasNext()) {
    var file = files.next();
    var fileId = file.getId();
    // console.log(file.getName())
    var image = DriveApp.getFileById(fileId)
    // console.log(image)
    presentation.appendSlide(SlidesApp.PredefinedLayout.BLANK).insertImage(image);
  }
  reverseOrderAllSlides();
}

function reverseOrderAllSlides() {
  presentation  = SlidesApp.getActivePresentation()
  allSlides = presentation.getSlides();
  var len = presentation.getSlides().length
  console.log(len)
  for (var k = len - 1; k >= 0; k--) {
      allSlides[k].move(len - k);
  }
}
```

# 感想

スクリプト自体は複雑ではないですが、`files = DriveApp.getFolderById(DRIVE_FOLDER_ID).getFiles()` で取得されるファイルは日付が新しい順になっている（？）ようなので、最後にスライド順を逆に並べ替える処理を入れました。
すると、思った通りの挙動にできました。

スクリーンショットによる手順書を作成する際にも活用できると思います。

試しに 80 枚程度の画像に対して動作させた場合、1分くらいかかったかなと思うのでスクリプト実行完了までは待ちましょう。

これで動画をスライドに落とし込んで、自分の復習用に後で見直せるので色々はかどります。

以上。

# 参考

- [Insert images from Google Drive into Google Slides using Apps Script](https://spreadsheet.dev/insert-images-from-google-drive-into-google-slides-using-apps-script)
- [Google Apps Scriptでドライブのフォルダやファイルを取得してみる | 初心者でもわかるGoogle Apps Script活用のススメ](https://for-dummies.net/gas-noobs/how-to-get-files-and-folders-in-drives-by-gas/#getFiles)
- [Google Slides を翻訳する Google App Script - Qiita](https://qiita.com/khayama/items/e3b3b84d7c643a79b303)
- [I need to reverse the selected slide order using Google Apps script - Stack Overflow](https://stackoverflow.com/questions/64021799/i-need-to-reverse-the-selected-slide-order-using-google-apps-script)
- [Google Developers Japan: Apps Script を使ってイメージから Google スライドを生成する](https://developers-jp.googleblog.com/2017/10/generating-google-slides-from-images.html)