【GAS】受信メールの内容をスプレッドシートに自動転記する方法

本記事では、

  • 特定の受信メールに記載された内容の一部を
  • スプレッドシートの各セルに
  • ワンクリックで転記する

方法を、実例(メールでの注文を受けた際、その内容を項目ごとに分解してスプレッドシートに取り込む)を用いて紹介します。

このようなスプレッドシート自動転記ツールを作成できます
「受信メールから注文内容を取り込む」ボタンをクリックすると・・・
Gmail検索ウィンドウが表示され、
ヒットしたメールから注文内容を取得して、B列の各セルに転記されます!

受信メールに決まったフォーマットがある場合にのみ有効です。

本実装では、こちらのような「メール発注フォーマット」で受信することを前提にしています。(フォーマットが崩れるとプログラムが動かないので、ご注意ください)

メール発注フォーマットに基づいた受信メール

実装の流れ

  1. スプレッドシートの準備(ここへ飛ぶ
  2. Apps Scriptを起動してコードを記述(ここへ飛ぶ
  3. メール検索&スプレッドシートへの転記ボタンの設置(ここへ飛ぶ
  4. ボタンをクリックし、Gmailアカウントと連携(ここへ飛ぶ
STEP

スプレッドシートの準備

Googleスプレッドシートを立ち上げて、転記フォーマットを作成します。

本実装例では、B列のセルに「法人名」「氏名」「住所」「電話番号」「メールアドレス」「商品」「数量」がそれぞれ転記されるようにしました。

STEP

Apps Scriptを起動してコードを記述

続いてApps Scriptを起動します。
Gmailを検索して注文内容を取得し、「法人名」「氏名」「住所」「電話番号」「メールアドレス」「商品」「数量」を取得 → スプレッドシートのB列に転記するためのコードを記述します。

「コード.js」が開かれていると思うので、右側にコードを記述します。
本実装では以下コードを記述し、「受信メールから注文内容を取得」というタイトルを設定しました。

function extractOrderData() {
  const ui = SpreadsheetApp.getUi();
  
  // ダイアログボックスを表示して件名を入力させる
  const response = ui.prompt(
    "Gmail検索",                   // ダイアログのタイトル
    "メールの件名を入力してください:", // メッセージ
    ui.ButtonSet.OK_CANCEL        // OKとキャンセルのボタンを表示
  );

  // キャンセルされた場合は処理を終了
  if (response.getSelectedButton() !== ui.Button.OK) {
    return; // 処理を終了
  }

  // 入力された件名を取得
  const subject = response.getResponseText().trim();
  if (!subject) {
    return; // 件名が空の場合も処理を終了
  }

  // Gmailから指定された件名でメールを検索
  const threads = GmailApp.search(subject);
  if (threads.length === 0) {
    // 該当するメールが見つからない場合
    ui.alert("該当するメールが見つかりませんでした。");
    return;
  }
  if (threads.length > 1) {
    // 複数のメールが見つかった場合
    ui.alert("複数のメールが見つかったため、処理を中断します。");
    return;
  }

  // 検索結果のメールの本文を取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 現在のスプレッドシート
  const message = threads[0].getMessages()[0];                          // 最初のメールスレッドの最初のメッセージ
  const body = message.getBody().replace(/<\/?[^>]+(>|$)/g, "");        // HTMLタグを除去
  const normalizedBody = body.replace(/[\s]+/g, ' ').trim();            // 余分な空白や改行を削除して整形

  // メール本文から注文情報を解析
  const data = parseEmailBody(normalizedBody);

  if (data) {
    // 解析結果をスプレッドシートに書き込む
    writeToSheet(sheet, data);
  } else {
    // 注文情報が見つからない場合
    ui.alert("該当するデータが見つかりませんでした。");
  }
}

// メール本文を解析して注文情報を抽出
function parseEmailBody(body) {
  // 正規表現で注文情報(法人名 から ==== まで)を抽出
  const orderDetailsRegex = /法人名:(.+?)\s*お名前:(.+?)\s*ご住所:(.+?)\s*電話番号:(.+?)\s*メールアドレス:(.+?)\s*商品:(.+?)\s*数量:(.+?)\s*====/;
  const orderDetails = body.match(orderDetailsRegex);

  if (!orderDetails) {
    // 該当するデータがない場合は null を返す
    return null;
  }

  // データをフォーマットして返す
  return formatData(orderDetails);
}

// 抽出したデータをフォーマット
function formatData(orderDetails) {
  return {
    order: {
      companyName: orderDetails[1].trim(), // 法人名
      name: orderDetails[2].trim(),        // お名前
      address: orderDetails[3].trim(),     // ご住所
      phone: orderDetails[4].trim(),       // 電話番号
      email: orderDetails[5].trim(),       // メールアドレス
      product: orderDetails[6].trim(),     // 商品
      quantity: orderDetails[7].trim(),    // 数量
    }
  };
}

// スプレッドシートにデータを書き込む
function writeToSheet(sheet, data) {
  const order = data.order;

  // 固定セルにデータを書き込む
  sheet.getRange("B1").setValue(order.companyName); // B1に法人名
  sheet.getRange("B2").setValue(order.name);        // B2にお名前
  sheet.getRange("B3").setValue(order.address);     // B3にご住所
  sheet.getRange("B4").setValue(order.phone);       // B4に電話番号
  sheet.getRange("B5").setValue(order.email);       // B5にメールアドレス
  sheet.getRange("B6").setValue(order.product);     // B6に商品
  sheet.getRange("B7").setValue(order.quantity);    // B7に数量
}
UIの取得

const ui = SpreadsheetApp.getUi();で、スプレッドシートのユーザーインターフェース(UI)を取得するためのメソッドです。このUIを利用して、ユーザーにダイアログや通知を表示できます。本実装では ui.prompt() を使用して、ユーザーに検索内容を入力させます。

Gmail検索

const threads = GmailApp.search(subject);は、引数に指定した内容でGmailを検索し、ヒットしたメールスレッドを配列で取得するメソッドです。変数subjectには、ユーザーが入力した内容が代入されています。

メール内容の整形

const message = threads[0].getMessages()[0]; を使用して、検索したメールスレッドの最初のメッセージを取得します。メール本文は通常HTML形式であるため、replace(/<\/?[^>]+(>|$)/g, "") を用いてHTMLタグを除去します。さらに、replace(/[\s]+/g, ' ').trim() で余分な空白や改行を削除し、整形します。

正規表現でデータ抽出

const orderDetailsRegex = /法人名:(.+?)\s*お名前:(.+?)\s*ご住所:(.+?)\s*電話番号:(.+?)\s*メールアドレス:(.+?)\s*商品:(.+?)\s*数量:(.+?)\s*====/;
整形したメール本文から、「法人名:」から「数量:」の後に続く文字列を正規表現で検索して抽出します。各項目は正規表現のキャプチャグループ(.+?)を用いて配列に格納されます。フォーマットが異なる場合は正規表現を修正してください。

スプレッドシートへの転記

writeToSheet(sheet, data) メソッドで、抽出したデータをスプレッドシートに書き込みます。
例えば、sheet.getRange("B1").setValue(order.companyName) は、法人名をセルB1に書き込みます。このように、各項目が対応するセルに転記されます。

コードを記述できたら保存し、スプレッドシートに戻ります。

STEP

メール作成ボタンの設置

スプレッドシートの「挿入」タブから「図形描画」を選択し、図形とテキストを組み合わせボタンを作成します。
作成したボタンは、スプレッドシートの適当な位置に移動させます。

設置したボタンをクリックし、ボタン右の方に表示される「⋮」をクリックして「スクリプトを割り当て」を選択します。

ウィンドウが表示されるので、STEP 2で作成したメソッド名(本実装ではextractOrderData)を記入します。

STEP

ボタンをクリックし、Gmailアカウントと連携

STEP 3で設置したボタンをクリックし、Gmailアカウントと連携させると同時にスプレッドシートに転記されるかを確認します。
スクリプトを割り当てたボタンを初めてクリックすると、認証を求めるウィンドウが表示されるので、以下画像の通り認証を進めていきます。

認証作業は最初のみで、認証完了後は表示されません。

特に問題がなければコードが実行され、まずGmail検索のためのウィンドウが表示されるはずです!

取得したいメール
取得したメールの内容がセルに転記されました!
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次