こんにちは!「クロウル」を運営している、藤井貴司です。
前回の記事では、スマートフォンで撮った写真から日付と合計金額を抽出する方法を紹介しました。
シリーズ第4回となる今回は、前回より複雑な「行の抽出(Extract row)」に挑戦します!
これをマスターするとあらゆる入力業務に活かせると思います。
ぜひ、最後までお付き合いください。
0.今回のゴール:請求書管理アプリ
請求書ファイルをアップロードすると、AIが「請求日」や「合計金額」といった単一のデータを抽出するだけでなく、「品名」や「数量」、「単価」といった複数行にわたる「明細行(テーブル)」をまるごと抜き出し、AppSheetの子テーブルに自動で保存するアプリを作成します。


1.準備:親子関係のあるテーブルの作成
「Extract row(行の抽出)」タスクは、「親テーブル(請求書)」と「子テーブル(明細行)」の2つのテーブルが、Refで正しく親子関係に設定されていることが必須です。
Googleスプレッドシートの準備
ファイル名は「請求書管理」で作成してください。
1枚目のシート(親)
シート名は「請求書」にし、1行目に以下の4つの列(ヘッダー)を作成してください。
- A1セル:ID(キー)
- B1セル:請求書ファイル(FileまたはImage型)
- C1セル:請求日(AIの出力先)
- D1セル:総合計(AIの出力先)

2枚目のシート(子)
シート名は「請求明細」にし、1行目に以下の5つの列(ヘッダー)を作成してください。
- 明細ID(キー)
- 請求書ID(親テーブル(請求書)のIDと連携するための列
- 品名(AIの出力先)
- 数量(AIの出力先)
- 単価(AIの出力先)

AppSheetアプリの作成
AppSheetで新しいアプリを作成し、先ほど作成した「請求書管理」スプレッドシートの「請求書」シートを読み込みます。
アプリが作成されたら、【Data】タブの【Add new Data】をクリックし、同じスプレッドシートから「請求明細」シートもアプリに追加してください。
テーブル(列)の設定
請求書テーブル(親テーブル)の設定
| 列名 | Type(型) | 設定のポイント |
|---|---|---|
| ID | Text | Key?にチェック |
| 請求書ファイル | File | PDFも扱うためFileを推奨 |
| 請求日 | Date | LABEL?にチェック |
| 総合計 | Price |

請求明細テーブル(子テーブル)の設定
| 列名 | Type(型) | 設定のポイント |
|---|---|---|
| 明細ID | Text | Key?にチェック |
| 請求書ID | Ref | Refの設定内容は下記を参照 |
| 品名 | Text | LABEL?にチェック |
| 数量 | Number | |
| 単価 | Price |

Refの設定
請求書ID列の「鉛筆マーク」をクリックし、「Source table」で「請求書」を選択します。
これで、「請求明細」テーブルは、「請求書」テーブルの子テーブルになりました。
下の画像と同じ設定にしてください。

請求書テーブルに【Related 請求明細s】という仮想列が自動で追加されていることも確認してください。

2.Automationの作成
アプリに「請求書明細抽出ボット」を作成します。
- AppSheetエディタの左側メニューから【Automation】タブ(ロボットのアイコン)をクリックします。
- 【Create a new automation】から新しいボットを作り、名前を「請求書明細抽出ボット」にします。
- 【Event】を作ります。
- 【Configure event】をクリック。
- イベント名を「請求書追加時」にします。
- 【Table】に請求書を選択。
- 【Data change type】を「Adds」のみにチェックを入れる

3.Taskの設定
今回は、【AI task】を2回(2ステップ)実行します。
- ステップA:単一の情報を抽出(前回の復習)
- ステップB:明細行を抽出(今回の本命)
ステップA:請求書(親)の情報を抽出するタスク
- 【+ Add a step】→ 【Step name】を「AI請求書ヘッダー抽出」にして、【Create a new step】をクリック
- 【AI task】を選択
- 【AI task(What AI will do with the data)】で「Extract」を選択
- 【Input column】に「請求書ファイル」を選択
- 【Output】に「請求日」と「総合計」を追加
- 【Additional instructions】に以下を入力
[請求日]: 請求日, Date
[総合計]: 合計金額, Total Amount


ステップB:明細行(子)の情報を抽出するタスク
- 【+ Add a step】→ 【Step name】を「AI明細行抽出」にして、【Create a new step】をクリック
- 【AI task】を選択
- 【AI task(What AI will do with the data)】で「Extract rows」を選択
- 【Input column】に「請求書ファイル」を選択
- 【Add rows to】に「請求明細」を選択
- 【Output】に「品名」と「数量」、「単価」を追加
- 【Additional instructions】に以下を入力
[品名]: 品名, 商品名, Item Description
[数量]: 数量, Qty
[単価]: 単価, Unit Price
これを入力することで、AIは「品名」、「数量」、「単価」をセットで探し出し、見つけた行の数だけ指定された子テーブル(請求明細)に新しい行を自動で作成します。
Refの設定により、それらの行は自動的に親テーブル(請求書)に紐づけられます。


4.保存とテスト
- Saveボタンをクリックして、アプリを保存します。
- テスト用の明細行がある請求書のPDFを用意します。
- 請求書フォームから、そのファイルをアップロードしてSaveします。
- AI処理が終わるのを待ちます。
【成功した場合の処理】
- 請求書テーブル(親)に1行のデータが追加され、「請求日」と「総合計」がAIによって入力されます。
- 請求明細テーブル(子)に請求書の明細行の数だけのデータが自動で追加され、それぞれ「品名」、「数量」、「単価」が入力されており、かつ、すべてが先ほどの親データに紐づいています。
5.Additional instructions(AIへの追加指示)
それでは、【Additional instructions(AIへの追加指示)】の書き方について説明します。
これを理解できれば、自分の思い通りにAIへ指示をすることができるようになります。
書式の構成
書き方の基本ルールは以下のようになっています。
[AppSheetの列名]: 書類上で探すべきキーワード, キーワードの別名
各パーツの解説
「:(コロン)」の左側と右側に分けて解説します。
- 左側
[AppSheetの列名]の部分:データの保存先(AppSheetの列)- これは、「請求明細(子テーブル)」の列名(カラム名)を指しています。
- 例:
[品名]は、AppSheet上の「品名」という列にデータを入れたい、という意味です。
- 右側「書類上で探すべきキーワード, キーワードの別名」の部分:AIが探す「目印」(書類上の文字)
- これは、アップロードする実際の請求書(画像やPDF)に書かれているであろう「項目名(見出し)」を指定しています。
- AIはこのキーワードを頼りに、その下や横にある実際の数値やテキストを読み取ります。
具体例を使った解説
今回、実際に記述した内容で説明します。
[品名]: 品名, 商品名, Item Description
意味: 「AppSheetの『品名』列には、請求書の中で『品名』または『商品名』、あるいは英語で『Item Description』と書かれている項目の値を抽出して入れてください」という指示です。
[数量]: 数量, Qty
意味: 「AppSheetの『数量』列には、書類上の『数量』または『Qty(Quantityの略)』と書かれている部分の数値を入れてください」という指示です。
[単価]: 単価, Unit Price
意味: 「AppSheetの『単価』列には、書類上の『単価』または『Unit Price』に対応する金額を入れてください」という指示です。
この記述は、「AIに対して、書類の読み方を教えるためのヒント」 です。
この設定を行うことで、AIは [品名] [数量] [単価] を1つのセットとして認識し、請求書に明細行が3行あれば、自動的に3行分のデータを子テーブルに追加してくれるようになります。
まとめ
いかがでしょうか?
うまく作成できましたか?
Refを使ったり、【AI task】を2回設定したりと複雑になりましたが、これが上手く使えるようになると、手入力による請求書処理のほぼ完全な自動化に期待ができると思います。
いろんな請求書を読み取ってみたり、読み取る内容を変更したりして、ぜひマスターしてください。

