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

Googleドキュメント上に挿入した画像を、Googleドライブに保存するGASコードを紹介します。
目次
概要
コードの概要は以下のとおりです
- Googleドキュメントに紐づくコンテナバインド型のコードです
- My Drive直下に新規フォルダが作成されます
- 新規フォルダの名前は「yyyyMMdd_HHmmss_ドキュメント名」です
- 新規フォルダの中にすべての画像が保存されます
使い方
STEP
Googleドキュメントの「拡張機能」をクリックする
STEP
「Apps Script」をクリックする

STEP
書かれているコードを削除する

STEP
次の項目で紹介するコードを貼り付ける

STEP
「保存」ボタンをクリックする

STEP
「実行」をクリックする

STEP
Googleの認証をする
Gooogleの認証を求めるウィンドウが出てきます。
以下のページの手順で認証をしてください。
あわせて読みたい


GASを初めて実行したときのGoogle承認・認証の進め方
GASを実行したら「承認が必要」っていう画面が出てきたんだけど、どうすればいいの? 急にこんな画面が出てきたら、このままGASの実行を続けてもいいのか不安になります…
STEP
もう一度「実行」ボタンをクリックする
STEP
GoogleドライブのMy Drive直下に新規フォルダが作成される
新規フォルダの名前は「yyyyMMdd_HHmmss_ドキュメント名」です。
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時間以内に返信します /
