2022/04/18に更新

【GASで時短】特定のメールをスプレッドシートに出力する

メールスプレッドシート業務改善

件名に特定の文字列が含まれるメールを、スプレッドシートに転記するGoogle Apps Scriptです。フォームで受け付けたい・・けどメールでも受付せざるを得ない・・という時などに。

こんな悩みを解決します


  • メールでも問い合わせが来るので、対応状況をスプレッドシートで管理したい。
  • 特定のメールをまとめて印刷したいので、スプレッドシートに転記したい。

用意するもの


特にありません。今お使いのスプレッドシートに組み込めます。

このスクリプトで出来ること


  • Gmailで受信したメールをスプレッドシートにコピーすることができます。
  • メールの検索条件(一部)はポップアップウィンドウで指定することが可能です。

使い方


1.事前準備

スクリプトの「事前設定エリア」部分を書き換えます。
「何日以内のメール」を対象とするかを指定します。30と指定すれば30日以内に受信したメールから探します。
あまり長い期間にすると動作が遅くなるかもしれませんので、短めで試すことをおすすめします。

書き換えが終わったら保存して、関数「onOpen」を一度実行しておきましょう。

2.スクリプトの実行

上のメニューにある「スクリプト実行」から「特定のメールをスプレッドシートに転記する」を実行します。

検索条件を聞いてくるので、お好きなキーワードを入力してください。
ここで入力した文字がメールの件名に含まれていれば、スプレッドシートへのコピー対象になります。

3.実行結果の確認

件数によりますが、しばらく待つとこのようにスプレッドシートにメールが書き出されます。
銀のさらの利用頻度が高めですね・・・節約しなくては・・・

「#ERROR!」になっているのは、メール本文がイコールで始まっているため数式と判断されているためです。
このサンプルコードではメール本文の取得に getPlainBody() を使っています。HTMLメールを取得したい場合は getBody() に書き換えてください。

スクリプト


/**
 * このスクリプトの説明、使い方はこちら。
 * https://myfunc.jp/items/00071/index.html
 */

function onOpen() {
  // スプレッドシートを開いたときに実行される関数

  // UIの取得
  const ui = SpreadsheetApp.getUi()

  // メニューの表示名
  const menu = ui.createMenu('スクリプト実行');

  // メニューに追加するボタン
  menu.addItem('特定のメールをスプレッドシートに転記する', 'copy_mail_to_sheet');

  // メニューを画面に追加する
  menu.addToUi();
}

function copy_mail_to_sheet() {

  // ########## 事前設定エリアここから ##########

  // メールを検索する期間をセットしてください。「30」の場合は30日前から本日のメールが対象になります。
  const term = 30;

  // ########## 事前設定エリアここまで ##########

  // スプレッドシートを取得
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  // アクティブなシートを取得
  const sheet = ss.getActiveSheet();

  // UIを取得
  const ui = SpreadsheetApp.getUi();

  // 検索キーワードを入力する画面を表示する
  const response = ui.prompt('検索キーワードを入力してください(件名が対象です)', ui.ButtonSet.OK_CANCEL);

  // キャンセルが押されたらスクリプトを終了する
  if(response.getSelectedButton() == ui.Button.CANCEL){
    return;
  }

  // 検索期間を指定するための日付を取得する
  let date = new Date(); // 現在の日時を取得
  date.setDate(date.getDate() - term); // 事前設定した日付分、遡る
  date = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd'); // 日付のフォーマットを変更する

  // メールを検索するための条件を作る
  const query = 'Subject:' + response.getResponseText() + ' after:' + date;

  // Gmailからメールを取得する
  const threads = GmailApp.search(query);

  // 検索条件にマッチするメールがない場合はアラートを出してスクリプトを終了する
  if(threads.length == 0){
    ui.alert('メールが見つかりませんでした');
    return;
  }

  // シートに書き込む用の配列を準備
  let values = [];

  // メールを1スレッドずつ処理していく
  for (let i = 0; i < threads.length; i++) {

    // スレッドの中にメッセージ(メール)が入っているので取得する
    let messages = threads[i].getMessages();

    // メッセージを1つずつ処理していく
    for (let j = 0; j < messages.length; j++) {

      let mail_subject = messages[j].getSubject(); // 件名を取得
      let mail_from = messages[j].getFrom(); // 送信元メールアドレスを取得
      let mail_date = messages[j].getDate(); // 受信日時を取得
      let mail_body = messages[j].getPlainBody(); // メール本文を取得

      // シート書き込み用の配列に追加する
      values.push([mail_date, mail_from, mail_subject, mail_body]);

    }
  }

  // 書き込むデータに合ったrangeオブジェクトを取得する
  const range = sheet.getRange(sheet.getLastRow() + 1, 1, values.length, values[0].length);

  // スプレッドシートに書き込む
  range.setValues(values);

}

関連するアプリ


タグ一覧

最新のアプリ

人気のアプリ

ページトップに戻る
myfunc.jp