シゴクリ

GoogleAppsScriptを使い、Gmailに来たWordPressコピー通知メールをスプレッドシートに整形する

公開日:

今回はGAS(GoogleAppsScript)で、Gmail内容を検索し、Googleスプレッドシートに書き出すということをしてみます。

これによって何が出来るかというと、

というところです。もちろん、Gmail検索が出来るのでどう使うかはアイデア次第です。Gmailを毎回検索して見直すなど定形作業化しているものがあれば、だるさから少し解放されるかもしれません。

なお技術レベルはそれほど高くはないとは思いますがとはいえスクリプトを書いて実行して修正する感じはまさにプログラミングなのであまり初心者の方にはおすすめできません。動かない場合は自分で考える必要があるため、動かないときが辛いかなという感じですね。

ひとまずいってみましょうー。

GoogleAppsScrpitでGmailスレッドを検索し、スプレッドシートに書き出す

今回出来るもの

まず、結論的にどういうイメージになるかというと、

Googleスプレッドシートに整形して書き出す

というものが、やや小さいですが左上にある「run」ボタンを押すと書き出されるというシンプルなものです。この画面はGoogleスプレッドシートになります。

便利な点は、毎回Gmailでショートカットでjとかk押して内容を見ていってということをしなくても実行ボタンを押せば、スプレッドシートを見るだけで良いということです。

その前に課題が1つあるのでそこを共有しておきます。

現状の課題

検索対象が20件あり書き出されたとします。実際のGmailでは20スレッドであり、1スレッドに複数メールがあることが普通です。例えば、本日に何回もコピーされると通知メールとしては「通知メール(5)」みたいに、5件がまとまって1スレッドとなるということです。そして、5件のうち最も古いもの?の内容を取ってくるとなっています。

僕の解釈では、ループを回して20スレッド取ってくる、さらに複数メールがある場合は、例えば5メールある場合はそれらも取るというように多重ループの処理で対応できるはずです。が、これは実装出来ていません。実装しようとしたのですが、途中で断念。少なくとも必要なのは、該当スレッドに何件メールがあるかを調べるのが必要で、その分をループで回すことになります。

そうすれば、仮に20スレッドでメールが複数ついていても、全て展開されるということになります。もちろんスレッド単位で良ければこのままで十分使えます。

作り方

今回参考にしたのは、【GAS】Gmailからメールを検索してスプレッドシートに書き出すの記事です。大変参考になりました。ありがとうございます。ほぼこのままといっていいです。

手順としては、Gmail環境があること、googleドライブなどGoogleスプレッドシートが使えることです。これらが分からない方は調べてみてください。

1.Googleスプレッドシートを立ち上げ、「ツール」→「スクリプトエディタ」を選ぶ

2.以下のコードを書く

function searchContactMail() {
  
  //シートのクリア
  var sheet = SpreadsheetApp.getActiveSheet()
  sheet.getRange("A2:F100").clear();

  // Gmailの検索条件
  var strTerms = 'after:2017/9/1 before:2017/9/30 以下の本文がコピーされたようです。';
 
  var myThreads = GmailApp.search(strTerms, 0, 100); //条件にマッチしたスレッドを検索して取得
  var myMessages = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する →二次元配列で格納

  var myMsgs = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得する →二次元配列で格納

  var valMsgs = [];
  var indexIP = 0;
  var ip_str_end = 0;
  
  /* 各メールから日時、送信元、件名、内容を取り出す*/
  for(var i = 0;i < myMsgs.length;i++){

    valMsgs[i] = [];
    valMsgs[i][0] = myMsgs[i][0].getDate();
    valMsgs[i][1] = myMsgs[i][0].getFrom();
    valMsgs[i][2] = myMsgs[i][0].getSubject();
    valMsgs[i][3] = myMsgs[i][0].getPlainBody().slice(0,200);
    valMsgs[i][4] = myThreads[i].getPermalink();
    indexIP = myMsgs[i][0].getPlainBody().indexOf('IP');
    if ( indexIP != -1) {
      ip_str_end = get_returncode(myMsgs[i][0].getPlainBody(),indexIP);
      //Browser.msgBox(ip_str_end);
      valMsgs[i][5] = myMsgs[i][0].getPlainBody().substr(indexIP+4,ip_str_end);
    }

  }

  /* スプレッドシートに出力 */
  if(myMsgs.length>0){
    
    SpreadsheetApp.getActiveSheet().getRange(2, 1, i, 6).setValues(valMsgs); //シートに貼り付け
    
  }
  
  for(var i=0;i < myMessages.length;i++){
    Logger.log(myMessages[i][0].getSubject());  //各スレッドの1番目のメールの表題をログ出力
  }
  
}

//改行コードの位置を返す
function get_returncode(body,startpos){

  var r = 0;
  
  //IPアドレスにつく改行コードを探す
  r=body.substr(startpos+4,20).indexOf("\n");
  //Browser.msgBox(r);
  if ( r != -1 ){
    return r;
  }
  
  r=body.substr(startpos+4,20).indexOf("\r\n");
  //Browser.msgBox(r);
  if ( r != -1 ){
    return r;
  }
  
  r=body.substr(startpos+4,20).indexOf("\r");
  //Browser.msgBox(r);
  if ( r != -1 ){
    return r;
  }
    
}

3.上のコードを保存する

4.スプレッドシートに戻り、「挿入」→「図形描画」で適当な四角形を書き保存して閉じる(ボタンとして使うため)

5.作った四角ボタンを左クリックすると、右上に三点リーダーが出るのでそれをクリックし「スクリプトを割り当て」を押す

6.テキスト欄に「searchContactMail」とコピペでいいので入れて完了する(リストボックスとかあっても良さそうですが出てこない、上のコードのメイン関数を入れるってことですね)

7.ボタンをクリックして処理を実行し、出来ることを確認する(スクリプトを実行していますという処理メッセージがスプレッドシート上部出てきます)

8.書き出されたデータを見てあとはご自由に煮るなり焼くなりどうぞって感じです。

簡単なコードの解説

注意点

追加アイデア

とまあ、キリがないのでこのあたりにしますが、色々アイデアで改造できるので試してみると面白いと思います。

おわりに

色々追加アイデアを試していたらわりと出来ました。あと、直接日付検索とかやってますがこれも、セルやら入力フォームをダイアログ形式とかinputBoxとかですかね、そういうのに変えるとよりGUI的にも便利になりそうですね。

GASで色々遊んでみて分析やら解析を便利にしてもらえると面白いと思います。これで自分の知識も定着したので嬉しい限りです。

筆者プロフィール

シゴトクリエイター 大橋 弘宜
「シゴクリ」運営者。アイデアの力でお客様に貢献するゼロイチ大好きアイデアマン。ビジネスアイデア相談実績等は200超を超える。好きな言葉は三方良し。詳しい自己紹介仕事実績も合わせてご覧ください。お仕事メニューお問い合わせはお気軽にどうぞ。
モバイルバージョンを終了