🎞️

【GAS】フォルダ内の複数の画像ファイルに一括でOCRをかけてシートに書き出す

2023/11/04に公開

事前準備

  1. OCR 用のフォルダを作成して出力用のシートを作成する

  2. GAS コードエディタから Drive API を有効化(左メニューの サービス から探して追加)

コード

フォルダIDは URL の https://drive.google.com/drive/folders/ に続く部分、シートIDは https://docs.google.com/spreadsheets/d//edit#gid=0 の間の部分です。

/*
フォルダ内の画像に対してOCRをかけてシートに出力

*/

const FOLDER_ID = "(ここはフォルダIDを入れる)";
const SHEET_ID = "(ここはシートIDを入れる)";
const SHEET_OBJ = SpreadsheetApp.openById(SHEET_ID);
const LOG_SHEET = SHEET_OBJ.getSheets()[0];

const runOCR = () => {
  const resource = {
    title: "temp"
  };
  const option = {
    "ocr": true,
    "ocrLanguage": "ja",
  }
  const files = DriveApp.getFolderById(FOLDER_ID).getFiles();
  let trial = 100; // 念のための上限
  while (files.hasNext()) {
    if (trial < 1) { break }
    const file = files.next();
    const name = file.getName();
    if (name.endsWith(".png") || name.endsWith(".jpeg") || name.endsWith(".jpg")) {
      console.log(`converting file '${name}'...`)
      const fileId = file.getId();
      const image = Drive.Files.copy(resource, fileId, option)
      const content = DocumentApp.openById(image.id).getBody().getText();
      Drive.Files.remove(image.id)
      LOG_SHEET.appendRow([new Date(), name, fileId, content]);
    }
    trial -= 1;
  }
}

実行例

このような画像化した表から数値を起こしたいときに、画像全体に対して OCR を実行してしまうと、罫線が文字として認識されたりレイアウトを再現しようとスペースが入りまくったりして余計に面倒なことになります。

そんなときは必要な列ごとに OCR 処理すると精度が上がります。

各列ごとの短冊状になった画像を OCR 用のフォルダにアップロードし、

コードエディタで runOCR を選択した状態で 実行 ボタンを押すか ctrl+r で関数を実行すると、

結果がシートに書き出されます(実行時タイムスタンプ、ファイル名、ファイルID、OCR 結果の4列)。

Discussion