Gmailで受信したメールの内容を集約するツールのご紹介

スポンサーリンク

受信メールの内容を取得するGASについて

事務職の方はメールのやり取りに多くの時間を費やしていると思います。
受信メールの内容を確認したり、受信メールから得た必要な情報をほかの方に伝達するなど内容に応じた対応を進めるのもそうですし、メールを返信する、用事があって自分から相手にメールを送ることもあると思います。

以前に「Gmailを使って差し込み印刷のように少しずつ内容を変えたメールを大量に送信する」ツールをこちらの記事でご紹介しました。
今回は逆に効率的にメールの情報を集約する方法として「受信メールの内容をスプレッドシートに書き出して一括で把握できるようにする方法」をご紹介します。

私が普段担当している業務でもメールの内容を一覧で管理する必要に迫られることがありますし、会社の別の部署にいる同僚からも相談されたことがあります。
そういったタイミングでこのコードはかなり便利に活用できると思います。

受信メールの内容を抽出するのに必要な事前準備

スプレッドシート

今回のGASコードは取得した情報をスプレッドシートに出力します。
また、GASのコードはスプレッドシート内で作成するのでその意味でもスプレッドシートが必須になります。

スプレッドシートの書式は以下の画像の通りです。

VBA165-1

スポンサーリンク

受信メールの内容を取得してスプレッドシートに書き出すGASコード

今回のツールは指定した期間内のメールを一覧にするフローを想定しています。
シートの中に期間を指定するセルを用意してその値を参照してメールを取り出す流れになります。

B1セルに開始日時、C1セルに終了日時を入力後に以下コードのsearchMailsを実行すると受信メールの内容を取得することができます。

メールの取得日時をフィルターの条件にする場合、unixTimeと言われる(らしい)世界共通日時を参照する必要があるみたいです。
セルに記載した値をunixTimeに変換するための関数を別に設定しています。(getUnixtime)

GASのバグらしいのですが取得時間が少しズレることがあるので、少し幅を持たせて実行するほうが安心です。

function getUnixtime(time) {

  let unixTime = Math.floor(time.getTime() / 1000);
  //console.log(unixTime);
  return unixTime;

} 

function clearSS(){
  
  //入力内容初期化
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getActiveSheet();

  const BValues = sheet.getRange('B:B').getValues();  //A列の値を全て取得
  const LastRow = BValues.filter(String).length + 3 ;  //空白の要素を除いた長さを取得 +3は本文・件名などの入力行数分

  if (LastRow >= 4) {
    const targetRange = sheet.getRange(4,1,LastRow,6);
    targetRange.clearContent();
  }

}

function searchMails() {

  //入力内容初期化
  clearSS();

  // 書き出しを行うスプレッドシートとそのシート
  let ss = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = ss.getActiveSheet();
  let fromDate = sheet.getRange(1,2).getValue();
  let toDate = sheet.getRange(1,3).getValue();

  let query = 'after:' + getUnixtime(fromDate) + 'before:' + getUnixtime(toDate);
  //let query = '(subject:注文 OR subject:発注) after:2022/3/6'; //subjectでフィルターをかける場合のクエリはこんな感じ
  let searchThreads = GmailApp.search(query);

  let count = 1;
  searchThreads.forEach(thread => {
    let messages = thread.getMessages();
    messages.forEach(message => {

      let receivedTime = message.getDate(); // 受信日時
      let fromData = message.getFrom(); // 送信元
      let subject = message.getSubject(); // 件名
      let body = message.getPlainBody(); // 本文
      let attachments = message.getAttachments(); // 添付ファイル群(配列)

      let attachmentList = []; // 添付ファイルのファイル名格納用の配列
      let transferAtacchmentList = []; //変換後の添付ファイル名格納用配列

      if(attachments.length > 0 && receivedTime <= toDate && receivedTime >= fromDate){ //スレッドの中の古いメールが紛れ込まないように
        attachments.forEach(attachment => {
          let name = attachment.getName();
          attachmentList.push(name);

        });

        // 配列⇒文字列に変換(','で区切り)
        attachmentList = attachmentList.join(',');
        transferAtacchmentList = transferAtacchmentList.join(',');

        // 書き出し用データ(配列)
        let data = [receivedTime, fromData, subject, body, attachmentList,transferAtacchmentList];
        // 書き出し(行追加)実行
        sheet.appendRow(data);  
        
        //カウンタを進める
        count = count + 1 ;

      }
    });
  });
} 

今回添付ファイルについてはファイル名を取得するのみとなっていますが、Googleドライブ内の特定のフォルダに添付をまとめて格納することも可能です。
そちらのコードに関してはまた公開できる準備が整ったらご紹介します。

今回のコードは以下のファイルをコピーすることでGASを作れない方も使用可能なようにしています。
ご興味をお持ちでしたらリンク先のファイルを開いて「ファイル」→「コピーを作成」で共有しないファイルを作成してご使用ください。

受信メール取得ツールファイルを開く

コメント