インボイス制度開始後、証憑管理がとっても面倒なfreeeloverです。
今回は、「連載:Googleドライブに保存したレシートを自動リネームする」をお届けします。
実現したいことは、スキャナやスマホでGoogleドライブに保存したPDFファイルを”勘定科目_支払日(yyyyMMdd形式)_支払金額_支払先”という命名規則に自動リネームすることです。
開発方針:GoogleのOCRとOpenAIのGPT APIを使う
スキャンしたPDF画像は、あくまで画像データなので、そのままでは支払日や支払金額などを抽出することはできません。
そこで…
- Drive APIのOCR機能でレシート内のテキストを抽出
- 抽出したテキストから必要な情報をGPT APIで抽出
- ↑で取得した情報をもとにPDFファイルをリネーム
というステップで進めてみたいと思います。
Googleドライブに保存したPDFファイルからOCRでテキスト取得
第1回の今回は、「Googleドライブに保存したPDFファイルからOCRでテキスト取得」に挑戦します。
Drive APIを有効にする
Google Apps ScriptでOCR機能を使用する場合は、プロジェクトでDrive APIを有効にする必要があります。
PDFファイルをテキストに変換するスクリプト
早速ですが、Google Apps Scriptを使ってPDFファイルをテキストに変換し、その内容をコンソールに出力する方法について解説します。
このスクリプトは、Google Drive上のPDFファイルをGoogleドキュメントに変換し、そのテキスト内容を抽出してログに出力しています。
/**
* 指定されたPDFファイルをテキストに変換し、その内容をコンソールに出力する関数
* Google Drive上のPDFファイルをGoogle ドキュメントに変換し、そのテキストを抽出してログに出力します
*/
function blogPdf2Text() {
// 指定された PDF ファイルを取得
const filePdf = DriveApp.getFileById('PDFファイルのIDをここに入力');
// 変換後のファイル名と MIME タイプの設定
const meta = {
name: filePdf.getName().replace(/\.pdf$/, ''), // 元のファイルの拡張子を削除
mimeType: MimeType.GOOGLE_DOCS, // Googleドキュメントファイルに変換
};
// OCR設定(日本語を指定)
const params = {
ocrLanguage: 'ja'
};
// PDFファイルをGoogleドキュメントに変換
const docTemp = Drive.Files.create(meta, filePdf.getBlob(), params);
// 変換されたドキュメントからテキストを取得
const text = DocumentApp.openById(docTemp.id).getBody().getText();
// 一時的に作成されたドキュメントを削除
DriveApp.getFileById(docTemp.id).setTrashed(true);
// テキストをコンソールに出力
console.log(text);
}
Drive APIのFiles.createメソッドを用いてPDFファイルから新しいGoogleドキュメントファイルを作成しています。
このcreateメソッドの引数には(ファイルのメタ情報, blobオブジェクト, オプションパラメータ)を渡します。
多くの日本語のブログ記事のスクリプトではエラーになる
ここで注意点というか、私もハマった点ですが、2024年1月現在で「GASでOCRする方法」を検索して出てくるブログ記事内のスクリプトだとエラーになります。
理由としては、Drive APIのバージョンがアップデートされたためで、Drive APIのバージョンを古いものを指定すると動くのではないかと思います(試してません)。
現在はv3となっていますので、このバージョンに対応したパラメータを引数に渡してあげる必要があります。
参考:Apps Script Drive.Files.insert not a function
メタ情報とオプションパラメータ
まずメタ情報で、変換後のファイル名とMIMEタイプを設定しています。ファイル名からはPDFの拡張子が削除され、MIMEタイプはGoogleドキュメントに設定します。
// 変換後のファイル名と MIME タイプの設定
const meta = {
name: filePdf.getName().replace(/\.pdf$/, ''), // 元のファイルの拡張子を削除
mimeType: MimeType.GOOGLE_DOCS, // Googleドキュメントファイルに変換
};
オプションパラメータでは、PDFファイルをGoogleドキュメントに変換する際にOCR(光学文字認識)を行うための設定をします。
ocrLanguageに’ja’(日本語)を指定し、変換するPDFファイルの言語を設定します。
一時的にGoogleドキュメントファイルを作成し、削除する
まずDrive APIのFiles.createメソッドを用いてPDFファイルをGoogleドキュメントに変換し、その後、変換されたドキュメントからテキスト内容を取得します。
テキストを取得した後は、ドキュメントファイルは不要なので、すぐに削除します。
// PDFファイルをGoogleドキュメントに変換
const docTemp = Drive.Files.create(meta, filePdf.getBlob(), params);
// 変換されたドキュメントからテキストを取得
const text = DocumentApp.openById(docTemp.id).getBody().getText();
// 一時的に作成されたドキュメントを削除
DriveApp.getFileById(docTemp.id).setTrashed(true);
無事にログ出力されました
ある日のコンビニのレシートを読み込ませたところ、無事にログ出力されました。
おわりに
今回は、ネットの情報が古くてかなりハマりました。そして困ったときのstack overflowが本当に助かります。同じように困っている誰かの目に触れますように。
シリーズ目次
- Googleドライブに保存したレシートを自動リネームする その1 – ドライブに保存したPDFからOCRでテキスト取得
- Googleドライブに保存したレシートを自動リネームする その2 – GASとOpenAI APIを使って質問に答えてもらう
- Googleドライブに保存したレシートを自動リネームする その3 – プロンプトとモデルを調整してJSON形式で応答結果を得る
- Googleドライブに保存したレシートを自動リネームする その4 – フォルダ内のすべてのPDF・画像ファイルをリネームする
Google Apps Scriptを勉強したい方へ
この記事を見て、GASを勉強したいなと思われた方はぜひノンプログラマーのためのスキルアップ研究会(通称 ノンプロ研)にご参加ください。私も未経験からこの学習コミュニティに参加し、講座を受講したことでGASが書けるようになりました。
学習コミュニティ「ノンプログラマーのためのスキルアップ研究会」
挫折しがちなプログラミングの学習も、コミュニティの力で継続できます。ノンプロ研でお待ちしております!
※入会時にfreeelover.comを見て入りました!と言うと、私がちょっぴりお小遣い的なのがもらえるので、私が喜びます。
Amazon欲しい物リスト公開しています。
ブログのモチベーションアップのためにAmazon欲しい物リストを公開しております。役に立ったよ!という方で、感謝の気持ちを示したい方は、何かいただけると嬉しいです笑