0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GASで自動化!Gmailのラベル(AAA&BBB)メールをスプレッドシートに転送する完全スクリプト

Last updated at Posted at 2025-02-05

導入

Gmailで特定のラベルを使ってメールを整理したいことってありますよね?例えばラベル「AAA」や「BBB」を付けたメールだけを一覧にして管理したい場合などです。しかし毎回手動でメールを探してコピーするのは正直大変…。そこでGoogle Apps Script (GAS) を使って、この作業を自動化してみましょう!GASを使えば、指定したラベルの付いたメールを自動で取得してスプレッドシートに整理できます。面倒な手作業とサヨナラして、効率化を図りましょう👍

事前準備

まずはスクリプトを動かすための準備をします。以下の二つを設定してください。

1. Gmailでラベル「AAA」「BBB」を用意
対象とするGmailのラベル(ここでは例としてAAABBB)をあらかじめ作成し、整理したいメールに適用しておきます。ラベルはGmail画面の左メニュー「新しいラベルを作成」から作れます。すでにこれらのラベルを使っている場合はそのままでOKです。

2. スプレッドシートとDriveフォルダのセットアップ
次に結果を保存するGoogleスプレッドシートと、その保存先となるGoogleドライブのフォルダを準備します。

  • フォルダ作成とID取得: Googleドライブ上で任意のフォルダを1つ作成し、そのフォルダIDをメモします。フォルダIDは、ブラウザのURL(https://drive.google.com/drive/folders/xxxxxの「xxxxx」の部分)に表示される英数字です。今回はこのフォルダにスクリプトが出力するスプレッドシートを保存します。
  • スプレッドシート: 空のスプレッドシートファイルを作成しても良いですが、スクリプト側で自動作成するので省略可能です(手動で作成する場合は先ほど用意したフォルダに入れておいてください)。

以上で下準備はOKです。それでは実際にGASのコードを書いていきましょう。

完全なGASスクリプト(コピペOK!)

ここからは実際のGoogle Apps Scriptコードを示します。Googleスプレッドシートのメニューから「拡張機能 > Apps Script」を開くか、直接Apps Scriptエディタを開いて、新しいプロジェクトに以下のコードを貼り付けてください。

function updateLabelEmailsSheet() {
  // カスタマイズ用: Gmailラベル名とフォルダID、シート名を設定してください
  const LABEL_NAMES = ["AAA", "BBB"];  // 対象のGmailラベル名リスト
  const FOLDER_ID = "PASTE_YOUR_FOLDER_ID_HERE";  // 作成先のDriveフォルダID
  const SPREADSHEET_NAME = "GmailLabelExport";    // 作成・更新するスプレッドシートのファイル名

  // Drive上のフォルダを取得
  const folder = DriveApp.getFolderById(FOLDER_ID);
  let ss;
  
  // フォルダ内に既にスプレッドシートがあるか確認
  const files = folder.getFilesByName(SPREADSHEET_NAME);
  if (files.hasNext()) {
    const file = files.next();
    ss = SpreadsheetApp.openById(file.getId());
  } else {
    // なければ新規作成してフォルダに配置
    ss = SpreadsheetApp.create(SPREADSHEET_NAME);
    const file = DriveApp.getFileById(ss.getId());
    folder.addFile(file);
    // (必要なら)My Driveから移動: DriveApp.getRootFolder().removeFile(file);
  }
  
  // インデックスシートを準備(なければ作成)
  let indexSheet = ss.getSheetByName("Index");
  if (!indexSheet) {
    indexSheet = ss.insertSheet("Index");
  }
  
  // 各ラベルのメールを処理
  const labelCounts = {};  // ラベルごとの件数を記録
  for (const labelName of LABEL_NAMES) {
    const label = GmailApp.getUserLabelByName(labelName);
    if (!label) {
      // ラベルが見つからなければスキップ
      Logger.log("Label not found: " + labelName);
      continue;
    }
    const threads = label.getThreads();
    const count = threads.length;
    labelCounts[labelName] = count;
    // 対応するシートを取得(存在しなければ作成)
    let sheet = ss.getSheetByName(labelName);
    if (!sheet) {
      sheet = ss.insertSheet(labelName);
    }
    // シートを一旦クリア
    sheet.clearContents();
    // ヘッダー行をセット
    sheet.appendRow(["日時", "送信者", "件名", "最新コメント"]);
    
    // 各スレッドから最新メッセージを取得してシートに追記
    for (let i = 0; i < threads.length; i++) {
      const thread = threads[i];
      const messages = thread.getMessages();
      const lastMessage = messages[messages.length - 1];  // 最終メッセージ
      const date = lastMessage.getDate();
      const from = lastMessage.getFrom();
      const subject = lastMessage.getSubject();
      let body = lastMessage.getPlainBody();
      // 本文から引用部分を除去(簡易的な方法)
      if (body.indexOf("-----Original Message-----") !== -1) {
        body = body.split("-----Original Message-----")[0];
      }
      if (body.indexOf("\nOn ") !== -1) {
        body = body.split("\nOn ")[0];
      }
      if (body.indexOf("\n>") !== -1) {
        body = body.split("\n>")[0];
      }
      // シートに1行追加
      sheet.appendRow([date, from, subject, body]);
    }
  }
  
  // インデックスシートの更新
  indexSheet.clearContents();
  // 最終更新日時
  indexSheet.getRange(1, 1).setValue("最終更新日時");
  indexSheet.getRange(1, 2).setValue(new Date());
  // ヘッダー
  indexSheet.getRange(2, 1).setValue("ラベル");
  indexSheet.getRange(2, 2).setValue("件数");
  // 各ラベルの件数を記入
  let row = 3;
  for (const labelName in labelCounts) {
    indexSheet.getRange(row, 1).setValue(labelName);
    indexSheet.getRange(row, 2).setValue(labelCounts[labelName]);
    row++;
  }
}

✨スクリプトの使い方: 上記コード内のLABEL_NAMESに整理したいGmailラベル名(例では"AAA"と"BBB")を設定し、FOLDER_IDに先ほど取得したフォルダIDを入れます。また必要に応じてSPREADSHEET_NAME(新規作成されるスプレッドシートのファイル名)も変更してください。準備ができたらスクリプトエディタ上部の実行ボタン▶️をクリックして実行します。初回実行時にはGASがGmailやスプレッドシートにアクセスするための許可を求められるので、指示に従って認証してください。

実行が成功すれば、指定フォルダ内に**「GmailLabelExport」**というスプレッドシートファイルが作成されます(既に存在していればそれが更新されます)。次は、このスクリプトが何をしているのか簡単に見てみましょう。

スクリプトの動作解説(簡潔に)

上記のスクリプトが行っている処理をざっくり説明します。

① Gmailからラベル付きメールを取得
GmailApp.getUserLabelByName("AAA")のように指定した名前のラベルを取得 (Class GmailApp | Apps Script - Google for Developers) 、label.getThreads()でそのラベルが付与されたメールスレッド一覧(会話)を取得していま (Class GmailLabel | Apps Script - Google for Developers) 。ここでいう「スレッド」とは、同じ件名でやりとりされたメールの集まりです。例えば返信メールが何通か続いている場合、それらは一つのスレッドにまとまっています。各スレッドから最後のメール (messages[messages.length - 1]) を取り出し、その日時・送信者・件名・本文を取得しています。本文はgetPlainBody()メソッドでプレーンテキストの内容を取得します。

② スプレッドシートの作成と更新ルール
コード冒頭では、結果を書き込むスプレッドシートファイルを用意しています。指定したフォルダID内に同名のスプレッドシートが存在するかチェックし、なければ新規作成します。既にあればそれを開いて再利用します。こうすることで、スクリプトを繰り返し実行した際に同じファイルに上書き更新するようにしています。各ラベルごとにスプレッドシート内のシート(Tab)を用意し(なければ作成)、毎回実行時に古い内容をclearContents()で一度クリアしてから新しいデータを書き込むルールにしています。これで常に最新の情報がシートに反映されるようになります。

③ 本文の整形(最新コメント部分のみ抽出)
メール本文全文をそのまま記録すると、過去の返信履歴まで含まれて長くなってしまうことがあります。そこで、本文中に含まれる引用符や区切り文字を手がかりに、最新のコメント部分だけを取り出す工夫をしています。具体的には、"-----Original Message-----""\nOn "(返信のヘッダー部分)、"\n>"(引用記号)といった典型的な文字列が本文中にあれば、そこでテキストを分割し、それ以降の古い引用部分を切り捨てています。これは簡易的な方法なので、メールの形式によっては調整が必要ですが、基本的な返信引用の除去には効果的です。

④ インデックスシートの自動更新
スプレッドシート内には「Index」というシートを用意し、ラベルごとのメール件数や最終更新日時をまとめています。スクリプト実行時にこの索引シートを毎回更新し、まずA1セルに「最終更新日時」として現在日時を記録、続いて各ラベル名と件数を一覧で書き込んでいます。これにより、「AAAラベルのメールが何件、BBBラベルのメールが何件、いつ時点の情報か」がひと目で分かるようになります。必要に応じてIndexシートに他の情報(例えば各ラベルの説明やリンク)を追加しても良いでしょう。

以上がスクリプトの主な動作になります。基本的にはGmailのラベルで絞り込んだメールを取得→スプレッドシートに書き出しという流れです。

応用編(こんなこともできる!)

このスクリプトを発展させて、さらに便利に使う方法も紹介します。

■ 定期実行のトリガー設定(毎日自動更新)
せっかく自動化したので、毎回自分でスクリプトを実行しなくても済むように時間主導型トリガーを設定してみましょう。Apps Scriptエディタの左側メニューの「📅トリガー」アイコンをクリックし、新しいトリガーを追加します。例えば以下のように設定すると、毎日朝9時にこのスクリプトが自動実行されるようになります。

  • 関数を選択: updateLabelEmailsSheet
  • イベントのソース: 時間主導型
  • 時間ベースのトリガーのタイプ: 日付ベースのタイマー
  • 時刻: 午前9時 (好きな時間に変更可能)

これで設定完了です!指定した時間ごとにGmailから最新メールを取得し、スプレッドシートが自動で更新されるようになります。毎日スプレッドシートを開くだけで最新のラベル別メール一覧が見られるのは便利ですね。

■ 追加のフィルタ条件を入れる
さらに特定の条件で絞り込みたい場合、スクリプトや検索クエリをカスタマイズできます。例えば「特定の送信者からのメールだけ記録したい」というケースを考えてみましょう。この場合、Gmailの検索演算子を活用するのがおすすめです。先ほどはラベルでスレッドを取得しましたが、Gmail検索クエリに**label:AAA from:specific@example.com**のような条件を入れて検索することで、スクリプトのコードを大きく変えなくても特定送信元のメールに限定でき (
Solved: Gmail Emails to Google Sheet - Google Cloud Community
) 】。具体的には、label.getThreads()の代わりにGmailApp.search("label:AAA from:specific@example.com")のような形で検索してスレッドを取得できます。あるいはコード中でメール取得後にif (from.indexOf("specific@example.com") > -1) { ... }といった条件分岐で必要なメールだけをシートに書き込む方法もあります。

この他にも、未読メールのみ対象にしたり、件名や本文中のキーワードでフィルタしたりと、Gmailの持つ強力な検索条件を組み合わせることで柔軟にカスタマイズ可能です。

まとめ

以上、Gmailの特定ラベル付きメールをGoogleスプレッドシートに整理・記録するGASスクリプトについて解説しました。手動でメールを探してコピー&ペーストする手間が省けるだけでなく、一度設定しておけば毎日自動で最新データに更新できるのでとても快適です🎉
GASを活用すれば、今回のようなメール整理以外にも様々な自動化が実現できます。ぜひ自分の業務や趣味の場面でも「こんなことも自動化できるかな?」とアイデアを広げてみてください。効率アップにつながるGAS活用術で、日々の作業をもっとスマートにしていきましょう!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?