GAS(Google Apps Script)で、Gmail(Gメール)のメール内容をスプレッドシートに自動で定期的に同期したい、というご相談は案外多いです。

Gmailアプリ上だとメールをまとめて確認することが困難であったり、メールごとに対応ステータスも管理されたいというご要望があるためです。

下記のコードは、そのようなご要望に対応する際によく使用するスクリプトのベースver.といったものです。

私が作成したサンプルコードの主な仕様は以下の通りです。

<利点>

・「メールID一覧」シートでメールIDを管理するため一度取得したメールが重複してシートに記載されることはありません。
・スレッド単位でメールを取得するため、同一スレッドの複数のメールがシートに記載されることはありません。
・お問い合わせメール内の見出し部分はカットし、お客様の回答部分のみをシートに記載します。

<サンプルコードの仕様>

・予めスプレッドシートに「お問い合わせ一覧」と「メールID一覧」という名前のシートを用意してください。
・2行目の querySubject で、取得対象メールのタイトルに含まれるテキストを指定しています。
・7行目の term で35分をセットしていますが、これは30分毎にトリガーでスクリプトを実行することを前提にしているためです。
・10行目の to:contact@example.com のメールアドレスを受信先の実際の問い合わせメールアドレスに変更してください。
・39行目以降で、問い合わせメールの各質問の見出しを指定しています。実際のお問い合わせフォームの質問フィールドのテキストに変更してください。

サンプルコードをカスタマイズすればかなり便利にご利用いただけるかと思いますので、ぜひ、ご自由にお使いください!

※ご質問にはお答えできませんので予めご承知おきくださいませ。

お問い合わせフォームイメージ

お問い合わせフォームイメージ

コード

function searchContactMail() {
  const querySubject = '{(subject:"【お問い合わせ】")}';

  const date = new Date();
  const unixTime = date.getTime();
  const now = Math.floor(unixTime / 1000);
  const term = now - 2100; // 現在時刻から35分(2100秒)前
  const queryDate = "after:" + term + "";

  const query = "{" + querySubject + "} {" + queryDate + "} {(to:contact@example.com)}";
  const start = 0;
  const max = 100;

  const threads = GmailApp.search(query, start, max);
  const messagesForThreads = GmailApp.getMessagesForThreads(threads);

  const values = [];
  const valueids = [];
  const sheet = SpreadsheetApp.getActive().getSheetByName("お問い合わせ一覧");
  const lastRow = sheet.getLastRow();

  const sheetids = SpreadsheetApp.getActive().getSheetByName("メールID一覧");
  const lastRowids = sheetids.getLastRow();
  const ids = sheetids.getRange(2, 1, lastRowids).getValues().flat();

  for (const messages of messagesForThreads) {
    const message = messages[0];
    const id = message.getId();

    if (!ids.includes(id)) {
      const body = message.getPlainBody();

      let q1 = "",
        q2 = "",
        q3 = "",
        q4 = "",
        q5 = "";

      if (body.match(/【お問い合わせカテゴリ】.*/)) {
        q1 = body
          .match(/【お問い合わせカテゴリ】.*/)
          .toString()
          .replace(/【お問い合わせカテゴリ】/, "");
      }

      if (body.match(/【メールアドレス】.*/)) {
        q2 = body
          .match(/【メールアドレス】.*/)
          .toString()
          .replace(/【メールアドレス】/, "");
      }

      if (body.match(/【会社名】.*/)) {
        q3 = body
          .match(/【会社名】.*/)
          .toString()
          .replace(/【会社名】/, "");
      }

      if (body.match(/【お名前】.*/)) {
        q4 = body
          .match(/【お名前】.*/)
          .toString()
          .replace(/【お名前】/, "");
      }

      if (body.match(/【お問合せ内容】.*/)) {
        q5 = body
          .match(/【お問合せ内容】.*/)
          .toString()
          .replace(/【お問合せ内容】/, "");
      }

      const record = [message.getThread().getPermalink(), message.getId(), message.getDate(), q1, q2, q3, q4, q5];
      values.push(record);

      const record02 = [message.getId()];
      valueids.push(record02);
    }
  }

  if (values.length > 0) {
    sheet.getRange(lastRow + 1, 1, values.length, values[0].length).setValues(values);
    sheetids.getRange(lastRowids + 1, 1, valueids.length, valueids[0].length).setValues(valueids);
  }
}

トリガー設定

対象関数:searchContactMail

「時間手動型」から「分ベースのタイマー」で「30分おき」に実行されるように設定してください。
※お問い合わせメール用のGoogleアカウントで設定を行う必要があります。