背景
レンタル機器や貸出品を扱う業務では、返却期限がメール本文にだけ書かれていることがあります。注文確認、発送連絡、請求書など同じ案件のメールが増えると、検索できても「どの記載が確定情報か」を見落としがちです。
この記事では、Gmailから返却期限の候補を抽出し、Googleスプレッドシートへ一覧化する最小構成を紹介します。自動で確定・返信するのではなく、最後は人が原文を確認する設計です。
設計方針
- Gmail検索で候補を狭める
- 本文から日付らしい文字列を抽出する
- メールへのリンクと一緒にシートへ保存する
- 確定日・返却先・配送方法は人が確認する
期限管理では、誤検出よりも「根拠へ戻れること」が重要です。
Apps Script
スプレッドシートを作成し、拡張機能からApps Scriptを開いて次のコードを貼り付けます。
function collectReturnDateCandidates() {
const query = 'newer_than:90d ("返却日" OR "返却期限" OR "レンタル期間")';
const threads = GmailApp.search(query, 0, 50);
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('期限候補') || ss.insertSheet('期限候補');
if (sheet.getLastRow() === 0) {
sheet.appendRow(['取得日時', '送信元', '件名', '日付候補', 'メール']);
}
const knownIds = new Set(
sheet.getLastRow() < 2
? []
: sheet.getRange(2, 5, sheet.getLastRow() - 1, 1)
.getDisplayValues()
.flat()
.map(url => (url.match(/[#/]([0-9a-f]+)$/) || [])[1])
.filter(Boolean)
);
for (const thread of threads) {
for (const message of thread.getMessages()) {
const id = message.getId();
if (knownIds.has(id)) continue;
const body = message.getPlainBody();
const dates = extractJapaneseDates(body);
if (dates.length === 0) continue;
const url = 'https://mail.google.com/mail/u/0/#all/' + id;
sheet.appendRow([
new Date(),
message.getFrom(),
message.getSubject(),
dates.join(', '),
url
]);
knownIds.add(id);
}
}
}
function extractJapaneseDates(text) {
const patterns = [
/\b20\d{2}[\/-]\d{1,2}[\/-]\d{1,2}\b/g,
/20\d{2}年\s*\d{1,2}月\s*\d{1,2}日/g
];
const found = patterns.flatMap(pattern => text.match(pattern) || []);
return [...new Set(found)];
}
なぜ「候補」止まりにするのか
メールには発送日、到着予定日、利用開始日、返却日など複数の日付が含まれます。正規表現だけで意味まで断定すると、誤った日を予定に登録する危険があります。
そのため、一覧には次の情報を必ず残します。
- 送信元
- 件名
- 抽出した日付
- 元メールへのリンク
担当者は元メールを開き、返却先住所、元払い・着払い、同梱書類まで確認します。
運用を安定させる工夫
時間主導トリガーで1日1回実行できますが、最初は手動実行で検索結果を確認するのがおすすめです。また、機密情報を外部APIへ送らず、Google Workspace内で完結させる構成にしておくと管理しやすくなります。
期限そのものだけでなく、「返却先を確認する日」「梱包を始める日」も別に登録すると、当日に慌てることが減ります。
まとめ
メール起点の期限管理では、完全自動化よりも候補抽出+原文確認の組み合わせが安全です。小さな仕組みでも、検索時間と確認漏れを着実に減らせます。