Macのメールに毎日届く添付Excelを自動で取り込む方法|着信時刻の実測で実行時刻を決め、古い版で上書きしない設計
Macのメールに毎日届く添付Excelを自動で取り込む方法|着信時刻の実測で実行時刻を決め、古い版で上書きしない設計
取引先や本部から、売上集計のExcelが毎日メールで届く。それを開いて所定のフォルダへ保存し直す作業が、毎日人の手に残っている。店舗ビジネスや多店舗展開の現場では、よくある状況です。POSレジや基幹システムのAPI(外部から自動でデータを取り出す窓口)の権限がもらえず、「自動化は無理」とあきらめているケースも少なくありません。
先に結論を書きます。
- Macでは、メールアプリが手元に保存しているメールを、決まった時刻に動くスクリプトで読み、添付のExcelを所定のフォルダへ保存することで自動化できる。メールの転送設定や、送り手側の変更は要らない
- システムの権限が無くても、毎日届いている添付はそれ自体が安定したデータの入口になる。まず「誰から・どの件名で・いつ届いているか」を過去のメールで棚卸しする
- 実行時刻は勘で決めない。過去の着信時刻を実測し、最も遅い時刻に余裕を足して決める
- 添付が「同じ名前で中身が毎日増えていく累積ファイル」なら、同じ名前で置き換える。取りこぼしても翌日に追いつく
- 置き換える前に検証し、古い版で上書きしない。「届いていない」は営業日で数える
以下、Macのメールアプリに届く売上集計を毎日取り込んでいる実例で説明します。
権限が無くても、データはメールで届いている
実例は、東海地方で多店舗展開している小売の現場です。売上データを集計画面に反映したいものの、POSレジ側のAPI権限は依頼中のまま返事が無い状態でした。一方で、取引先の担当者から平日ほぼ毎日、「販売集計」という件名のメールにExcelが添付されて届いていました。
過去のメールを調べた結果です。
| 項目 | 実測 |
|---|---|
| 走査したメール | Macのメールアプリに保存された約20万通 |
| 差出人が該当する件数 | 70通 |
| うち件名が一致する集計メール | 58通(返信の形で同じスレッドが続いている) |
| 届く曜日 | 平日ほぼ毎日(土日祝は届かない) |
| 添付の中身 | 1日1シートずつ増えていく累積のExcel |
データは毎日届いていて、止まっていたのは「添付を開いて所定のフォルダへ置く」という人の作業だけでした。ここを自動にすれば、権限の返事を待たずに売上の反映を毎日回せます。
実行時刻は、着信時刻の実測から決める
いちばん大事な判断が、取り込みを何時に実行するかです。勘で決めると、まだ届いていない時刻に探しに行って空振りすることが続きます。
過去のメールから着信時刻を並べる
58通の着信時刻を並べると、9時22分〜14時51分に散らばっていて、中央値は12時台でした。直近の実績もこの範囲に収まっています。
| 日付 | 着信時刻 |
|---|---|
| 9月14日(月) | 13:05 |
| 9月15日(火) | 11:04 |
| 9月16日(水) | 13:30 |
| 9月17日(木) | 13:15 |
| 9月18日(金) | 11:28 |
| 9月24日(木) | 12:13 |
| 9月25日(金) | 12:42 |
※9月19日〜23日は土日と祝日の連休で、メールは届いていません。
人が手で送るメールは、その日の仕事の流れで時刻がずれます。毎日同じ分に届く前提は置かないほうが安全です。
最遅の時刻に余裕を足す
この現場では、在庫や受注の取り込みを朝6時45分〜8時に済ませていました。しかし集計メールは昼前後に届くため、朝の処理には乗りません。そこで朝の処理とは別に、15時30分の取り込みを1本足しました。
根拠は、観測された最遅の14時51分から約40分の余裕があることです。15時ちょうどにすると余裕は9分しかなく、少し遅れた日にすぐ空振りします。
「待ち受け型」と「定時1回型」
届く時刻がばらつくデータには、一定時刻から10分おきにファイルの有無を確かめ、届いた時点で処理する待ち受け型もあります。同じ現場の以前の週次処理では、ファイルの書き出し時刻が9時46分〜12時41分とばらついたため、10時から10分おきに確認し、15時までに届かなければ通知して終える作りにしていました。
| 方式 | 向いている場面 |
|---|---|
| 待ち受け型(届くまで数分おきに確認) | 届いたらできるだけ早く反映したい |
| 定時1回型(最遅+余裕の時刻に1回) | 数時間遅れても困らない。仕組みを単純にしたい |
日次の売上反映は夕方までに画面に載れば十分なので、定時1回型を選んでいます。
取り込みの設計で決めておく5つのこと
1. メールを特定する条件は、設定ファイルに外出しする
差出人・件名・添付ファイル名の条件は、プログラムに書き込まず設定ファイルに分けます。
- 差出人:アドレスの部分一致
- 件名:「販売集計」を含む(返信の「RE:」の有無は問わない)
- 添付名:新しい形式のファイル名を優先し、見つからなければ旧形式を探す
- 対象期間:直近14日のメールだけ
この現場では、8月末まで届いていた旧形式のExcelが、9月から別の名前・別の形式に切り替わりました。優先順つきの添付名パターンにしておけば、どちらの形式で届いても拾えます。直近14日に限るのは、古いメールの添付で新しいデータを上書きしないためです。
2. 累積ファイルは「同じ名前で置き換え+退避」
シートが毎日1枚ずつ増えていく累積ファイルを、日付をつけて毎日別ファイルとして保存すると、同じ日付のシートが複数のファイルに重複して現れ、二重計上の原因になります。
そこで、配置先では同じ名前のファイルを置き換え、前の版は配置先の中の退避用サブフォルダへ5世代まで残します。集計側は配置先の直下だけを読むので、退避ファイルが集計に紛れ込むことはありません。
累積ファイルには、取りこぼしても翌日に自動で追いつく利点があります。実際に、ある日の取り込みで添付を取り出せなかったときも、翌日の添付で9月1日〜24日の24枚のシートがそろい、欠けは1日の遅れで済みました。仕組みを動かした初日にも、販売データが3日分まとめて前進しています。中身が既存と同じなら何もしない作りにしておけば、何度実行しても結果は変わりません。
3. 置き換える前に検証し、古い版で上書きしない
添付は一時フォルダに保存して検証し、通ったものだけを配置します。
| 見るところ | 落とす条件 |
|---|---|
| サイズ | 5,000バイト未満 |
| 形式 | Excelとして開けない |
| 中身 | 日付として読めるシートが1枚も無い |
| 後退 | 既存のファイルよりシート数が少ない |
4つ目が累積ファイルならではの検証です。送り手が誤って古い版を添付しても、シート数が減っていれば採用せず、既存のファイルをそのまま使います。検証の考え方はPOSレジの在庫CSVを毎朝自動で取り込む方法でも詳しく書いています。
4. 「届いていない」は営業日で数える
土日祝に届かないのは正常です。カレンダーの日数で数えると、連休のたびに警告が出て、そのうち誰も警告を見なくなります。
この現場では、最後に届いた日から土日祝を除いて何営業日たったかを数え、3営業日以上届いていないときだけ警告を出しています。9月の連休中(22日・23日)の実行でも、最終受信は9月18日のまま「0営業日前=正常範囲」と判定されていました。祝日は設定ファイルに日付を並べて持たせています。
5. 同じ日に2回動く後続処理を確かめる
午後の取り込みの後に集計画面の更新まで流すと、朝と合わせて後続の処理が1日2回動きます。その中にAIによる文章生成のような実行するたびに費用がかかる工程があるなら、午後の実行では常に飛ばす指定を入れておきます。
Macのメールアプリから添付を読むときの注意
仕組みは、macOS標準の定時実行(launchd)で決まった時刻にスクリプトを起動し、メールアプリが保存しているデータを読むだけです。受注メールをGmailへ転送する方式などとの比較は、Gmailに他社メールを取り込む機能が終了した後の受注メール集約で解説しています。
- 読むだけにする:メールアプリの保存データには一切書き込まない
- 差出人で先にファイルを絞る:約20万通を1通ずつ開くのは現実的ではない。差出人のアドレスを含むファイルを文字列検索で先に絞る。この現場では候補の一覧まで約2分
- 読み方を2段構えにする:差出人の欄に改行が混ざるなど、規格から外れたメールがある。厳格な読み方だけだとその1通で走査全体が止まるので、失敗したら緩い読み方で読み直し、それでも読めないものは飛ばす
- 添付名を復元してから照合する:日本語の添付名は
=?iso-2022-jp?B?...のような符号化された形で入っていることがある - パスの空白に注意する:保存フォルダには「Sent Messages」のように空白を含む名前がある。検索結果は1行1件として分ける
- 検証中のファイルを配置先に置かない:集計側が読んでしまう。また拡張子を
.xlsx.partialのように変えると、Excelを読むライブラリが「開けない」と誤判定することがある。一時ファイルはシステムの一時フォルダに元の名前で置く
メールアプリの保存データはmacOSの保護対象のため、実行するアプリに「フルディスクアクセス」の許可が必要になる場合があります。また、Macがスリープ中や電源オフだと、その時刻に実行されない場合があります。実行時刻にMacが起動していて、メールアプリが受信していることが前提です。
運用で想定しておくリスクと予防
「届いていない」と「届いたのに読めない」を区別する
添付の名前はメール一覧に見えているのに、中身を取り出せない日がありえます。実例でも1日発生しました(翌日の累積添付で追いついています)。未着の警告を「最後にメールが届いた日」から数えている場合、メールが毎日届いている限り警告は出ません。このとき「未着(土日祝なら正常)」と同じ表示で終わると、気づく手段がありません。「メールが無い」「添付が無い」「添付を読めない」「検証に落ちた」は、別々の表示と終了コードに分けておきます。
添付に「前日分まで」しか入っていない
この現場の添付は、送られた日の前日までの売上が入る運用でした。月曜〜日曜の週次集計は、翌週の最初のメールが届くまで確定しません。取り込み側では解決できないので、送り手に「当日分まで含めて出してもらえるか」を相談するか、確定が1営業日遅れる前提で報告日を決めます。
祝日リストの期限切れ・形式の変更
手入力の祝日リストは、登録した期間が終わると祝日を平日として数え、誤った警告を出します。リストの最終日をカレンダーに登録し、年に1回更新します。送り手のシステムが変わって添付の名前や列が変わる場合に備え、列は見出しの名前で読む作りにしておきます。拾えなかったときは配置せず、既存のデータのまま動かします。取り込み後の金額の確かめ方は売上データを取り込んだら金額が合わないときの原因で解説しています。
APIの権限が下りれば、送り手の作業に頼らない取得に切り替えられます。検証と配置の仕組みはそのまま使えるので、入口だけを差し替えられる作りにしておくと移行が楽です。
まとめ
- 過去のメールを棚卸しする:誰から・どの件名で・どんな添付が・いつ届いているか
- 実行時刻は最遅+余裕で決める:着信9時22分〜14時51分に対して15時30分
- 条件は設定ファイルに外出しする:差出人・件名・添付名(優先順つき)・対象期間
- 累積ファイルは同名で置き換え、前の版は退避する
- 置き換える前に検証する:シート数が減った添付は採用しない
- 未着は営業日で数え、「読めない」とは区別する
システムの権限が無いことは、自動化をあきらめる理由にはなりません。自社の現場で「毎日届いているのに手で置き直しているファイル」があれば、そこが最初に自動化する候補です。