GASでGoogleドキュメント上の画像をGoogleドライブに一括で保存する方法

アイキャッチ_Googleドキュメントの画像を一括でGoogleドライブに保存する

Googleドキュメント上に挿入した画像を、Googleドライブに保存するGASコードを紹介します。

目次

概要

コードの概要は以下のとおりです

  • Googleドキュメントに紐づくコンテナバインド型のコードです
  • My Drive直下に新規フォルダが作成されます
  • 新規フォルダの名前は「yyyyMMdd_HHmmss_ドキュメント名」です
  • 新規フォルダの中にすべての画像が保存されます

使い方

STEP
Googleドキュメントの「拡張機能」をクリックする
STEP
「Apps Script」をクリックする
Googleドキュメントの拡張機能とAppsScriptボタン
STEP
書かれているコードを削除する
ScriptEditorの最初に書いてあるコードを削除する
STEP
次の項目で紹介するコードを貼り付ける
ScriptEditorにコードを貼り付けた様子
STEP
「保存」ボタンをクリックする
ScriptEditorの保存ボタン
STEP
「実行」をクリックする
ScriptEditorの実行ボタン
STEP
Googleの認証をする

Gooogleの認証を求めるウィンドウが出てきます。

以下のページの手順で認証をしてください。

STEP
もう一度「実行」ボタンをクリックする
STEP
GoogleドライブのMy Drive直下に新規フォルダが作成される

新規フォルダの名前は「yyyyMMdd_HHmmss_ドキュメント名」です。

例:20251218_1730_GASプログラム解説の下書き

STEP
新規フォルダ内に画像がすべて保存されている

Googleドキュメントの画像をすべてGoogleドライブに保存するGASコード

// Googleドキュメント上の画像をGooglドライブのルートフォルダに新規フォルダを作り保存する
const TIME_ZONE = 'JST';                              // 日本時間固定

const DATE_FORMAT = Object.freeze({
  FOLDER : 'yyyyMMdd_HHmmss',                         // フォルダ用
  FILE   : 'yyyyMMdd_HHmmss_SSS'                      // ファイル用
});

/**
 * アクティブなGoogleドキュメント内のすべての画像を
 * 実行者のGoogleドライブ直下に作成したフォルダへ保存する
 *
 * フォルダ名形式:
 * YYYYMMDD_HHmmss_ドキュメント名_画像
 *
 * 【コンテナバウンド前提】
 *
 * @returns {number} 保存した画像ファイル数
 */
function saveAllImagesFromActiveDocument() {
  try {
    const docActive         = DocumentApp.getActiveDocument();           // ドキュメント取得
    const body              = docActive.getBody();                       // 本文取得
    const strDocumentName   = docActive.getName();                       // ドキュメント名取得
    const folderDestination = createImageSaveFolder_(strDocumentName);   // 保存先フォルダ作成

    const numSavedImages =
      traverseElementAndSaveImages_(body, folderDestination);           // 画像保存処理

    console.log(`保存完了:${numSavedImages} 件`);
    console.log(`保存先フォルダ:${folderDestination.getUrl()}`);

    return numSavedImages;                                               // 保存数返却

  } catch (error) {
    console.error(`画像保存処理でエラー発生: ${error.stack}`);
    throw error;                                                         // 上位へ伝播
  }
}

/**
 * 画像保存用フォルダをMy Drive直下に作成する
 *
 * @param {string} strDocumentName - Googleドキュメント名
 * @returns {GoogleAppsScript.Drive.Folder} 作成したフォルダ
 */
function createImageSaveFolder_(strDocumentName) {
  const nowDate     = new Date();                                        // 現在日時取得
  const strDateTime =
    Utilities.formatDate(nowDate, TIME_ZONE, DATE_FORMAT.FOLDER);        // 日時文字列生成

  const strFolderName = `${strDateTime}_${strDocumentName}_画像`;        // フォルダ名生成
  const folderRoot    = DriveApp.getRootFolder();                        // My Drive直下取得
  const folderCreated = folderRoot.createFolder(strFolderName);          // フォルダ作成

  console.log(`フォルダ作成: ${strFolderName}`);

  return folderCreated;                                                  // 作成フォルダ返却
}

/**
 * ドキュメント要素を再帰的に走査し、画像を保存する
 *
 * @param {GoogleAppsScript.Document.Element} element - ドキュメント要素
 * @param {GoogleAppsScript.Drive.Folder} folder - 保存先フォルダ
 * @returns {number} 保存した画像数
 */
function traverseElementAndSaveImages_(element, folder) {
  if (element.getType() === DocumentApp.ElementType.INLINE_IMAGE) {
    saveInlineImage_(element.asInlineImage(), folder);                   // 画像保存
    return 1;                                                            // 保存数返却
  }

  if (!element.getNumChildren) {
    return 0;                                                            // 子要素なし
  }

  const numChildren = element.getNumChildren();
  let numSavedImages = 0;

  for (let i = 0; i < numChildren; i++) {
    numSavedImages +=
      traverseElementAndSaveImages_(element.getChild(i), folder);
  }

  return numSavedImages;                                                 // 保存数返却
}

/**
 * InlineImage をファイルとして保存する
 *
 * @param {GoogleAppsScript.Document.InlineImage} inlineImage - インライン画像
 * @param {GoogleAppsScript.Drive.Folder} folder - 保存先フォルダ
 */
function saveInlineImage_(inlineImage, folder) {
  const blobImage   = inlineImage.getBlob();                             // Blob取得
  const strFileName = createImageFileName_();                            // ファイル名生成

  blobImage.setName(strFileName);                                        // Blobに名前付与
  folder.createFile(blobImage);                                          // 画像保存

  console.log(`画像保存: ${strFileName}`);
}

/**
 * 画像保存用ファイル名を生成する
 *
 * @returns {string} 画像ファイル名
 */
function createImageFileName_() {
  const nowDate = new Date();
  const strTime =
    Utilities.formatDate(nowDate, TIME_ZONE, DATE_FORMAT.FILE);

  return `image_${strTime}.png`;                                         // ファイル名返却
}

Googleドキュメントの作業効率化は自動化ドットコムまで

Googleドキュメントの作業効率化のご依頼も承った実績があります。

もしGoogleドキュメントの作業自動化を検討中の場合は、自動化ドットコムにお問い合わせください。

自動化実績100件以上自動化ドットコムにお任せ

\ 社内共有に使える事例掲載中 /

\ 3時間以内に返信します /

  • URLをコピーしました!

この記事を書いた人

自動化ドットコム代表。1996年奈良県橿原市生まれ。ExcelやGoogleスプレッドシートの作業を、VBAやGASで自動化するプログラムを開発しています。単発での受託開発や月額制でのExcel保守・作業代行外注を請け負っています。2025年11月30日時点で100件以上の自動化開発の納品経験あり。広島県安芸郡府中町在住。

目次