【GAS】メールを検索して書き出す方法(含む返信メール)。人、時間の指定、配列の使い方など
昨今の仕事では、メールでのやりとりが不可欠となってきましたが、
逆にメールが多すぎて処理しきれない。
どれを対応したかわからなくなってくる。
ということが多々あると思います。
GASを用いることで、グーグルスプレッドシートから、
メールを送れることはご存じかと思いますが、
特定のメールを拾い上げてくることもできます。
そこで、
・ある人からのメールがたまっているから一つずつ処理していきたい。
・会議の場で、PJの人から送られてきたメールの進捗を1件ずつ確認していきたい。
という希望を叶えるような、スプレッドシートのgasを考えてみました!
サンプルファイルを紹介しますので、
これをテンプレートに、自分なりにカスタマイズして使ってもらえたらと思います!
このコードで出来ること。
このスプレッドシートでできることは、
①指定日以降の、指定した送信者からのメールを検索し、
②古い順に並べて表示させることができます。
・題名が同じものは同じ行内で、左から最新の返信が表示されます。
・メールのリンクアドレスも張っておりますので、リンクに飛ぶことも可能です。
下の画像は、検索結果です。(クリックして拡大)
上から順に、古いものから検索されたメールが並び、題名の同じチェーンメール(返信)については、右側に並べられて行っているのが分かるかと思います。
実行の仕方は、
①いつから
②誰から
③最大件数
を打ち込み、「実行」ボタンを押すだけです。
実行した結果を動画にしてみました。
少し長いです…
GASの入ったサンプルファイルのダウンロード
GASの入ったサンプルファイルは下のボタンからダウンロードできます。
そのままですと閲覧のみ可能になっていますので、
ファイル→コピーを作成で、自分のスプレッドシートにコピーを作成してください。
使っているスクリプトを簡単に説明
使っているスクリプトについて簡単に説明していきます。
特定のメールを検索
まずは、特定のメールを抜き出す方法です。
特定のメールを書き出しているコードは、下記に記載する部分となっており、
①検索キーを作成
②GmailApp.search()でメールを検索
③GmailApp.getMessagesForThreads()で一つ一つのメッセージに分解しています。
const dateafter=Utilities.formatDate(sheet1.getRange(1,2).getValue(), 'Asia/Tokyo', 'yyyy/MM/dd');
const fr=sheet1.getRange(1,6).getValue()
const KENSU=sheet1.getRange(1,9).getValue()
var findkey = "after:"+dateafter+" FROM:"+fr
var kensakukekka = GmailApp.search(findkey,0,KENSU);
var Msg = GmailApp.getMessagesForThreads(kensakukekka);//二次元配列
①検索キーの作成
まずは検索キーの作成です。
Gmailapp.serchは様々な検索に対応していますが、今回は、
誰から来たのか = from:
何時以降のメッセージか =after:
で検索をかけております。※空白を空けて検索することでand検索が可能です。
②GmailApp.search()でメールを検索
検索キーが作成出来たら、そのキーを使い、
GmailApp.search(findkey,0,KENSU);
でメールを検索します。
最大件数も指定できますので多くなり過ぎないように、指定しています。
③メッセージに切り分け
GmailApp.search(findkey,0,KENSU);で取り出せた情報は、
スレッドの情報になっています。
ですので、これを一つ一つ切り分けていく必要があります。
それが
var Msg = GmailApp.getMessagesForThreads(kensakukekka);
です。Msgで取り出した情報は2次元配列になっております。
少しわかりにくいですが、スレッドとメッセージのイメージは
下記のとおりです。
スレッドとメッセージのイメージ
スレッド①(メッセージ 本文A1→返信B1→返信C1→返信D1)
スレッド②(メッセージ 本文A2→返信B2→返信C2→返信D2)
切り分けた後は2次元配列
・Msg[0][0]=本文A1
・Msg[1][2]=返信C2
※配列は[0]からスタート。
メールの整理
スレッドを抜き出すことができましたので、
次はその情報を整理していきます。
date,from,subj,body,permなどで情報を取り出し、2次元配列を作っていきます。
スレッドごとに分ける必要があるため、unshiftとconcatを使い分けています。
/* 各メールから日時、送信元、件名、内容を取り出す */
for(var i=0;i<Msg.length;i++){
if(i%5==0){book.toast("スクリプトを実行中です。" + i + "/" + Msg.length , "実行中", 5)}
for(var j=0;j<Msg[i].length;j++){
var date = Msg[i][j].getDate();
var from = Msg[i][j].getFrom();
var subj = Msg[i][j].getSubject();
var body = Msg[i][j].getPlainBody().slice(0,200);
var perm = kensakukekka[i].getPermalink();
if(j==0){OutputMsg.unshift([date,from,body])}
else{
OutputMsg[0]=([date,from,body]).concat(OutputMsg[0])
}
}
OutputMsg[0]=([subj,perm]).concat(OutputMsg[0])
//[date,from,subj,body,perm]
}
二次元配列の長さを合わせて貼り付け
最後に2次元配列の長さを合わせて貼り付けです。
上記のプログラムで抜き出すと、
スレッドの返信の数によって、
列の長さが異なっています。
GASは列の数をすべて合わせないと一括出力できない設定になっていますので、
ですので、一番長い列の長さを検索し、
すべての行をその長さに変更します。
そのあとsetvaluesで二次元配列をセルに代入します。
for(var i=0;i<OutputMsg.length;i++){
var cn=OutputMsg[i].length
if(cn>maxc){maxc=cn}
}
for(var i=0;i<OutputMsg.length;i++){
OutputMsg[i].length=maxc
}
if(Msg.length>0){
var mySheet=SpreadsheetApp.getActiveSpreadsheet().getSheetByName('メール確認');
mySheet.getRange(3, 2, OutputMsg.length,maxc).setValues(OutputMsg);
}
まとめ
GASを使ってメールの検索ができることは知っており、
どのように使うべきか、、と悩んでいましたが、
メールで仕事を行っている現代において、
メールのやりとりを見れば=TODOリストになっていることが分かりました。
ぜひ、このファイルを参考に、
仕事で活用していただけたらと思います!
コメント欄