[GAS]特定メールをシートへ自動転記・集約する方法
はじめに(課題の提示)
「毎日複数のサービスや関係者から届く特定メールを、チームで共有するために手動でスプレッドシートへコピペしている」
「重要な防災情報や連絡メールが個人の受信トレイに埋もれてしまい、迅速な共有ができない」
このようなお悩みはありませんか?
メールのチェックや転記作業は、単体では小さな作業に見えても、毎日積み重なると大きな時間的コストとなります。また、手動転記ではコピペミスや確認漏れといったヒューマンエラーを完全に防ぐことは困難です。
さらに、プログラム内にスプレッドシートIDや監視対象のメールアドレスを直接書き込んでしまうと、セキュリティ上の問題や運用変更時のメンテナンスの手間が発生します。
今回は、Google Apps Script(GAS)を活用し、スプレッドシートIDはプロパティ管理、検索条件は専用の設定シートで読み込む完全抽象化構成によって、安全かつ柔軟にGmailの未読メッセージをカテゴリ別へ自動転記する仕組みの構築方法を解説します。
今回構築する仕組みの概要
今回ご紹介するスクリプトは、スプレッドシート上の「設定」シートから検索クエリ(送信元アドレスなど)と出力先シート名のペアを動的に読み込み、条件に該当する未読メールを取得して自動追記します。
処理の流れは以下のステップです。
- スクリプトプロパティからスプレッドシートIDを取得(IDの直書きを防ぎセキュリティを担保)
- 「設定」シートから検索条件(クエリ)と出力先シート名のペアを自動取得
- Gmailから該当する未読スレッドを取得(負荷軽減のため取得件数を制限)
- メールの基本情報(受信日時・送信元・件名・本文抜粋・パーマリンク)を抽出し、処理済みメールを既読化
- 対応する各シートの最終行へ一括書き込み
ソースコード(コピペOK)
以下のコードをGoogle Apps Scriptのエディタに貼り付けてご使用ください。
/**
* ====================================================================
* Utility Module for GAS / Civic Tech Akita
* Copyright (c) Civic Tech Akita (https://akita-csmedia.com/)
*
* 本モジュールは Civic Tech Akita の留保知的財産権(自社資産)です。
* ライセンス・実装に関するお問い合わせ: https://akita-csmedia.com/?page_id=1476
* ====================================================================
*/
/**
* メールの自動転記メイン処理
* ※スプレッドシートの「設定」シートから検索ルールを読み込みます
*/
function fetchMailsToSpreadsheet() {
const props = PropertiesService.getScriptProperties();
const ssId = props.getProperty('SPREADSHEET_ID');
if (!ssId) {
console.error('エラー: スクリプトプロパティ "SPREADSHEET_ID" が設定されていません。');
return;
}
const ss = SpreadsheetApp.openById(ssId);
const configSheet = ss.getSheetByName('設定');
if (!configSheet) {
console.error('エラー: 「設定」シートが見つかりません。');
return;
}
// 設定シートの2行目以降からデータ(検索クエリ, 出力シート名)を取得
const lastRow = configSheet.getLastRow();
if (lastRow < 2) return;
const configData = configSheet.getRange(2, 1, lastRow - 1, 2).getValues();
configData.forEach(row => {
const [query, targetSheetName] = row;
if (query && targetSheetName) {
processMailSearch(ss, query, targetSheetName);
}
});
}
/**
* 個別の検索と書き込みを行うサブ関数
* @param {Spreadsheet} ss - 対象のスプレッドシートオブジェクト
* @param {string} query - Gmailの検索クエリ
* @param {string} sheetName - 書き込み対象のシート名
*/
function processMailSearch(ss, query, sheetName) {
const sheet = ss.getSheetByName(sheetName);
if (!sheet) {
console.warn(`警告: 書き込み先のシート "${sheetName}" が見つかりません。`);
return;
}
// 1. メール検索(直近20件の未読に限定して負荷軽減)
const threads = GmailApp.search(query, 0, 20);
if (threads.length === 0) return;
const messages = GmailApp.getMessagesForThreads(threads);
let rows = [];
// 2. データ抽出
for (let i = 0; i < messages.length; i++) {
const permalink = threads[i].getPermalink();
for (let j = 0; j < messages[i].length; j++) {
const msg = messages[i][j];
// 未読メッセージのみ処理対象とする
if (msg.isUnread()) {
rows.push([
msg.getDate(),
msg.getFrom(),
msg.getSubject(),
msg.getPlainBody().slice(0, 1000), // 本文切り出しによる文字数制限対策
permalink
]);
// 処理済みとして既読化
msg.markRead();
}
}
}
// 3. スプレッドシートへの一括追記
if (rows.length > 0) {
const lastRow = sheet.getLastRow();
sheet.getRange(lastRow + 1, 1, rows.length, 5).setValues(rows);
console.log(`${sheetName}: ${rows.length}件のメッセージを追加しました。`);
}
}
設定・導入のステップ
導入手順は以下の5ステップです。
ステップ1: スプレッドシートの作成とシート構成
- 連携用のGoogleスプレッドシートを新規作成(または準備)します。
- 1つ目のシート名を「設定」に変更し、以下のようにA列とB列へルールを記述します。
| A列 (検索クエリ) | B列 (出力先シート名) |
from:alert@example.com is:unread | 緊急通知 |
from:info@example.com is:unread | 連絡メール |
from:@news-domain.net is:unread | ニュース配信 |
- 出力先として指定した各シート(例: 「緊急通知」「連絡メール」「ニュース配信」)を作成します。
- 各転記先シートの1行目にヘッダー項目(
受信日時送信元件名本文メールリンク)を設定しておくとデータが整理しやすくなります。
ステップ2: スクリプトプロパティの設定
- スプレッドシートのメニューから [拡張機能] > [Apps Script] を開きます。
- 左側の歯車アイコン(プロジェクトの設定)をクリックします。
- 下部にある [スクリプト プロパティを追加] をクリックします。
- プロパティ名に
SPREADSHEET_ID、値に連携したいスプレッドシートのID(URLの/d/と/editの間の文字列)を入力して保存します。
ステップ3: コードの貼り付け
- エディタ画面に戻り、上記のソースコードをそのまま貼り付けて保存します。
ステップ4: テスト実行と権限の承認
- エディタ上部の関数選択で
fetchMailsToSpreadsheetを選択し、[実行] をクリックします。 - 初回実行時にGoogleアカウントへのアクセス許可(承認)を求めるポップアップが表示された場合は、内容を確認して承認を完了させてください。
ステップ5: 定期実行(トリガー)の設定
- エディタ左側の時計アイコン(トリガー)をクリックします。
- 右下の [トリガーを追加] を選択し、以下のように設定します。
- 実行する関数を選択:
fetchMailsToSpreadsheet - イベントの源泉を選択:
時間駆動型 - 時間型トリガーのタイプを選択:
分ベースのタイマーや時間ベースのタイマー(例: 10分おき、1時間おきなど)
- 実行する関数を選択:
- 保存します。
まとめ・導入のご案内
今回は、Gmailに届く特定メールをGoogle Apps Scriptを使ってスプレッドシートへ自動転記・集約する方法を解説しました。
本実装のポイントは以下の通りです。
- 完全なコードの抽象化: スプレッドシートIDを
PropertiesServiceで管理し、検索ルールを「設定」シートから読み込むことで、プログラムコード内からの環境固有データ排除を達成。 - 現場での運用性向上: 監視対象アドレスや書き込み先の追加・修正がスプレッドシートの入力だけで完結し、コード改ざんのリスクを防止。
- 処理の安定化: 取得制限、未読メッセージの厳密な判定、本文の切り出し処理(先頭1,000文字)により、GASの制限値オーバーやエラーを抑止。
日常のルーティン作業を自動化し、安全かつ高効率な業務環境の構築にぜひお役立てください。
