Google App Script(GAS)を使っているとBlobというコードに出くわすことがあります。
このBlobは実はとても便利でGASでは割と頻繁に使います。ここではそもそもBlobとは何か?やその使い方について解説しています。
また、Blobを使うときに欠かせないMIMEタイプの指定方法についても2種類の方法を紹介しています。
Blobとは何か?
BlobとはBinary Large OBject(バイナリラージオブジェクト)の略でブロブと読みます。Blobオブジェクトと呼ばれたりもします。
通常のスプレッドシートやCSV、PDF、画像などのファイルは人間の目で見てそれぞれどのようなものかを把握することができます。
これらのファイルを数字を使って機械だけがわかるデータで表したのがBlobです。例えば、「Good Morning!」をBlob形式のデータに変換すると[ 71, 111, 111, 100, 32, 77, 111, 114, 110, 105, 110, 103, 33 ]
になります。
イメージ的にはファイルの生データです。Blobファイルの形式を指定することでスプレッドシートやCSV、PDF、画像などの一般的なファイルとして見られるようなイメージです。
AppScriptで一般的なファイルを取得して処理を加えるよりも、Blobファイルとして取得して変更を加える方がより軽量に取り扱うことができます。このため、Googleドライブ上にあるファイルなどを取得するときはBlobとして取得することが一般的です。
このため、AppScriptではBlobをデータ交換オブジェクトとして定義しています。
Blobの生成
とても簡単なBlobの例として、GASのUtilitiesクラスのnewBlobメソッドを使うとBlobオブジェクトを作成することができます。
function createBlob(){
let blob = Utilities.newBlob('Good Morning!');
console.log(blob.getBytes());
}
Blobオブジェクトに保存されたデータを見るにはgetBytesメソッドを使います。
上記のプログラムの実行結果は以下になります。
[ 71, 111, 111, 100, 32, 77, 111, 114, 110, 105, 110, 103, 33 ]
これが「Good Morning!」はBlobとして表した結果です。
Blobオブジェクトのコンテンツタイプや名前をつける
AppScriptのnewBlobでは、コンテンツタイプを指定したり、オブジェクトに名前をつけることができます。
コンテンツタイプとはMIMEタイプのことです。
newBlob(データ, MIMEタイプ, オブジェクト名)
MIMEタイプはたくさんありますが、よく使うものだと以下のようなものがあります。
- image/png
- text/html
- text/csv
MIMEタイプを見れば、このファイルが何なか(画像なのか、テキストファイルなのかなど)がわかります。
(参考)よく使うMIMEタイプの一覧
newBlobメソッドを実際に使うと以下のようになります。
function createBlob(){
const data = 'Hello!';
const contentType = 'text/html';
const name = 'ハローBlob';
const blob = Utilities.newBlob(data, contentType, name);
console.log('Blobデータ:', blob.getBytes());
console.log('Blobコンテンツタイプ:', blob.getContentType());
console.log('Blob名:', blob.getName());
}
この結果は以下のになります。
Blobデータ: [ 72, 97, 108, 108, 111, -17, -68, -127 ]
Blobコンテンツタイプ: text/html
Blob名: ハローBlob
MIMEタイプの指定方法
ここで少し補足的な情報になりますが、Blobオブジェクトの生成時や、Blobオブジェクトを他のMIMEタイプへと変更する場合に、MIMEタイプの指定方法は大きく2つあります。
一般的な文字列
1つ目はJavaScriptなどで使われる一般的な文字列での指定です。
- image/png
- text/html
- text/csv
などがあります。
指定するときはダブルクオテーションで囲んで以下のように記述します。
newBlob("hello!", "text/csv")
(参考)よく使うMIMEタイプの一覧
Enum MimeType
もう1つは「Enum MimeType」というAppScriptに用意されたMIMEタイプの指定方法です。
MimeType.GOOGLE_DOCS
のように、MimeTypeというオブジェクトに対してプロパティを指定します。
MimeType.プロパティ
プロパティ | 内容 |
---|---|
GOOGLE_ | Google Apps Script プロジェクトの MIME タイプを表します。 |
GOOGLE_ | Google 図形描画 ファイルの MIME タイプを表します。 |
GOOGLE_ | Google ドキュメント ファイルの MIME タイプを表します。 |
GOOGLE_ | Google フォーム ファイルの MIME タイプを表します。 |
GOOGLE_ | Google スプレッドシート ファイルの MIME タイプを表します。 |
GOOGLE_ | Google サイト ファイルの MIME タイプを表します。 |
GOOGLE_ | Google スライド ファイルの MIME タイプを表します。 |
FOLDER | Google ドライブ フォルダの MIME タイプを表します。 |
SHORTCUT | Google ドライブのショートカットの MIME タイプを表します。 |
BMP | BMP 画像ファイルの MIME タイプ(通常は .bmp)を表します。 |
GIF | GIF 画像ファイル(通常は .gif)の MIME タイプを表します。 |
JPEG | JPEG 画像ファイルの MIME タイプ(通常は .jpg)の表現。 |
PNG | PNG 画像ファイルの MIME タイプ(通常は .png)を表します。 |
SVG | SVG 画像ファイル(通常は .svg)の MIME タイプを表します。 |
PDF | PDF ファイル(通常は .pdf)の MIME タイプを表します。 |
CSS | CSS テキスト ファイル(通常は .css)の MIME タイプを表します。 |
CSV | CSV テキスト ファイル(通常は .csv)の MIME タイプを表します。 |
HTML | HTML テキスト ファイルの MIME タイプ(通常は .html)を表します。 |
JAVASCRIPT | JavaScript テキスト ファイル(通常は .js)の MIME タイプを表します。 |
PLAIN_ | 書式なしテキスト ファイルの MIME タイプ(通常は .txt)を表します。 |
RTF | リッチテキスト ファイル(通常は .rtf)の MIME タイプを表します。 |
OPENDOCUMENT_ | OpenDocument グラフィック ファイルの MIME タイプ(通常は .odg)を表します。 |
OPENDOCUMENT_ | OpenDocument プレゼンテーション ファイルの MIME タイプを表します(通常は .odp)。 |
OPENDOCUMENT_ | OpenDocument スプレッドシート ファイルの MIME タイプを表します(通常は .ods)。 |
OPENDOCUMENT_ | OpenDocument ワープロ ファイルの MIME タイプ(通常は .odt)の表現。 |
MICROSOFT_ | Microsoft Excel スプレッドシート ファイル(通常は .xlsx)の MIME タイプを表します。 |
MICROSOFT_ | 以前の Microsoft Excel ファイル(通常は .xls)の MIME タイプを表します。 |
MICROSOFT_ | Microsoft PowerPoint プレゼンテーション ファイルの MIME タイプ(通常は .pptx)を表します。 |
MICROSOFT_ | Microsoft PowerPoint のレガシー ファイル(通常は .ppt)の MIME タイプを表します。 |
MICROSOFT_ | Microsoft Word ドキュメント ファイルの MIME タイプ(通常は .docx)を表します。 |
MICROSOFT_ | 以前の Microsoft Word ファイル(通常は .doc)の MIME タイプを表します。 |
ZIP | ZIP アーカイブ ファイルの MIME タイプ(通常は .zip)を表します。 |
指定方法の例は以下のようになります。
const mimeTypes = { csv: MimeType.MICROSOFT_EXCEL, pdf: MimeType.PDF };
var docs = DriveApp.getFilesByType(MimeType.GOOGLE_DOCS);
UrlFetchApp.fetch(url).getAs(MimeType.PDF);
直感的でわかりやすいです。
getDataAsString|Blobオブジェクトを文字列にする
Blobオブジェクトをデータで表すと[ 71, 111, 111, 100, 32, 77, 111, 114, 110, 105, 110, 103, 33 ]のようになります。
これでは、人間が見ると意味がわかりません。これを文字列に戻すにはgetDataAsSrtingメソッドを使います。
getDataAsString([charset])
引数でcharset(文字コード)を指定できます。省略したときはUTF-8となります。
function createBlob(){
let blobData = [ 71, 111, 111, 100, 32, 77, 111, 114, 110, 105, 110, 103, 33 ];
let blob = Utilities.newBlob("").setBytes(blobData);
console.log(blob.getDataAsString());
}
↓ 出力結果
Good Morning!
getAsメソッド|Blobを別のファイル形式(MIMEタイプ)に変換する
GASのBlobクラスのgetAsメソッドを使うと、Blobオブジェクトを指定したMIMEタイプのデータに変換することができます。
getAs(MIMEタイプ)
例えば、スプレッドシートをPDFのBlobオブジェクトに変換する場合は以下のようにします。
let sheet = SpreadsheetApp.getActiveSpreadsheet();
let blob = sheet.getAs(MimeType.PDF);
////以下のMIMEタイプ指定も同じ
//let blob = sheet.getAs('application/pdf');
base64にエンコードする
HTMLやメールなどbase64という64進数のデータ形式を使うことがあります。
この場合、GASのbase64Encodeメソッドを使うことでBlobオブジェクトからbase64のデータへと変換することができます。
base64Encode(data, charset)
第2引数のcharset(文字セット)は省略できます。例えば、UTF-8を指定するときはUtilities.Charset.UTF_8
を指定します。
なお、Blobオブジェクトを変換するときは、BlobオブジェクトにgetBytesメソッドを使ってデータとして取得したものにエンコードをかけます。
Utilities.base64Encode(blob.getBytes())
実際にエンコードすると以下のようになります。
function createBlob(){
const blob = Utilities.newBlob("Hello!");
console.log(Utilities.base64Encode(blob.getBytes()));
}
↓ 出力結果
SGVsbG8h
base64からデコードする
base64形式のデータをBlobオブジェクトに変換したいときは、base64Decodeメソッドを使います。
base64Decode(encoded, charset)
第2引数のcharset(文字セット)は省略できます。例えば、UTF-8を指定するときはUtilities.Charset.UTF_8
を指定します。
実際にデコードすると以下のようになります。
function decodeBase64(){
let base64Data = "SGVsbG8h";
let blobBinary = Utilities.base64Decode( base64Data );
console.log(blobBinary);
}
↓ 出力結果
[ 72, 101, 108, 108, 111, 33 ]
これを更に文字列に直すと以下のようになります。
function decodeBase64(){
let base64Data = "SGVsbG8h";
let blobBinary = Utilities.base64Decode( base64Data );
let blob = Utilities.newBlob("").setBytes(blobBinary);
console.log(blob.getDataAsString());
}
↓ 出力結果
Hello!