はじめに

定期的にくる問い合わせメールやシステムメールをシートで管理したいとき、あるよねー。
という人にオススメの記事です。

※既に同じ内容の記事は山ほどありますが、
カスタマイズしたい場合にどれを参考にしようか毎回悩むので今後はこれを基準にしていきます。

本プログラムの概要

  • 日付、件名、from、to、本文がシートに出力されます
  • 複数回実行しても同じメールは処理しません(日付、from、to、件名の一致で判断)

あとは状況に応じてカスタマイズしましょう。

設置手順

  1. スプレッドシートを新規作成
  2. メニュー→ツール→スクリプトエディタ
  3. 下記コードを貼り付け
  4. 実行

// スプレッドシートにメール内容を書き込む
function mailToSheet () {
  
  // ----- ここから書き換え -----
  // 書き込むシートURL
  var sheet_url = 'https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/edit';
  // 書き込むシート名
  var sheet_name = 'シート1';
  // Gmailの抽出条件
  var mail_query = 'Gmailの抽出条件';
  // 存在チェック(既にシートに書き込み済のメールは処理しない(日付、from、to、件名の一致で判定))
  var existence_check = true;
  // ----- ここまで書き換え -----

  var ss = SpreadsheetApp.openByUrl(sheet_url);
  var sheet = ss.getSheetByName(sheet_name);
  var existence_keys = fetchExistenceKeys();
  var mail_data = fetchMailData();
  for (var i = 0; item = mail_data[i]; i++) {
    if (existence_check && existsData(item)) {
      continue;
    }
    sheet.appendRow(itemToRow(item));
  }  

  function fetchExistenceKeys () {
    var existence_keys = {};
    var sheet_data = sheet.getDataRange().getValues();
    for (var i = 0; row = sheet_data[i]; i++) {
      existence_keys[generateKey(rowToItem(row))] = true;
    }
    return existence_keys;
  }
  
  function existsData (item) {
    if (existence_keys[generateKey(item)]) {
      return true;
    }
    return false;
  }

  function generateKey (item) {
    var key = item['date'] + '_' + item['subject'] + '_' + item['from'] + '_' + item['to'];
    // Logger.log(key);
    return key;
  }

  function rowToItem (row) {
    var item = {};
    item['date'] = row[0];
    item['subject'] = row[1];
    item['from'] = row[2];
    item['to'] = row[3];
    return item;
  }

  function itemToRow (item) {
    var row = [];
    row[0] = item['date'];
    row[1] = item['subject'];
    row[2] = item['from'];
    row[3] = item['to'];
    row[4] = item['body'];
    return row;
  }
  
  function fetchMailData () {
    var result = [];
    var threads = GmailApp.search(mail_query);
    for (var i = 0; it = threads[i]; i++) {
      var messages = it.getMessages();
      for (var j = 0; message = messages[j]; j++) {
        var item = {};
        item['date'] = message.getDate();
        item['subject'] = message.getSubject();
        item['from'] = message.getFrom();
        item['to'] = message.getTo();
        item['body'] = message.getBody();
        result.push(item);
      }
    }
    return result;
  }  
}

さいごに

毎日定期的に取り込みたい場合はトリガーを設定すると簡単にできます。
Gmailの抽出条件に「newer_than:1d」などを利用するのがオススメです。