見出し画像

【GAS】 Blobをなんとなく理解したい! Blobデータへ変換の巻 2/4


Blobデータを扱う前に、GoogleDriveにあるファイル、GoogleAppsScript上のスプレッドシートなどのオブジェクトや単なる文字列から、どのようにBlobデータに変換するのか説明します。
なお、Blobデータに変換するにはBlobクラスでないクラスを使用する場合がほとんどです。
ですが、このページではその他のクラスの説明はせず、そういうものだと半ば強引に進めていきます。ご了承ください。

GoogleDrive上にあるファイルからBlobデータに

ざっくり言うと

GoogleDrive上にあるファイルをBlobデータにするには、
GoogleDrive上のファイルをオブジェクトとして取得

そのファイルのオブジェクトが所属するクラスにあるメソット(getBlob())でファイルのデータからBlobデータを取得する。形式としては"ファイルのオブジェクト.getBlob()"

具体例をあげて言うと

ざっくりでよくわからないと思うので、具体的にコードを交えてご紹介。
ファイルのオブジェクトを取得するには、"Drive Service" と言うGoogleAppsScriptでGoogleDrive上のファイルやフォルダを操作したり取得、編集するためのクラス群を利用します。
ですが、このページでは”Drive Service"に関することは詳しく説明しません。
ファイルのオブジェクトを取得する方法は幾多にもあり、下記の説明はあくまで一例としてそういうものだとご理解いただきたいです。

これから紹介する例では、GoogleDrive上に”sample.png"というファイルからBlobデータを取得するものです。

// GoogleDrive上から’sample.png'という名前のファイルを探す
let sampleFiles = DriveApp.getFileByName('sample.png'); // GoogleDrive上にある全ての'sample.png'ファイルを取得
if (!sampleFiles.hasNext()) { // このif文が何をしているかはここでは気にしない方が良い
    return;
}
let sampleFile = sampleFiles.next(); // とにかくsampleFilesのうちの一つをファイルをオブジェクトとして取得

”Drive Service"内の”DriveApp“クラスを使って、GoogleDrive上にある’sample.png'という名前のファイルを全て探し、その中の一つを’samlpeFile'という変数のファイルのオブジェクトとして取得した。

// ファイルのオブジェクトからBlobデータを取得
let sampleBlob = sampleFile.getBlob(); // データの型(MimeType)はそのファイルによる

上記にある通り、”ファイルのオブジェクト.getBlob()”で取得できる。
あとはこのBlobデータを他の種類のデータにしたり、メールに添付したりできる。

Google Docs, Sheets, SlidesをBlobデータに

ざっくり言うと

GoogleAppsScript上で扱っているGoogle Docs, Sheets, SlidesらのオブジェクトからBlobデータにするには、
Google Docs, Sheets, Slides のオブジェクトを作成または取得する。

そのオブジェクトが所属するクラスにあるメソット(getBlob())でファイルのデータからBlobデータを取得する。形式としては"アプリのオブジェクト.getBlob()"

具体例をあげて言うと

今回はGoogle Sheets をGoogleAppsScript上で作成したり編集できる”Spreadsheet Service”のクラス群を使っていきますが、詳しくは説明しません。

適当なデータを持ったスプレッドシートを作成し、そのオブジェクトからBlobデータを取得します。

// 適当なデータを持ったスプレッドシートを作成
let sampleSpreadsheet = SpreadsheetApp.create("sample"); //"sample"という名前のスプレッドシートを作成

let sampleData = [['name','id', 'amount'],['a', 0, 10], ['b', 1, 5], ['c', 2, 8]]; // 適当なデータを設定

sampleSpreadsheet.getSheets()[0].getRange(1,1,4,3).setValues(sampleData); // スプレッドシートにデータを入れた。

”Spreadsheet Service"内の”SpreadsheetApp“クラスを使って、"sample"という名前のスプレッドシートを作成し、適当なデータを入れた、"samlpeSpreasheet"という変数のオブジェクトを作成しました。

// スプレッドシートのオブジェクトからBlobデータを取得
let sampleSpreadsheetBlob = sampleSpreadsheet.getBlob(); // データの型(MimeType)はPDF

上記にある通り、"アプリのオブジェクト.getBlob()"で取得できる。
しかし、取得したBlobデータのMimeType、いわゆるデータの型は強制的にPDFに変換される。
スプレッドシートとしてのMimeTypeとしてBlobデータを扱うことはできない。
そのことを覚えておいてこのBlobデータを他の種類のデータにしたり、メールに添付したりできる。

HttpResponseをBlobデータに

HttpResponseとは、簡単に説明すると、あるURLに対してコンタクトをとって(Httpリクエスト)、反応もしくは返ってきたデータをHttpResponseと言います。
HttpResponseとして返ってきたデータの中には、なんかのステータス(詳しくは…)やHTML、CSSなどが含まれています。
そんなHttpResponseをBlobに変換すると、HTMLのデータ型(Mime Type)のBlobデータになります。
今回は”URL Fetch Service”にある、URLなどにアクセスしたりできる”UrlFetchApp"クラスを利用します。

// 任意のurlを設定
let url = "https://note.com/muuunman/n/nc85c7cf60907";

// url にリクエストを送り、返ってきたレスポンスを取得
let httpResponse = UrlFetchApp.fetch(url);

// このレスポンスからBlobデータを取得
let httpResponseBlob = httpResponse.getBlob(); // データの型(MimeType)はHTMLになっている。

URLに送ったリクエストに対して返ってきたレスポンスのオブジェクトに対して、メソッド"getBlob()"でBlobオブジェクトを取得できます。

文字列またはバイト配列からBlobデータに

何に使うかは正直あまりわかっていませんが、文字列は複数の文字を一列に並べて一つにしたもので、バイト配列は複数の-128〜128の間の数値を一列に並べて一つにしたものと考えてください。
申し訳ないですが、詳しくは調べて頂けたら嬉しいです。

そんな文字列やバイト配列からBlobデータを取得するには"Utilities"クラスを使用します。
これは汎用的は機能を持っているクラスになり、その中の"newBlob(データ)"メソッドを利用してBlobデータを取得します。

文字列からBlobデータを取得

// 文字列からBlobデータを取得
let str = "hello world";
let strBlob = Utilities.newBlob(str); // Blobの名前、データの型(MimeType)はまだなし!

バイト配列からBlobデータを取得

// バイト配列からBlobデータを取得
let bytes = [71, 79, 79, 71, 76, 69];
let bytesBlob = Utilities.newBlob(bytes); // Blobの名前、データの型(MimeType)はまだなし!

文字列からもバイト配列からも"Utilities.newBlob(文字列orバイト配列)"でBlobデータを取得できます。加えて、両方ともに取得したBlobデータには、名前やデータの型(MimeType)は設定されていません。


次の記事:Blobクラス自体が持っている主なメソッドを紹介

この記事が気に入ったらサポートをしてみませんか?