「毎日のように届く報告メールを、一つひとつスプレッドシートに手作業で転記している…」
「単純作業なのに時間がかかってしまい、本来の業務が進まない…」
このようなお悩みをお持ちではないでしょうか。
日々の業務で発生するメールからの転記作業は、件数が増えるほど大きな負担になります。また、手作業によるコピー&ペーストは、入力ミスや転記漏れの原因にもなりかねません。
もし、この面倒な作業を自動化できるとしたら、どうでしょうか。
本記事では、Googleが提供するGmailとスプレッドシート、そしてGoogle Apps Script(GAS)というプログラミング言語を使って、特定のメールの内容を自動でスプレッドシートに転記する方法を、初心者の方にも分かりやすく解説します。
この記事を読み終える頃には、あなたも面倒な転記作業から解放され、より重要な業務に集中できるようになっているはずです。
まずは準備から!自動化の全体像と完成イメージ
本格的な設定に入る前に、まずは今回の自動化で何がどうなるのか、全体像を把握しておきましょう。
今回は、多くの企業で発生する「従業員からの勤怠報告メール」を例として解説します。
自動化の仕組み(全体像)
- 従業員が、決まった件名で勤怠報告メールを送信します。
- GASがGmailを定期的にチェックし、該当のメールを探します。
- メールを見つけたら、本文から「名前」「出勤時間」「退勤時間」などの情報を抜き出します。
- 抜き出した情報を、自動でスプレッドシートの所定の行に書き込みます。

この仕組みを作るために、まずは転記先となるスプレッドシートを準備しましょう。
転記先スプレッドシートの準備
Googleスプレッドシートを新規作成し、今回は以下のような見出し(ヘッダー)を1行目に作成します。ファイル名は「勤怠管理シート」とでもしておきましょう。
A列 | B列 | C列 | D列 | E列 | F列 | G列 |
処理日時 | 報告日 | 従業員名 | メール件名 | 出勤時間 | 退勤時間 | 業務内容 |

準備はこれだけで完了です。それでは、いよいよ自動化の心臓部であるGASを書いていきましょう。
はじめてGASをお使いになる方へ
この記事では、GASの基本的な操作(スクリプトエディタの開き方、コードの保存方法、実行許可の承認手順、トリガー設定など)についての説明は省略しています。
もしGASを初めて使う方や、基本操作に不安がある方は、まずはこちらの記事で基本をマスターしてから本記事を読むことをお勧めします。
【基本編】GASで勤怠報告メールを自動転記する
まずは、特定の決まったフォーマットで送られてくるメールを自動転記する、基本的な仕組みを作ります。
スプレッドシートからスクリプトエディタを開き、以下の手順に進んでください。
1. GASのコードをコピー&ペーストする
最初からコードを書くのは大変なので、まずは以下のコードをまるごとコピーして、スクリプトエディタに貼り付けてみましょう。元々書かれている function myFunction() { … } は消してしまって構いません。
// Gmailから勤怠報告メールを取得しスプレッドシートに転記する関数
function recordAttendance() {
// 1. 操作するスプレッドシートを取得
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('シート1');
// 2. Gmailから検索する条件を設定
// 検索条件:件名が「【勤怠報告】」で、まだ処理されていない(未読の)メール
const searchCondition = 'subject:【勤怠報告】 is:unread';
// 3. メールを検索して取得
const threads = GmailApp.search(searchCondition);
// 4. 取得したメールを1通ずつ処理する
threads.forEach(thread => {
const messages = thread.getMessages();
messages.forEach(message => {
// 5. メールの件名と本文を取得
const subject = message.getSubject();
const body = message.getPlainBody();
// 6. 正規表現で本文から情報を抽出
const date = extractData(body, /報告日\s*:\s*(.*)/);
const name = extractData(body, /氏名\s*:\s*(.*)/);
const startTime = extractData(body, /出勤時間\s*:\s*(.*)/);
const endTime = extractData(body, /退勤時間\s*:\s*(.*)/);
const workContent = extractData(body, /業務内容\s*:\s*([\s\S]*)/);
// 7. スプレッドシートに書き込む
if (name && date) { // 氏名と報告日が取得できた場合のみ書き込む
sheet.appendRow([
new Date(), // 処理した日時
date,
name,
subject, // メール件名
startTime,
endTime,
workContent
]);
}
// 8. 処理が終わったメールを既読にする
message.markRead();
});
});
}
// 正規表現を使ってテキストからデータを抽出する補助関数
function extractData(text, regex) {
const match = text.match(regex);
// マッチした場合(情報が見つかった場合)は、その部分を返す
// 見つからなかった場合は、空文字を返す
return match ? match[1].trim() : '';
}
2. コードの簡単な解説
貼り付けたコードが何をしているのか、少しだけ覗いてみましょう。
- const sheet = …: 操作の対象となるスプレッドシートのシート(今回は「シート1」)を指定しています。
- const searchCondition = …: Gmailからどんなメールを探すかの条件を決めています。ここでは「件名に【勤怠報告】が含まれる」「まだ読んでいない(is:unread)」メールを探す設定です。
- const subject = …: 取得したメールの件名を subject という変数に入れています。
- const body = …: 取得したメールの本文を変数 body に入れています。
- const date = extractData(…): extractData という命令を使い、メール本文(body)から正規表現というルール(/報告日…/ の部分)を使って情報を探しています。正規表現についての詳しい解説は、こちらの記事をご確認ください。
- sheet.appendRow([…]): 抜き出した各情報を、スプレッドシートの最終行に追加しています。
- message.markRead(): 処理が終わったメールを既読にします。これにより、同じメールを何度も転記してしまうのを防いでいます。
3. 実行前のテスト
コードを動かす前に、まずはテスト用のメールをご自身のGmailアドレスに送ってみましょう。
宛先: 自分
件名: 【勤怠報告】
本文:
お疲れ様です。
本日の勤怠を報告します。
報告日 : 2025/10/01
氏名 : 鈴木 一郎
出勤時間: 09:00
退勤時間: 18:00
業務内容:
・A社向け提案資料作成
・定例ミーティング
メールを送信したら、スクリプトエディタに戻り、 実行ボタンを押してください。
スプレッドシートを確認してみましょう。先ほどテストで送信したメールの内容が転記されていれば成功です!

これで、手動で実行すればメールの内容が転記されるようになりました。この処理を定期的に自動実行したい場合は「トリガー」を設定します。詳しい設定方法は、前述のGAS基本解説記事をご覧ください。
基本編はこれで完了です。お疲れ様でした!
【応用編】さらに便利にするためのカスタマイズ
基本編だけでも十分に便利ですが、ここではさらに実用性を高めるための応用テクニックを2つご紹介します。
応用1:複数フォーマットのメールに対応する
「勤怠報告メール」と「休暇連絡メール」のように、全く形式の異なる複数のメールを、同じスプレッドシートに転記したいケースに対応します。
この方法では、「1メールパターン = 1行」のルールで設定シートを作成し、GASがそれを読み込んで処理を振り分けます。メールの種類が増えても、設定シートに1行追加するだけで対応可能です。
1. パターン管理用のシートを準備する
まず、スプレッドシートに「設定」という名前のシートを新しく追加します。
そして、以下のようにヘッダーを作成し、それぞれのメールフォーマットの情報を1行で入力します。
A列 | B列 | C列 | D列 | E列 | F列 | G列 |
フォーマット名 | メール検索条件 | 報告日(Regex) | 氏名(Regex) | 出勤時間(Regex) | 退勤時間(Regex) | 業務内容(Regex) |
勤怠報告 | subject:【勤怠報告】 | 報告日\s*[::]\s*(.+) | 氏名\s*[::]\s*(.+) | 出勤時間\s*[::]\s*(.+) | 退勤時間\s*[::]\s*(.+) | 業務内容\s*[::]\s*([\s\S]+) |
休暇連絡 | subject:【休暇連絡】 | 取得日\s*[::]\s*(.+) | 申請者\s*[::]\s*(.+) | 理由\s*[::]\s*([\s\S]+) |

各列の役割
- フォーマット名 (A列): あなたが管理しやすいフォーマットの名前をつけます。
- メール検索条件 (B列): 処理の起点となる重要な項目です。 Gmailの検索ボックスで使える形式で、処理したいメールを特定する条件(例: subject:【勤怠報告】)を記述します。
- C列~G列: 各項目をメール本文から抜き出すための正規表現を記述します。対応する項目がないパターン(例: 休暇連絡の出勤時間)は、セルを空欄にしておきます。
(Regex)は「Regular Expression(レギュラーエクスプレッション)」の略で、正規表現を英語で表したものです。
2. GASコードを修正する
次に、この新しい「設定」シートを読み込んで動くようにGASコードを全面的に修正します。
基本編で作成した recordAttendance と extractData のコードを一度すべて削除し、以下のコードに差し替えてください。
// 【応用編】設定シートを元に複数フォーマットのメールを処理する関数
function recordAttendanceAdvanced() {
// 1. スプレッドシートの各シートを取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
const targetSheet = ss.getSheetByName('シート1');
const configSheet = ss.getSheetByName('設定');
// 2. 設定シートから全パターンの情報を読み込む (ヘッダーを除く)
const configValues = configSheet.getRange(2, 1, configSheet.getLastRow() - 1, 7).getValues();
// 3. 各パターン(設定シートの各行)を順番に処理する
configValues.forEach(row => {
// 設定シートから各列の値を取得
const formatName = row[0];
const searchCondition = row[1];
const dateRegex = row[2] ? new RegExp(row[2]) : null;
const nameRegex = row[3] ? new RegExp(row[3]) : null;
const startTimeRegex = row[4] ? new RegExp(row[4]) : null;
const endTimeRegex = row[5] ? new RegExp(row[5]) : null;
const workContentRegex = row[6] ? new RegExp(row[6]) : null;
// メールの検索条件がなければ、その行の処理をスキップ
if (!searchCondition) return;
// 4. 設定された条件で未読メールを検索
const threads = GmailApp.search(`${searchCondition} is:unread`);
// 5. 見つかったメールを1通ずつ処理
threads.forEach(thread => {
const messages = thread.getMessages();
messages.forEach(message => {
const subject = message.getSubject();
const body = message.getPlainBody();
// 6. 正規表現で各情報を抽出
const date = extractData(body, dateRegex);
const name = extractData(body, nameRegex);
const startTime = extractData(body, startTimeRegex);
const endTime = extractData(body, endTimeRegex);
const workContent = extractData(body, workContentRegex);
// 7. 氏名と報告日が取得できた場合のみスプレッドシートに書き込む
if (name && date) {
targetSheet.appendRow([
new Date(),
date,
name,
subject,
startTime,
endTime,
workContent,
]);
// 処理が成功したメールだけを既読にする
message.markRead();
}
});
});
});
}
// 正規表現を使ってテキストからデータを抽出する補助関数(変更なし)
function extractData(text, regex) {
// 正規表現パターンが指定されていない場合は空文字を返す
if (!regex) return '';
const match = text.match(regex);
return match ? match[1].trim() : '';
}
コードのポイント解説
この応用編のコードは、基本編と比べて少し複雑に見えますが、やっていることはシンプルです。
- まず「設定」シートに書かれた内容をすべて読み込みます。
- 次に、設定シートの1行目(勤怠報告のルール)を使って、該当するメールを探し、転記します。
- 1行目の処理が終わったら、次に2行目(休暇連絡のルール)を使って、同じようにメールを探して転記します。
- これを設定シートに書かれたルールの行数分、繰り返します。
このように、「設定シートに書かれたルールを上から順番に実行していく」という仕組みになっています。なので、新しいメールフォーマットを追加したくなったら、設定シートに1行書き加えるだけで対応できるのです。
最後に、トリガーを設定している場合は、実行する関数を新しい recordAttendanceAdvanced に変更するのを忘れないようにしましょう。
これで、より柔軟で拡張性の高い自動化の仕組みが完成しました。

応用2:メールの添付ファイルを取得する
「メールに添付されたファイルも、自動で整理・管理したい」という場合もあるでしょう。
ここでは、メールに添付されたファイルを自動でGoogleドライブの特定フォルダに保存し、そのファイルへのリンクをスプレッドシートに記録する方法を解説します。
1. 保存先Googleドライブフォルダを準備する
まず、添付ファイルを保存するためのフォルダをGoogleドライブに作成します。今回は「勤怠報告_添付ファイル」という名前のフォルダを作成しましょう。
フォルダを作成したらそのフォルダを開き、ブラウザのアドレスバーに表示されるURLに注目してください。末尾の英数字の羅列が、このフォルダの「フォルダID」になります。このIDを後でコードに設定するので、コピーしておきましょう。
https://drive.google.com/drive/folders/xxxxxxxxxxxxxxxxxxxxxxx ← この部分がフォルダIDです。
2. 転記先シートに見出しを追加する
次に、転記先シート(シート1)のH列に「添付ファイルリンク」という見出しを追加してください。
A列 | B列 | C列 | D列 | E列 | F列 | G列 | H列 |
処理日時 | 報告日 | 従業員名 | メール件名 | 出勤時間 | 退勤時間 | 業務内容 | 添付ファイルリンク |
3. コードを修正する
最後にGASコードを修正し、添付ファイルをGoogleドライブに保存してリンクを取得する処理を追加します。
1箇所目:フォルダIDを設定する
recordAttendanceAdvanced 関数の最初に、先ほどコピーしたフォルダIDを設定する行を追加します。
以下コードの緑字の箇所を、recordAttendanceAdvanced 関数に追加してください。
// 【応用編】設定シートを元に複数フォーマットのメールを処理する関数
function recordAttendanceAdvanced() {
// 添付ファイルの保存先Google DriveフォルダIDを指定
const FOLDER_ID = 'ここにコピーしたフォルダIDを貼り付け';
// 1. スプレッドシートの各シートを取得
const ss = SpreadsheetApp.getActiveSpreadsheet();
// ...(省略)

2箇所目:添付ファイルを処理する部分を追加・修正する
messages.forEach ループの中を修正します。
const body = message.getPlainBody(); の下に、添付ファイルを保存しリンクを取得する処理を追加し、targetSheet.appendRow にもファイルリンクの変数を追加します。
// ...(省略)
messages.forEach(message => {
const body = message.getPlainBody();
// 添付ファイルをDriveに保存し、リンクを取得
const attachments = message.getAttachments();
const fileUrls = attachments.map(attachment => {
const folder = DriveApp.getFolderById(FOLDER_ID);
const file = folder.createFile(attachment);
return file.getUrl();
});
const fileUrlsText = fileUrls.join(', '); // 複数の場合に備えカンマ区切りで結合
// 6. 正規表現で各情報を抽出
const date = extractData(body, dateRegex);
const name = extractData(body, nameRegex);
const startTime = extractData(body, startTimeRegex);
const endTime = extractData(body, endTimeRegex);
const workContent = extractData(body, workContentRegex);
// 7. 氏名と報告日が取得できた場合のみスプレッドシートに書き込む
if (name && date) {
targetSheet.appendRow([
new Date(),
date,
name,
subject,
startTime,
endTime,
workContent,
fileUrlsText // H列に添付ファイルリンクを追加
]);
// 処理が成功したメールだけを既読にする
message.markRead();
}
});
// ...(省略)

【重要】Drive APIの有効化
このコードを初めて実行する場合、GASのプロジェクト設定で「Google Drive API」を有効にする必要があります。
- スクリプトエディタの左側メニューから「サービス」の横にある「+」をクリックします。
- 一覧から「Drive API」を選択し、「追加」ボタンを押します。

これで設定は完了です。実行すると、メールの添付ファイルが指定したGoogleドライブのフォルダに自動で保存され、スプレッドシートにはそのファイルへの直通リンクが記録されるようになります。
補足:共有ドライブを利用する場合の注意点
保存先に共有ドライブ内のフォルダを指定することも可能です。その場合、スクリプトを実行するアカウントが、対象のフォルダに対して「投稿者」以上の権限(ファイルを新規作成できる権限)を持っている必要がありますのでご注意ください。
まとめ:単純作業は自動化して、価値ある仕事に時間を使おう
今回は、GASを使ってGmailの内容をスプレッドシートに自動転記する方法について、具体的な例を交えながら解説しました。
- GASを使えば、メールからの転記作業を自動化できる。
- 正規表現を活用することで、メール本文から必要な情報だけを正確に抜き出せる。
- 設定シートを工夫することで、「1パターン1行」のルールで複数フォーマットのメールにも柔軟に対応できる。
最初は少し難しく感じるかもしれませんが、一度設定してしまえば、これまで転記作業にかけていた多くの時間を節約できます。空いた時間で、より創造的で付加価値の高い業務に取り組むことができるようになるでしょう。
今回ご紹介したコードは、あくまで一例です。あなたの業務に合わせて、設定シートの項目を増やしたり、検索条件を工夫したりと、自由にカスタマイズすることが可能です。
ぜひ、この記事を参考に「業務自動化」の第一歩を踏み出してみてください。
※Googleサービスは、Google LLC の商標であり、この記事はGoogleによって承認されたり、Google と提携したりするものではありません。