Google Apps Scriptを活用してGmailデータをGoogleスプレッドシートに取り込む方法

「データ整理の新時代」:Google Apps Scriptを使ったGmailのデータ管理

Google Apps Scriptを使ってGmailの「From(差出人)」、「日時」、「本文」などの情報をGoogleスプレッドシートに自動で記録することを試してみました。

まずは、次のようなステップで行われます。

Google Apps Scriptプロジェクトの作成

まず、Googleスプレッドシート内で新しいスクリプトを作成します。

Gmail APIの活用

次に、Gmail APIを通じてメールを読み込みます。

Google Apps ScriptはGmailサービスをサポートしているため、これは比較的簡単です。

メールデータの取得

特定の条件でメールを検索し、必要なデータ(差出人、日時、本文)を取得します。

スプレッドシートへのデータ書き込み

最後に、取得したデータをスプレッドシートに記録します。

以下に、これらのステップを実行するサンプルコードを記載します。

このコードは、最新の5件のメールから必要な情報を取得し、それをスプレッドシートに記録する処理を実行できます。

function importEmailsToSheet() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var threads = GmailApp.getInboxThreads(0, 5);

  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    for (var j = 0; j < messages.length; j++) {
      var message = messages[j];
      var from = message.getFrom();
      var date = message.getDate();
      var body = message.getPlainBody();

      sheet.appendRow([from, date, body]);
    }
  }
}

このコードを実行する時に、スプレッドシートへのアクセス権限を設定する必要があります。 また、より複雑なフィルタリングやデータ処理が必要な場合は、このスクリプトをカスタマイズしてください。

例えば、特定の文字列が件名に含まれているメールのみを対象にしたい場合、以下のようにGmailApp.search メソッドを使用して条件に合うメールを検索し、必要な情報を取得することができます。

function importEmailsWithBulletedListAndOptionalTitleFromSpecificSender() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var subject = 'YourSubject';           // 件名に含まれる検索したい文字列
  var startDate = 'startYYYY/MM/DD';     // 検索を開始する日付
  var endDate = 'endYYYY/MM/DD';         // 検索を終了する日付
  var specificSender = 'sample@example.com'; // 特定の差出人のメールアドレス
  var titleMarker = '#'; // タイトルのマーカー
  var bulletMarker = '-'; // 箇条書きのマーカー
  var replyMarker = '>';   // 返信のマーカー
  var signatureKeywords = ["Best regards,", "Sincerely,", "Regards,", "-----"]; // 署名を示すキーワード
  var sortAscending = true; // 昇順に並び替える場合はtrue、降順はfalse
  var query = 'from:' + specificSender + ' subject:' + subject + ' after:' + startDate + ' before:' + endDate;
  var threads = GmailApp.search(query);
  var requiredRows = threads.reduce(function(count, thread) {
    return count + thread.getMessages().length;
  }, 0); // 書き込む必要がある行数を計算 スプレッドシート行数制限(5万行)

  // 既存データの最終行の位置を取得
  var lastFilledRow = sheet.getLastRow();

  // 必要な行数が現在の行数を超える場合、行を追加する
  var totalRowsNeeded = lastFilledRow + requiredRows;
  var currentRowCount = sheet.getMaxRows();
  if (totalRowsNeeded > currentRowCount) {
    sheet.insertRowsAfter(currentRowCount, totalRowsNeeded - currentRowCount);
  }

  // 以下、メールの処理とスプレッドシートへのデータ書き込み
  for (var i = 0; i < threads.length; i++) {
    var messages = threads[i].getMessages();
    for (var j = 0; j < messages.length; j++) {
      var message = messages[j];
      var bodyLines = message.getPlainBody().split('\n');
      var bulletList = '';   // 箇条書きのセクション
      var bodyText = '';     // その他の本文
      var inTitleSection = false;

      for (var k = 0; k < bodyLines.length; k++) {
        var line = bodyLines[k].trim();
        var isSignatureLine = signatureKeywords.some(keyword => line.startsWith(keyword));
        if (isSignatureLine) {
          break; // 署名の開始を検出したら、残りの行は無視する
        }
        if (line.startsWith(replyMarker)) {
          continue;
        }
        if (titleMarker && line.startsWith(titleMarker)) {
          bulletList += line + '\n';
          inTitleSection = true;
        } else if (bulletMarker && line.startsWith(bulletMarker)) {
          bulletList += line + '\n';
        } else {
          if (inTitleSection) {
            inTitleSection = false;
          } else {
            bodyText += line + '\n';
          }
        }
      }

      sheet.appendRow([
        message.getFrom(),    // 差出人
        message.getDate(),    // 日付
        message.getSubject(), // 件名
        bodyText,             // 本文
        bulletList            // 箇条書き
      ]);
    }
  }

  // 日付列を基にして並び替え
  var lastRow = sheet.getLastRow();
  if (lastRow > 1) {
    var range = sheet.getRange(1, 1, lastRow, sheet.getLastColumn()); // 1行目から始める
    range.sort({column: 2, ascending: sortAscending}); // 2列目(日付)を基に並び替え
  }

}

このサンプルでは、「YourSubject」という件名を持つメールを検索し、その差出人、日時、本文をスプレッドシートに取り込んでいます。 実際の使用には、検索したい具体的な文字列にYourSubjectを置き換えてください。

このように、Google Apps Scriptを利用すれば、Gmailのデータを効率的に管理し、業務の自動化を実現できます。 ただし、取得する最大件数に制限があるようです。 ここでは詳しく解説しませんが、1000件程度が限界のようです。

この記事があなたのGoogle Apps Scriptに関する知識を深める手助けができたらと願います。