【GAS】Blobとは何か?実例で解説|Utilities.newBlobやMIMEタイプの指定方法(初心者向け,わかりやすい)

Apps Script apps script GAS-prograshi(プロぐらし)-kv AppsScript
記事内に広告が含まれていることがあります。
[PR]

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をデータ交換オブジェクトとして定義しています。


(参考)App Script: Class 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として表した結果です。


(参考)Class Blob: getBytes()


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_APPS_SCRIPTGoogle Apps Script プロジェクトの MIME タイプを表します。
GOOGLE_DRAWINGSGoogle 図形描画 ファイルの MIME タイプを表します。
GOOGLE_DOCSGoogle ドキュメント ファイルの MIME タイプを表します。
GOOGLE_FORMSGoogle フォーム ファイルの MIME タイプを表します。
GOOGLE_SHEETSGoogle スプレッドシート ファイルの MIME タイプを表します。
GOOGLE_SITESGoogle サイト ファイルの MIME タイプを表します。
GOOGLE_SLIDESGoogle スライド ファイルの MIME タイプを表します。
FOLDERGoogle ドライブ フォルダの MIME タイプを表します。
SHORTCUTGoogle ドライブのショートカットの MIME タイプを表します。
BMPBMP 画像ファイルの MIME タイプ(通常は .bmp)を表します。
GIFGIF 画像ファイル(通常は .gif)の MIME タイプを表します。
JPEGJPEG 画像ファイルの MIME タイプ(通常は .jpg)の表現。
PNGPNG 画像ファイルの MIME タイプ(通常は .png)を表します。
SVGSVG 画像ファイル(通常は .svg)の MIME タイプを表します。
PDFPDF ファイル(通常は .pdf)の MIME タイプを表します。
CSSCSS テキスト ファイル(通常は .css)の MIME タイプを表します。
CSVCSV テキスト ファイル(通常は .csv)の MIME タイプを表します。
HTMLHTML テキスト ファイルの MIME タイプ(通常は .html)を表します。
JAVASCRIPTJavaScript テキスト ファイル(通常は .js)の MIME タイプを表します。
PLAIN_TEXT書式なしテキスト ファイルの MIME タイプ(通常は .txt)を表します。
RTFリッチテキスト ファイル(通常は .rtf)の MIME タイプを表します。
OPENDOCUMENT_GRAPHICSOpenDocument グラフィック ファイルの MIME タイプ(通常は .odg)を表します。
OPENDOCUMENT_PRESENTATIONOpenDocument プレゼンテーション ファイルの MIME タイプを表します(通常は .odp)。
OPENDOCUMENT_SPREADSHEETOpenDocument スプレッドシート ファイルの MIME タイプを表します(通常は .ods)。
OPENDOCUMENT_TEXTOpenDocument ワープロ ファイルの MIME タイプ(通常は .odt)の表現。
MICROSOFT_EXCELMicrosoft Excel スプレッドシート ファイル(通常は .xlsx)の MIME タイプを表します。
MICROSOFT_EXCEL_LEGACY以前の Microsoft Excel ファイル(通常は .xls)の MIME タイプを表します。
MICROSOFT_POWERPOINTMicrosoft PowerPoint プレゼンテーション ファイルの MIME タイプ(通常は .pptx)を表します。
MICROSOFT_POWERPOINT_LEGACYMicrosoft PowerPoint のレガシー ファイル(通常は .ppt)の MIME タイプを表します。
MICROSOFT_WORDMicrosoft Word ドキュメント ファイルの MIME タイプ(通常は .docx)を表します。
MICROSOFT_WORD_LEGACY以前の Microsoft Word ファイル(通常は .doc)の MIME タイプを表します。
ZIPZIP アーカイブ ファイルの MIME タイプ(通常は .zip)を表します。

(参考)AppScript: Enum MimeType


指定方法の例は以下のようになります。

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');


注意点

getAsメソッドを使って、画像(MimeType.JPG)をCSVファイル(MimeType.CSV)にするといったナンセンスな指示をするとエラーが発生します。



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


(参考)AppScript:base64Encode


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!


タイトルとURLをコピーしました