Google Apps ScriptでSpreadsheet上の画像を一括取り出し【GAS】
Googleスプレッドシートは大変便利なのですが、シート上に貼り付けた画像を別で利用したいと思っても、どういうわけか貼り付けられても取り出せない。これ過去にも結構歯がゆい思いをしていたのですが、Google Apps Scriptで取り出す事ができました。
短いコードですが、色々と手順があるので、その仕組みを理解して装備が必要です。
リンク
サンプルスプレッドシート
- imageextract - Google Spreadsheet
メニューより「コマンド」⇒「画像取り出し」を実行するとスプレッドシート上の画像ファイルを指定のフォルダ内に解凍します。
コードと仕組み
仕組み
Google Spreadsheetのままだとどうにもならないので、以下の手順で取り出すようにしています。
- Google Spreadsheetを一旦、xlsx形式に変換する(UrlfetchAppで変換を掛けています)
- 変換を掛けたものをBlobとして取得し、ファイルを作らずにMimetypeはZIPとして指定する
- ZIPファイルになってるので、Unzipにてファイルの中身を解凍する(まだファイルは生成しない)
- xmlやらjpgやら色々入ってるので、ファイルのMimetypeを取得し今回はimage/jpegと一致するものを選択
- createFileにて指定のフォルダ内に画像ファイルをここで初めて生成する
xlsxやzip、その他解凍ファイルは全てメモリ上での話なので、実際にドライブ上に生成されるのは、選択的に解凍したjpgファイルのみになります。xlsxはxmlやjpg等をZIPで固めたファイルという仕様なので、実はアーカイバで解凍出来るという事はあまり知られていなかったりします。docxもpptxも同様です。
なので、Spreadsheetよりも寧ろ、DocumentやSlideのほうでこのスクリプトを使ったほうが利便性は高いと思います。同様にxlsxやpptxといったファイルからの取り出しも1.の手順だけ除外すれば取り出すことが可能です。
ソースコード
//フォルダとスプレッドシートの指定
var ssid = "ここに対象のスプレッドシートのIDを入れる"; //スプシ
var target = "ここに解凍先フォルダのIDを入れる" //フォルダ
//画像を取り出す
function imgextract() {
//xlsx形式に変換しZIPとして変更
let url = "https://docs.google.com/spreadsheets/export?exportFormat=xlsx&id=" + ssid;
let blob = UrlFetchApp.fetch(url, {
headers: {
authorization: `Bearer ${
ScriptApp.getOAuthToken()
}`
}
}).getBlob().setContentType(MimeType.ZIP);
//ZIPファイルを解凍する
let xlsx = Utilities.unzip(blob);
//解凍先の指定
let folder = DriveApp.getFolderById(target);
//xlsxファイルの処理
xlsx.forEach(blobimg =>{
//画像を取り出す(jpg形式のみ)
if (blobimg.getContentType() == 'image/jpeg'){
//画像のファイル名を取得
let filename = blobimg.getName().substr(9);
//フォルダに画像を生成する
let id = folder.createFile(blobimg).setName(filename).getId();
}
});
}

