38
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

プログラミング初心者が1日でマスター!ChatGPTとGoogle Apps Scriptで驚きの自作OCRを実現!!

Last updated at Posted at 2024-05-05

こんにちは!こんばんは!
地方のスーパーでテナントさんの誘致や管理をしているおみえです。

当社では約1500件のテナント契約があり、業種は飲食、サービス、ATMなど多岐にわたります。すべてのテナントに共通して毎月賃料をお支払いいただいており、その請求書発行を私が担当しています。既存のテナントには社内システムを通じて自動で請求書を発行していますが、新しく入店するテナントには社内システム稼働までの間は個別に請求書を発行します。
18.png

請求管理の課題と解決策

請求書を発行した後、内容を財務経理部に報告するためPDFをメールで送信し、同時に金額や支払い期限などの詳細をExcelで管理簿に記録しています。しかし、忙しい時はこの記録作業を忘れがちです。
PDF化・メール・転記と複数の作業をやるとなるとそこそこ時間がかかるので、Excel入力を楽にしたいと思い、請求書の内容を自動で読み取り記録する方法がないか、ChatGPTに相談してみることにしました。
1.png

OCRを考慮していたところ、Googleドキュメントと書いてあります!Googleを使えば、GoogleドライブにあるPDFをスプレッドシートに転記できるかもしれないと思い、その方法について再度ChatGPTに相談しました。

2.png

解決の糸口が見え、新たな希望が明るく輝き始めました!

やりたいこと

4.png

完成品

  • 動画は一部カット編集しています。
  • 5つのPDFファイルの転記に約1分30秒かかっています。
  • 個人情報保護のため、動画の一部にぼかし処理を施しています。

作成方法

使用ツール

ChatGPT (GPT-3.5)
Googleドライブ
Googleスプレッドシート
Google Apps Script

事前準備

  1. Googleドライブ内にフォルダを作成し、そこにPDFをアップロードします。
    今回は以下のような請求書サンプルPDFを5つ作成してドライブの中に保存しました。
  2. データ転記用のスプレッドシートも作成します。
    7.png

ChatGPTにスクリプトを依頼

19.png

Google Apps Scriptの詳細な使用方法はこちらを参考にしてください。

さっそくChatGPTに依頼します。
3.png

最初に生成されたコードはこちら
スクリプト
function extractTextFromPDF() {
  // PDFファイルが保存されているGoogleドライブのフォルダIDを入力してください
  var folderId = "Your_Folder_ID_Here";
  
  // Googleドライブの指定されたフォルダからPDFファイルを取得します
  var folder = DriveApp.getFolderById(folderId);
  var files = folder.getFilesByType(MimeType.PDF);
  
  // スプレッドシートに新しいシートを作成します
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.insertSheet();
  
  // PDFからテキストを抽出してスプレッドシートに転記します
  while (files.hasNext()) {
    var file = files.next();
    var pdf = PdfApp.open(file.getBlob());
    var numPages = pdf.getNumPages();
    
    for (var i = 0; i < numPages; i++) {
      var page = pdf.getPageNum(i);
      var text = page.getText();
      sheet.appendRow([text]);
    }
  }
}

参考:GoogleドライブのフォルダIDとは
該当のフォルダを開きブラウザのアドレスバーに表示される/folders/の後の部分がフォルダIDとなります。/drive.google.com/drive/u/1/folders/Your_Folder_ID_Here

生成されたコードを見てみると

// PDFファイルが保存されているGoogleドライブのフォルダIDを入力してください
// Googleドライブの指定されたフォルダからPDFファイルを取得します
// スプレッドシートに新しいシートを作成します
// PDFからテキストを抽出してスプレッドシートに転記します

指定されたフォルダからPDFファイルを取得、PDFからテキストを抽出してスプレッドシートに転記します。私がやりたいことの流れですが、
新しいシートは作成しなくていいので修正していきます。

8.png
このように自分がこうしてほしいという要望をChatGPTに依頼して修正していきます。

何度も同じエラーに直面し、その原因を調査した結果、Drive APIを有効にする必要があることがわかりました。解決策は下記の記事に記載されています。
※これについてはChatGPTに聞いても解決策がよくわかりませんでした。

初回成功の結果

エラーが発生しては、その都度ChatGPTに修正を依頼して、初めて成功したのがこちらです。

PDFファイルからテキストを読み取り、スプレッドシートに転記することができました!
ただA列に全てが転記されていて、これではデータとして使用しにくいのでスプレッドシートへの転記方法を変更します。

ChatGPTのプロンプト

プロンプトの一部はこちら

10.png
11.png
13.png
14.png
20.png
12.png

だんだんChatGPTが愛おしくなってきました:relaxed: ※注意:ChatGPTはあくまで人工知能です

最終完成スクリプト

最終的に完成したスクリプトはこちら
スクリプト
function extractTextFromPDF() {
  // PDFファイルが保存されているGoogleドライブのフォルダIDを入力してください
  var folderId = "Your_Folder_ID_Here";
  
  // Googleドライブの指定されたフォルダからPDFファイルを取得します
  var folder = DriveApp.getFolderById(folderId);
  var files = folder.getFilesByType(MimeType.PDF);
  
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // アクティブなシートを取得
  
  // PDFファイルからテキストを抽出してスプレッドシートに転記します
  while (files.hasNext()) {
    var file = files.next();
    
    // PDFファイルのURLを取得してスプレッドシートに挿入します
    var pdfUrl = file.getUrl();
    
    // PDFからテキストを抽出してスプレッドシートに転記します
    var pdfText = extractTextFromPDFFile(file);
    
    // PDFのURLをA列に挿入します
    sheet.appendRow([pdfUrl]);
    
    // PDFから抽出したテキストをB列から挿入します
    for (var i = 0; i < pdfText.length; i++) {
      sheet.getRange(sheet.getLastRow(), 2 + i).setValue(pdfText[i]);
    }
  }
}

// PDFファイルからテキストを抽出する関数
function extractTextFromPDFFile(file) {
  var pdfBlob = file.getBlob();
  var tempFolder = DriveApp.getRootFolder().createFolder('temp'); // 一時フォルダを作成
  
  var tempFile = tempFolder.createFile(pdfBlob);
  
  // Googleドキュメントを作成します
  var resource = {
    title: file.getName(),
    mimeType: MimeType.GOOGLE_DOCS
  };
  var docFile = Drive.Files.insert(resource, tempFile.getBlob(), {
    convert: true
  });
  
  // ドキュメントを開いてテキストを取得します
  var doc = DocumentApp.openById(docFile.id);
  var text = doc.getBody().getText();
  
  // 一時フォルダとファイルを削除します
  tempFolder.setTrashed(true);
  Drive.Files.remove(docFile.id);
  
  return text.split("\n"); // 改行でテキストを分割して配列に変換
}

実際のプロセスでは、GoogleドライブのフォルダからPDFを取得し、そのテキストを抽出してGoogleドキュメントに転記します。その後、OCR技術を用いてこのテキストを読み取り、Googleスプレッドシートに転記しています。この一連の作業をGoogle Apps Script(GAS)を活用して自動化しています。

22.png

転記されたスプレッドシート

15.png

工夫した点
テキストを転記するだけでなく、PDFのファイルURLも読み取ってスプレッドシートのA列に記録しました。このリンクはクリック可能で、直接該当のPDFファイルを開いて確認できます。

まとめ

PDFデータ転記の課題

  • 今回の方法では、PDFからすべてのテキストを抽出しているため、不要なテキストも含まれてしまいます。スクリプト内で不要な文言を削除する設定も可能ですが、今回は必要のない列を非表示にすることで対応しました。
  • 今回使用したのはサンプルデータで、全て同じ形式のため列がきれいに揃っていますが、PDFデータの質によっては転記する列がずれることもあります。また、手書きのテキストは読み込むことができませんでした。

ChatGPTに確認したところ、手書きを読み込むためにはGoogle Cloud Vision APIが必要だということでした。Google Cloud Vision APIは認証情報や設定が複雑で、試みたもののうまく機能しませんでした。今後、再度挑戦します!

ChatGPT使用時の注意点

エラー箇所の修正の場合、修正箇所のみを表示したり、時には元のスクリプトに戻ることもあります。したがって、修正されている箇所の変更や、どこを修正しないといけないか、自分で見極めることも重要です。このプロセスは自身の学びにもつながります!

当初のプロトタイプでは、フォルダIDではなくPDFのファイルIDを使って作成していました。プロンプトの書き方によって生成されるスクリプトが変わるため、完成したスクリプトをChatGPTでチェックすると、エラーが指摘されることもあります。
作成中にズレが起きないように、明確で具体的なプロンプトを作成することが非常に重要です。

ChatGPTの学習モデルはGPT-3.5の場合、2021年9月までのデータが反映されています(※GPT-4は2023年4月まで)。Googleのアップデートなどにより、設定方法が変わっている場合があるので注意が必要です。

ChatGPTに依頼するスクリプトの中に個人のAPIキー等を含めるべきではありません。一度私が誤ってAPIキーを入力したところ、ChatGPTから「入力すべきでない」と怒られました。

多様な活用方法

今回作成したプロトタイプは、スプレッドシートにデータを1行ずつ転記する仕様で、これによりデータ活用の可能性が広がります。AppSheet1でアプリ化したり、Excel形式でダウンロードしてオフライン保存やメール送信など、多様な活用方法を探求しています。
さらに、有料サービスでしか不可能と思っていたOCR技術を用いて、長年の夢であったPDFからの自動転記(OCR)を自分の技術力で実現していきたいと思います!

ChatGPTとGASで変わる学習効率と新たな自動化への挑戦

Google Apps Script(GAS)を1から学ぼうとすれば1ヶ月以上かかるかもしれませんが、ChatGPTを利用することで、プログラミング経験がない私でもわずか1日で自動化を実現しました。このプロセスを通じてGASの操作を迅速に学ぶことができ、学習時間が大幅に削減されました。
様々なサービスを組み合わせて効果的なツールを開発できるのではと、新しいアイデアを考えることにもっと時間を使うことができるようになり、モチベーションが高まっています。既にGASを使用した自動化を3つ作りましたのでまたご紹介したいと思います!

  1. AppSheetとは、Google Cloudの一部であるノーコードプラットフォームです。このプラットフォームを使用すると、データベースやスプレッドシートから直接、カスタムモバイルアプリやウェブアプリを簡単に作成できます。プログラミングスキルは不要で、ビジュアルデザイナーとフォームベースのインターフェイスを通じてアプリを構築することが可能です。

38
27
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
38
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?