Teche Note
721 文字
4 分
Google Sheetに画像を自動で一括挿入
2021-08-12

久しぶりの投稿です。 今回は、Google Sheetに画像を自動挿入する方法がネットにあんまりなかったのでシェアしておきます。

やりたいこと#

Google Sheetには画像を挿入する機能があります。 公式ドキュメントはこちら

普通にやろうとすると1つ1つのセルをちまちま選択して『挿入 > 画像を挿入 > …』を繰り返す必要があります。画像が多い場合は辛くて無理です。

一括挿入する方法としては、IMAGE関数を使ってまとめて処理することが選択肢になります。共有リンクを取得し、一部リンクを書き換えることで挿入可能になるようです。

参考記事

参考までですが、共有リンクをまとめて取得する方法はこちらをご参考ください

が、画像の枚数が多いと表示が遅いケースがありました。 そこで今回は、画像をまとめて挿入するスクリプトを書いたので共有します。

やったこと#

Step1. 画像とスプレッドシートの準備#

GoogleDriveのどこかのフォルダで

folderA - 画像を挿入したいスプレッドシート
        |
        |- folderB -- 画像1
                   |- 画像2
                   |- 画像3
                   |- ...

のように配置します。配置したら、folderBのフォルダIDをコピーしましょう。

Step2. スクリプトエディタでコード.gsを編集#

次の通り。これをこちらのブログを参考にしてスクリプトエディタから起動すれば自動挿入されます。


function insertImages() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
 // 選択中のシートに挿入される。必要ならシートIDを使って別途選択する
  const sh = ss.getActiveSheet();
 // Step1でコピーしたフォルダIDを貼り付け
  const folder = DriveApp.getFolderById("xxxxxxxxx");

  const folderFiles = folder.getFiles();
  // ファイル名でソート
  const sortedFiles = getSortedFiles(folderFiles);

  // 3列目に挿入する
  const colToInsert = 3;
  var rowCount = 2;
  for(let file of sortedFiles) {
    const fileName = file.getName();
    Logger.log(fileName);
    const fileId = file.getId();

    const obj = Drive.Files.get(fileId);
    const thumbnail = obj.thumbnailLink;
    //縦横比は3:4 or 4:3で想定。あまり正確ではない場合が多い
    //真面目にやるなら比率計算
    if (obj.imageMediaMetadata.width >= obj.imageMediaMetadata.height) {
      sh.insertImage(thumbnail, colToInsert, rowCount).setHeight(150).setWidth(200);
    } else if (obj.imageMediaMetadata.width === obj.imageMediaMetadata.height) {
      sh.insertImage(thumbnail, colToInsert, rowCount).setHeight(150).setWidth(150);
    } else {
      sh.insertImage(thumbnail, 3, rowCount).setHeight(150).setWidth(113);
    }
    rowCount = rowCount + 1;
  }
}

function getSortedFiles(folderFiles) {
  var sortedFiles = [];
  while(folderFiles.hasNext()) {
    var file = folderFiles.next();
    sortedFiles.push(file);
  }

  sortedFiles.sort(function(a,b){
    if(a.getName() < b.getName()) return -1;
    if(a.getName() > b.getName()) return 1;
    return 0;
  });
  return sortedFiles;
}

実行時に権限要求されますがよしなに許可。

実行するとファイル名が表示され、順次フォルダ内の画像がシートに挿入されていきます。

挿入には少しラグがありますが、リロードするとちゃんと表示されます。

これでいろいろ捗ることもあるんじゃないでしょうか! 終!

その他参考URL#