GASでOCRする方法!Google Cloud Vision APIで画像から文字を抽出しよう
GASでOCRを行う方法はいくつかあるが、今回はGoogleドライブのOCR機能ではなく、Google Cloud Vision APIを使う方法を紹介する。
Vision APIを使えば、画像内の文字を検出し、テキストデータとして取得できる。レシート、書類、スクリーンショットなどの文字読み取りにも応用できるぞ。
Google Cloud Vision APIを使う準備
まずは、Google Cloud側でVision APIを使えるようにしておこう。
- Google Cloud Consoleにアクセスする
- プロジェクトを作成する
- Cloud Vision APIを有効化する
- 認証情報からAPIキーを作成する
- 作成したAPIキーをGASのコードに設定する
APIキーを使えば、GASからVision APIへリクエストを送ることができる。
画像URLから文字をOCRで抽出するGASコード
まずは、画像URLを指定してOCRするシンプルなコードを見てみよう。
function ocrWithVisionApi() {
const apiKey = 'YOUR_API_KEY';
const imageUrl = '画像のURLをここに入力';
const visionUrl = 'https://vision.googleapis.com/v1/images:annotate?key=' + apiKey;
const requestBody = {
requests: [
{
image: {
source: {
imageUri: imageUrl
}
},
features: [
{
type: 'TEXT_DETECTION'
}
],
imageContext: {
languageHints: ['ja']
}
}
]
};
const response = UrlFetchApp.fetch(visionUrl, {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(requestBody)
});
const result = JSON.parse(response.getContentText());
const text = result.responses[0].fullTextAnnotation.text;
Logger.log(text);
}
このコードを実行すると、指定した画像URLに含まれる文字がOCRで読み取られ、ログに表示される。
apiKey:Google Cloudで取得したAPIキーimageUrl:OCRしたい画像のURLTEXT_DETECTION:画像内の文字を検出する指定languageHints: ['ja']:日本語の文字認識を補助する指定UrlFetchApp.fetch():GASからVision APIへリクエストを送る処理
実際にこのサイトのロゴ画像のURLを指定して試してみるぞ。

すると、このようなレスポンスを得られるはずだ。

Googleドライブ内の画像をOCRする方法
次に、Googleドライブに保存してある画像をOCRする方法だ。
Drive内の画像を使う場合は、画像ファイルを取得し、Base64形式に変換してVision APIへ送信する。
function ocrDriveImageWithVisionApi() {
const apiKey = 'YOUR_API_KEY';
const fileId = '画像ファイルのID';
const file = DriveApp.getFileById(fileId);
const blob = file.getBlob();
const base64Image = Utilities.base64Encode(blob.getBytes());
const visionUrl = 'https://vision.googleapis.com/v1/images:annotate?key=' + apiKey;
const requestBody = {
requests: [
{
image: {
content: base64Image
},
features: [
{
type: 'TEXT_DETECTION'
}
],
imageContext: {
languageHints: ['ja']
}
}
]
};
const response = UrlFetchApp.fetch(visionUrl, {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(requestBody)
});
const result = JSON.parse(response.getContentText());
const text = result.responses[0].fullTextAnnotation.text;
Logger.log(text);
}
このコードでは、Googleドライブ上の画像ファイルをGASで取得し、Vision APIに送信している。
DriveApp.getFileById():Googleドライブ内のファイルを取得するgetBlob():ファイルをBlob形式で取得するUtilities.base64Encode():画像データをBase64形式に変換するimage.content:Base64化した画像データをVision APIへ送信する
試しに、ドライブ上に保存した次の画像をOCRで読み取ってみよう。読み取る画像のファイルIDを指定するだけさ。

すると、こんな感じのレスポンスが得られたぞ。

OCR結果から必要な文字だけ取り出す
OCRで取得した文字列は、そのままだと長いテキストとして返ってくる。
たとえばレシート画像から「合計金額」だけを取り出したい場合は、取得したテキストを行ごとに分割し、必要なキーワードを探すといい。
function extractTotalAmountFromReceipt() {
const text = getOcrTextFromDriveImage();
const lines = text.split('\n');
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
if (line.includes('合計')) {
Logger.log(line);
return line;
}
}
Logger.log('合計金額が見つかりませんでした');
}
このコードでは、OCR結果を改行ごとに分割し、「合計」という文字を含む行を探している。
split('\n'):OCR結果を行ごとに分けるincludes('合計'):「合計」という文字が含まれているか確認するreturn line:見つかった行を返す
OCR処理を関数として分ける
何度もOCR処理を使う場合は、OCR部分を関数として分けておくと便利だ。
function getOcrTextFromDriveImage() {
const apiKey = 'YOUR_API_KEY';
const fileId = '画像ファイルのID';
const file = DriveApp.getFileById(fileId);
const blob = file.getBlob();
const base64Image = Utilities.base64Encode(blob.getBytes());
const visionUrl = 'https://vision.googleapis.com/v1/images:annotate?key=' + apiKey;
const requestBody = {
requests: [
{
image: {
content: base64Image
},
features: [
{
type: 'TEXT_DETECTION'
}
],
imageContext: {
languageHints: ['ja']
}
}
]
};
const response = UrlFetchApp.fetch(visionUrl, {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(requestBody)
});
const result = JSON.parse(response.getContentText());
if (!result.responses[0].fullTextAnnotation) {
return '';
}
return result.responses[0].fullTextAnnotation.text;
}
このように関数化しておけば、レシート処理、書類処理、画像内テキストの検索など、いろいろな処理から再利用できる。
GASでOCRを使うときの注意点
Google Cloud Vision APIを使う場合、いくつか注意点がある。
- Google Cloud側でVision APIを有効化する必要がある
- APIキーの管理に注意する
- 利用量によっては料金が発生する場合がある
- 画像がぼやけていると認識精度が下がる
- 文字が小さすぎる画像や斜めになっている画像は読み取りにくい
特にAPIキーをコードに直接書く場合は、外部に公開しないように注意しよう。
まとめ
今回は、GASからGoogle Cloud Vision APIを呼び出して、画像から文字を抽出する方法を紹介した。
GoogleドライブのOCR機能を使う方法もあるが、Vision APIを使うと、API連携としてOCR処理を組み込みやすくなる。
レシート画像、書類画像、スクリーンショットなどから文字を取得したい場合は、GASとGoogle Cloud Vision APIを組み合わせることで、自動化の幅が大きく広がるぞ。