IT仕事

「〇〇屋商店」のラベルを付けたGmailメッセージからGASで件名と本文の一部を正規表現で取り出してスプレッドシートに格納

投稿日:

仕事でGoogle App Script(GAS)を使うケースが出てきそうなので、休日なれど、自主勉してみた。

やりたいことは、オンラインショップの注文メールの中から、必要な事項を取り出して、スプレッドシートに格納するというもの。

けどもGoogle先生に聞いてもなかなかよい答えを得られなかった。

そこで、自分で試行錯誤して作ってみた。

こちらのブログのコードをほとんど引用させていただいた。
ありがとうございます。

[Google Apps Script]メール情報をスプレッドシートに書き出す | Developers.IO

コードの最初の部分(スプレッドシートをクリア)と、最後の部分(match(/お名前(.+)/))だけは、私のオリジナル・・・。

function searchContactMail() {
  
  // 書き込み先のスプレッドシートをクリア
    var sheet = SpreadsheetApp.getActiveSheet();
    sheet.clear();
  
  /* Gmailから特定条件のスレッドを検索しメールを取り出す */
  var strTerms = 'label:y寺田屋商店'; //メール検索条件
  var numMailMax = 3; //取得するメール総数  
  var numMail = 3; //1度に取得するメール数
  var myThreads; //条件にマッチしたスレッドを取得、最大500通と決まっている
  var myMsgs; //スレッドからメールを取得する →二次元配列で格納
  var valMsgs;
 
  var i = SpreadsheetApp.getActiveSheet().getLastRow();
 
  if(i<numMailMax) {  
    valMsgs = [];
    myThreads = GmailApp.search(strTerms, i, numMail); //条件にマッチしたスレッドを取得、最大500通と決まっている
    myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する →二次元配列で格納
 
    /* 各メールから日時、送信元、件名、内容を取り出す*/
    for(var j = 0;j < myMsgs.length;j++){
      valMsgs[j] = [];
      valMsgs[j][0] = myMsgs[j][0].getFrom();
      valMsgs[j][1] = myMsgs[j][0].getReplyTo();
      valMsgs[j][2] = myMsgs[j][0].getTo();
      valMsgs[j][3] = myMsgs[j][0].getDate();
      valMsgs[j][4] = myMsgs[j][0].getSubject(); 
      
      // 行を取り出したいときは、このやり方で
      // var body = myMsgs[j][0].getPlainBody();
      // var lines = body.split('\r\n');
      // valMsgs[j][5] = lines[4]; //4行目をとってくる

      // 正規表現でキーワード文字以降を取り出したいときは、このやり方で
      valMsgs[j][5] = myMsgs[j][0].getPlainBody().match(/お名前(.+)/);       
      valMsgs[j][6] = myMsgs[j][0].getPlainBody().match(/ふりがな(.+)/); 
      valMsgs[j][7] = myMsgs[j][0].getPlainBody().match(/郵便番号(.+)/); 

      // キーワード文字自体を出力したくないときは、[slice]を使うらしいが、うまくいかない・・・
      // valMsgs[j][5] = myMsgs[j][0].getPlainBody().match(/お名前(.+)/).slice(1);       
      // valMsgs[j][6] = myMsgs[j][0].getPlainBody().match(/ふりがな(.+)/).slice(1); 
      // valMsgs[j][7] = myMsgs[j][0].getPlainBody().match(/郵便番号(.+)/).slice(1); 
    }
 
    /* スプレッドシートに出力 */
    if(myMsgs.length>0){
      SpreadsheetApp.getActiveSheet().getRange(i + 1, 1, j, 8).setValues(valMsgs); //シートに貼り付け
    } 
  }
}

作るのに2時間かかった。
うれしさひとしお。
ただ、slice(1)にしたら3文字カットされるのは、なぜなのか、不明だ。課題。

-IT仕事

執筆者:

関連記事

no image

同じセルに数字があるファイルを開いて別のファイルにどんどん転記しては閉じていく×1000件・・・をExcelマクロで作る

昨日は、アンケートの下仕事をやった。 各ファイルの同じセルに数字の記入があって、それを開いて別のファイルにどんどん転記しては閉じていく・・・というのをExcelマクロで作るのだが。 最初は手作業でコピ …

no image

Access2013のWeb機能について(FileMakerと比較して)メモ

ここ数日、MS-Access 2013のWeb機能を勉強していたので、そのメモ。 ■フォームの書式 選択肢があまりに少ない。FMのようにデザインやテーマが用意されていない。 リスト表示のサイズが変更で …

no image

WordPressMe2.3.3で、Deprecatedエラー

朝、出社して管理しているお客様のサイトを見ると、上部に見たこともないエラーがずらずら出ていた。 Deprecated: Assigning the return value of new by ref …

no image

WordPress初設定の覚書

まずは、ヘッダー画像を始め画像関係をいろいろと。 Defaultテンプレートを改造する方向でお客さんのテーマを作成したのだが、どうCSSを調べても直しても背景の浮き出し効果のある画像が消えてくれない。 …

no image

パラメータクエリにパラメータをセットして実行した結果をデータシートで表示する」というコードの実行で3065エラー

Accessの仕様として、パラメータクエリだけが駄目なのかと思ったら、なんと選択クエリが駄目なのだそう。 理由は、Executeメソッドはアクションクエリのもので、選択クエリのものではないからだそう。 …