本記事では、
- 特定の受信メールに記載された内容の一部を
- スプレッドシートの各セルに
- ワンクリックで転記する
方法を、実例(メールでの注文を受けた際、その内容を項目ごとに分解してスプレッドシートに取り込む)を用いて紹介します。
受信メールに決まったフォーマットがある場合にのみ有効です。
本実装では、こちらのような「メール発注フォーマット」で受信することを前提にしています。(フォーマットが崩れるとプログラムが動かないので、ご注意ください)
スプレッドシートの準備
Googleスプレッドシートを立ち上げて、転記フォーマットを作成します。
本実装例では、B列のセルに「法人名」「氏名」「住所」「電話番号」「メールアドレス」「商品」「数量」がそれぞれ転記されるようにしました。
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 2で作成したメソッド名(本実装ではextractOrderData
)を記入します。
ボタンをクリックし、Gmailアカウントと連携
STEP 3で設置したボタンをクリックし、Gmailアカウントと連携させると同時にスプレッドシートに転記されるかを確認します。
スクリプトを割り当てたボタンを初めてクリックすると、認証を求めるウィンドウが表示されるので、以下画像の通り認証を進めていきます。
特に問題がなければコードが実行され、まずGmail検索のためのウィンドウが表示されるはずです!