【AppSheet】請求書管理アプリで「行の抽出(Extract row)」を学ぼう【AI task学習ガイド④】

GoogleAppsScript

こんにちは!「クロウル」を運営している、藤井貴司です。

前回の記事では、スマートフォンで撮った写真から日付と合計金額を抽出する方法を紹介しました。

シリーズ第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(型)設定のポイント
IDTextKey?にチェック
請求書ファイルFilePDFも扱うためFileを推奨
請求日DateLABEL?にチェック
総合計Price

請求明細テーブル(子テーブル)の設定

列名Type(型)設定のポイント
明細IDTextKey?にチェック
請求書IDRefRefの設定内容は下記を参照
品名TextLABEL?にチェック
数量Number
単価Price
Refの設定

請求書ID列の「鉛筆マーク」をクリックし、「Source table」で「請求書」を選択します。

これで、「請求明細」テーブルは、「請求書」テーブルの子テーブルになりました。

下の画像と同じ設定にしてください。

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

2.Automationの作成

アプリに「請求書明細抽出ボット」を作成します。

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

3.Taskの設定

今回は、【AI task】を2回(2ステップ)実行します。

  1. ステップA:単一の情報を抽出(前回の復習)
  2. ステップB:明細行を抽出(今回の本命)

ステップA:請求書(親)の情報を抽出するタスク

  1. 【+ Add a step】→ 【Step name】を「AI請求書ヘッダー抽出」にして、【Create a new step】をクリック
  2. 【AI task】を選択
  3. 【AI task(What AI will do with the data)】で「Extract」を選択
  4. 【Input column】に「請求書ファイル」を選択
  5. 【Output】に「請求日」と「総合計」を追加
  6. 【Additional instructions】に以下を入力
[請求日]: 請求日, Date
[総合計]: 合計金額, Total Amount

ステップB:明細行(子)の情報を抽出するタスク

  1. 【+ Add a step】→ 【Step name】を「AI明細行抽出」にして、【Create a new step】をクリック
  2. 【AI task】を選択
  3. 【AI task(What AI will do with the data)】で「Extract rows」を選択
  4. 【Input column】に「請求書ファイル」を選択
  5. 【Add rows to】に「請求明細」を選択
  6. 【Output】に「品名」と「数量」、「単価」を追加
  7. 【Additional instructions】に以下を入力
[品名]: 品名, 商品名, Item Description
[数量]: 数量, Qty
[単価]: 単価, Unit Price

これを入力することで、AIは「品名」、「数量」、「単価」をセットで探し出し、見つけた行の数だけ指定された子テーブル(請求明細)に新しい行を自動で作成します。
Refの設定により、それらの行は自動的に親テーブル(請求書)に紐づけられます。

4.保存とテスト

  1. Saveボタンをクリックして、アプリを保存します。
  2. テスト用の明細行がある請求書のPDFを用意します。
  3. 請求書フォームから、そのファイルをアップロードしてSaveします。
  4. 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に対して、書類の読み方を教えるためのヒント」 です。

この設定を行うことで、AIは [品名] [数量] [単価] を1つのセットとして認識し、請求書に明細行が3行あれば、自動的に3行分のデータを子テーブルに追加してくれるようになります。

まとめ

いかがでしょうか?
うまく作成できましたか?

Refを使ったり、【AI task】を2回設定したりと複雑になりましたが、これが上手く使えるようになると、手入力による請求書処理のほぼ完全な自動化に期待ができると思います。

いろんな請求書を読み取ってみたり、読み取る内容を変更したりして、ぜひマスターしてください。