⚙️

Google Apps Script(GAS) で画像をリサイズする

2021/11/22に公開

はじめに

GAS で Google Drive 上の画像をリサイズする機会があったので、実装をメモ書きとして残しておきます。
今回こちらのライブラリを使用しました。

https://github.com/tanaikech/ImgApp

ライブラリの導入方法はREADMEをご覧ください。

リサイズの実装

Google Drive 上の画像サイズを直接書き換えることは出来ないので、リサイズされた画像を新規作成し保存します。

function doResize(fileId) {
  // 対象のファイルをリサイズ(width=40)
  const res = ImgApp.doResize(fileId, 40);

  // リサイズ後の画像を保存するフォルダを指定
  const folderId = "xxxx";
  const folder = DriveApp.getFolderById(folderId);

  // 画像ファイルを新規作成
  const uuid = Utilities.getUuid();
  const file = folder.createFile(res.blob.setName(uuid));
}

スプレッドシート上の画像をリサイズして置き換える例

GAS で画像をリサイズするユースケースとして、
「Google Form でアップロードされた画像のサイズを揃える」
という実装例を紹介します。

方針

Google Form でアップロードされた画像は Google Drive 上に保存され、その URL がセルの値として登録されます。

前述のように、Google Drive 上の画像サイズを直接書き換えることは出来ないので、リサイズされた画像の URL と元の URL を置き換えます。

実装

function parseQuery(url) {
  const query = url.split("?")[1];
  return query
    ? query.split("&").reduce((acc, item) => {
        const [key, value] = item.split("=");
        acc[key] = value;
        return acc;
      }, {})
    : {};
}

function getResizedFileId(fileId) {
  const res = ImgApp.doResize(fileId, 40);

  const folderId = "xxx";
  const folder = DriveApp.getFolderById(folderId);
  const uuid = Utilities.getUuid();
  const file = folder.createFile(res.blob.setName(uuid));

  return file.getId();
}

function doResize() {
  const SHEET_NAME = "sheet1";
  const COLUMN_NAME = "プロフィール画像";

  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
  const lastRow = sheet.getLastRow();
  const rows = sheet.getDataRange().getValues();
  const keys = rows.splice(0, 1)[0];

  const targetIdx = keys.indexOf(COLUMN_NAME) + 1;

  for (let i = 2; i <= lastRow; i++) {
    const cell = sheet.getRange(i, targetIdx);
    const value = cell.getValue();
    // Google Form回答でアップロードされた画像のurlの書式は https://drive.google.com/open?id=[id]
    const fileId = parseQuery(value)["id"];

    // リサイズした画像を生成
    const resizedFileId = getResizedFileId(fileId);
    const url = "https://drive.google.com/uc?id=" + resizedFileId;

    // スプレッドシートの値を書き換える
    cell.setValue(url);
  }
}

実行結果

  • 実行前

  • 実行後

Discussion