LoginSignup
1
4

More than 3 years have passed since last update.

【GAS】検索したメール本文の特定部分をスプレッドシートに書き込む

Posted at

はじめに

特定の条件のメールを検索して、本文の特定部分を取得するコードです。
処理イメージは以下です。
1. 以下のようなメールがあった場合に、申請番号の値「1234567890」と件名「けんめい」を取得し、
2. 以下のようにスプレッドシートに値をセットする
処理をします。

メール

スクリーンショット 2020-07-20 23.17.41.png

スプレッドシート

スクリーンショット 2020-07-20 23.21.00.png

コード

function myFunction() {
  // メール検索条件。処理済みのメールは除外。
  let query = 'subject:(検索したい件名 -label:済み';
  // メール検索
  let threads = GmailApp.search(query);

  // 取得した申請番号と件名を格納する配列  
  let items = [];

  // 1スレッドずつ処理 
  threads.forEach(function (thread) {
    // 1メッセージずつ処理
    thread.getMessages().forEach(function (message) {
      let subject = message.getSubject();
      let body = message.getBody();

      // 正規表現で処理するためHTML形式ではないプレーンな型の本文を取得
      var plainBody = message.getPlainBody();

      // 正規表現で取得したい箇所を取得
      let ringiAppNo = plainBody.match(/申請番号: (.*)/);
      let ringiSubject = plainBody.match(/件名:(.*)/);

      // 結果を入れる配列に格納
      items.push([
        ringiAppNo[1],
        ringiSubject[1]
      ]);

      /* 戻り値の説明
      戻り値
      0 : マッチした文字列全体が入る
      1~ : それぞれのキャプチャ
      index : マッチした場所 (bite値 じゃなくて 0から数えて何番目の文字か?)
      input : 検索される側の文字列
      */
    });

    // スレッドに処理済みラベルを付ける
    // ※要注意※ あらかじめラベルが無いとうまくいかない。
    let label = GmailApp.getUserLabelByName('済み');
    thread.addLabel(label);
  });

  // 処理結果が0件だったとき用にエラーハンドリング
  if (items.length == 0) {
    // 0件の時は、メッセージボックスを表示
    Browser.msgBox("処理対象なし", Browser.Buttons.OK);
  } else {
    let sheet = SpreadsheetApp.getActive().getSheetByName('書き込みしたいシート名');
    let row = 2;
    let column = 1;
    let numRows = items.length; // 配列数 = 行数
    let numColumns = items[0].length; // 配列の要素数 = カラム数
    sheet.getRange(row, column, numRows, numColumns).setValues(items);  
  }

}

参考

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4