請求書がメールで届き、担当者が添付を開いて、対象ごとのフォルダに手で保存する。どこの経理・総務でもある作業です。これを自動化しようとすると、「AI にメールを読ませて、どの対象の請求書かを判別させればよい」と考えがちです。物流・運輸の会社でこの作業を自動化したとき、frectas は AI に判別させない 設計を選びました。どの対象の請求書かの判断は担当者に残し、添付の保存と、対象ごとのフォルダへのコピーを、Gmail と Google Apps Script(GAS)で自動にしています。生成 AI は使っていません。それでも、仕分けの作業が半減したと顧客に報告しています。この記事では、なぜ AI を使わなかったのか、仕組みをどう作るのか、そして生成 AI を使う所と使わない所をどう分けるのかを書きます。
この記事の数字は、frectas の案件の記録(顧客への報告など)によるもので、区分を添えています。
導入前の作業
この会社では、取引先から請求書がメールで届きます。担当者は、メールを開いて、どの対象(費用を計上する単位)の請求書かを判断し、添付ファイルを保存して、対象ごとのフォルダに整理していました。
作業を分解すると、次のようになります。
- 請求書のメールに気づく
- 本文と添付を見て、どの対象の請求書かを判断する
- 添付ファイルを保存する
- 対象ごとのフォルダを探して、そこに入れる
- 処理したことが分かるようにする
このうち 2 以外は、毎回同じ手順の繰り返しです。
AI に判別させなかった理由
2 の判断も AI に任せれば、1 から 5 まで全部を自動にできるように見えます。しかし、この案件では取引先ごとにメールの形式がばらばらで、AI にどの対象の請求書かを判別させても精度が出にくいと判断しました。そこで、AI による判別は使わず、判断は人に残すことにしました。
一般論として、振り分けの作業には、誤りに気づきにくいという性質もあります。間違ったフォルダに入った書類は、そのフォルダを開くまで誰も気づきません。AI が「分かりません」と言ってくれれば人が拾えますが、もっともらしく別の対象を答えると、誤りが静かに混ざります。判断の誤りが後から見つけにくい作業は、判断を人に残す ほうが安全です。
作業は次のように分けました。
| 工程 | 担当 | 理由 |
|---|---|---|
| 請求書のメールに、決まったラベルを1つ付ける | 人 | 取り込むメールを人が決める |
| 件名の名前で作業用のフォルダを作り、添付を原本のまま保存する | 仕組み(GAS) | 決まった手順の繰り返し |
| 処理済みのラベルを付ける。添付がないメールには「添付なし」のラベルを付ける | 仕組み(GAS) | 二重の保存を防ぎ、添付がないメールに気づけるようにする |
| どの対象の請求書かを判断し、フォルダ名を「対象_請求書番号_金額」の形に整えて、承認済みのフォルダへ移す | 人 | 形式がばらばらで、AI の判別は精度が出にくいと判断した |
| 承認済みのフォルダから、対象ごとのフォルダへコピーする | 仕組み(GAS) | 毎回同じ結果になるべき作業 |
仕組みの形
流れは次の4段です。
- 担当者が、請求書のメールに決まったラベルを1つ付ける(例: 「請求書/取り込み」)
- GAS が定期的に、ラベルが付いていて、まだ処理していないメールを探す。件名の名前で作業用のフォルダの中にフォルダを作り、添付を原本のまま(形式を変えずに)保存して、処理済みのラベルを付ける。添付がないメールには「添付なし」のラベルを付ける
- 担当者が、フォルダの名前を「対象_請求書番号_金額」の形に整え、承認済みのフォルダへ移す
- GAS が定期的に、承認済みのフォルダにあるフォルダを、対象ごとのフォルダへ自動でコピーする。コピーしたフォルダの ID を記録しておき、二重にコピーしないようにする
人が判断するのは、ラベルを付ける段階ではなく、3 のフォルダ名を整える段階です。ラベルは「このメールを取り込む」という印で、どの対象かは区別しません。担当者は Gmail と Google ドライブの画面から離れずに済み、新しいツールを覚える必要もありません。
書き方の例
考え方が分かるよう、簡単な例を示します。考え方を示すために単純にした例で、実案件のコードや手順とは違います。
// 設定は、ここに一か所でまとめる
const CONFIG = {
inputLabel: '請求書/取り込み',
doneLabel: '請求書/取り込み済み',
noAttachmentLabel: '請求書/添付なし',
workFolderId: '作業用フォルダのID',
approvedFolderId: '承認済みフォルダのID',
targetFolders: { '対象A': '対象AのフォルダID', '対象B': '対象BのフォルダID' },
};
// 1. ラベルの付いたメールの添付を、件名の名前のフォルダに原本のまま保存する
function importInvoiceMails() {
const done = getOrCreateLabel(CONFIG.doneLabel);
const noAttachment = getOrCreateLabel(CONFIG.noAttachmentLabel);
const work = DriveApp.getFolderById(CONFIG.workFolderId);
const query = `label:"${CONFIG.inputLabel}" -label:"${CONFIG.doneLabel}" -label:"${CONFIG.noAttachmentLabel}"`;
for (const thread of GmailApp.search(query, 0, 50)) {
const files = thread.getMessages().flatMap((m) => m.getAttachments({ includeInlineImages: false }));
if (files.length === 0) {
thread.addLabel(noAttachment); // 人が気づけるように残す
continue;
}
const folder = work.createFolder(thread.getFirstMessageSubject());
for (const file of files) folder.createFile(file.copyBlob());
thread.addLabel(done);
}
}
// 2. 人が名前を整えて承認済みのフォルダへ移したものを、対象ごとのフォルダへコピーする
function copyApprovedFolders() {
const props = PropertiesService.getScriptProperties();
const copied = JSON.parse(props.getProperty('copiedFolderIds') || '[]');
const folders = DriveApp.getFolderById(CONFIG.approvedFolderId).getFolders();
while (folders.hasNext()) {
const folder = folders.next();
if (copied.includes(folder.getId())) continue; // フォルダの ID で二重コピーを防ぐ
const targetId = CONFIG.targetFolders[folder.getName().split('_')[0]];
if (!targetId) continue; // 名前の形が違うものは、人が直すまで残す
const dest = DriveApp.getFolderById(targetId).createFolder(folder.getName());
const files = folder.getFiles();
while (files.hasNext()) files.next().makeCopy(dest);
copied.push(folder.getId());
}
props.setProperty('copiedFolderIds', JSON.stringify(copied));
}
function getOrCreateLabel(name) {
return GmailApp.getUserLabelByName(name) || GmailApp.createLabel(name);
}
この2つの関数に時間主導のトリガーを設定すれば、ラベルを付けたメールの添付がフォルダに入り、承認済みのフォルダへ移したものが対象ごとのフォルダにコピーされます。
運用で効く3つの工夫
- 処理済みの印で二重の保存・コピーを防ぐ。 メールは処理済みのラベルで、フォルダは ID の記録で、同じものを二度扱わないようにします。ID で記録しておけば、人がフォルダの名前を変えても二重にコピーされません
- 処理できなかったものを見える場所に残す。 添付がないメールは「添付なし」のラベルで Gmail の画面に残ります。黙って読み飛ばすと、請求書が保存されていないことに誰も気づきません
- 設定を一か所にまとめる。 ラベル名とフォルダの対応を一か所に書いておけば、対象が増えたときも、作った人がいなくなったときも、引き継ぎやすくなります
GAS の上限に気をつける
GAS には、1回の実行時間や、Gmail を読み書きできる回数に上限があります。Google の公開している資料では、スクリプトの実行時間は1回6分まで、Gmail の読み書き(送信を除く)は個人のアカウントで1日20,000回、Google Workspace のアカウントで1日50,000回とされています(末尾の「参考にした情報」を参照。上限は変わることがあります)。
一度に扱うメールの数を区切る(例では一度の検索で50スレッドまで)、処理済みのメールを検索の対象から外す、といった作りにしておけば、ふだんの請求書の量で上限に当たることはまずありません。メールが大量にたまった状態で最初に動かすときだけ、何回かに分けて流します。
効果
| 項目 | 数字 | 区分 |
|---|---|---|
| 請求書メールの仕分け作業 | 半減 | 顧客への報告に記載 |
どの対象の請求書かの判断は人に残したまま、仕分けの作業が半減したと顧客に報告しています(顧客への報告に記載)。
生成 AI を使う所と使わない所
同じ物流・運輸の会社の支援では、生成 AI を使った業務と、あえて使わなかった業務があります。請求書の仕分けは「使わない」側です。比べると、分け方の基準が見えてきます。
| 業務 | 生成 AI | 理由 |
|---|---|---|
| 請求書メールの添付の仕分け | 使わない(どの対象かの判断は人) | 形式がばらばらで、AI の判別は精度が出にくいと判断した |
| 週次の債権レポート | 使わない(決まった処理) | 入力ファイルの値と前週からの機械的な延長で結果が決まる |
| メールから契約上の控除に関わる情報を探す | 使う | 請求書の側に正解があり、AI の精度が多少低くても人が拾える |
| ニュースレターの要約 | 使う | 人が読んで使う前提の下書きで、多少の揺れは許される |
ここから、判断の目安を3つにまとめられます。
- AI の出力を確かめる正解が、別にあるか。 あれば、AI の精度が多少低くても使えます。控除の確認は、請求書という正解が手元にあるので、AI が探したメールを人が見て拾えます
- 同じ入力から、毎回同じ結果が出るべきか。 そうなら、AI の推論は使わず、決まった処理にします。債権レポートやフォルダへの振り分けがこれにあたります
- 誤りに、後から気づけるか。 気づきにくいなら、判断を人に残すか、AI の出力を人が確かめてから使う流れにします。振り分けのような作業は、一般にこの性質を持ちます
控除の確認では、AI の使い方も比べてから決めました。メールを受信したときに AI が判定して記録する方式は、取りこぼすと致命的です。メールをためておき、請求書を受け取ったときに AI が関連するメールを探す方式なら、正解が手元にあるので取りこぼしに気づけます。後者の方式で、1日100分超の作業削減を見込んでいます(見込み。検証中)。
「AI を使うかどうか」ではなく「誤りをどこで拾えるか」から考える と、同じメールの業務でも答えが分かれます。業務ごとの判断の詳しい中身は「物流・運輸の定型業務を AI 化した記録」に書いています。
こんな会社に向いている
- 請求書・見積書・納品書がメールで届き、添付を手でフォルダに保存している
- 振り分け先の判断は担当者ならすぐできるが、保存とフォルダ探しに時間がかかっている
- Gmail と Google ドライブを使っている(Microsoft 365 でも、同じ考え方で作れます)
- いずれ AI で判別させたいが、まずは誤りの起きない形で手間を減らしたい
人がフォルダ名を整え続けるうちに、「どのメールがどの対象の請求書か」というデータがたまります。将来、AI に判別の候補を出させる場合も、このデータが正解として使えます。最初から全部を自動にしなくても、後から AI を足せる形にしておくことができます。
参考にした情報
- Google「Quotas for Google Services(Apps Script)」: https://developers.google.com/apps-script/guides/services/quotas (確認日 2026-10-22)
請求書メールの仕分けのような小さな自動化は、1業務から頼める定額のメニュー「小さな業務の自動化」で承っています。部署ごとの業務を順に AI 化・自動化していきたい場合は「FDE 型の伴走支援」をご覧ください。いまの手順と、使っているメール・ストレージのサービスをお問い合わせから教えていただければ、どこまでを仕組みに任せられるかをお答えします。