Google App ScriptでGmailに来た特定のメールをLINEWORKSへ通知する

さてさて。初めてのnoteです。基本的に技術Blogとして使うつもりなのでちょこちょこかいてみまーす。

本日はタイトルにある通り。

会社でLINEWORKSへの通知が欲しいという要望がありましたのでその時のプログラムをのせておきます。仕組みはGmailに来た特定のメール5分に一回AppScript使って検索して必要事項を取ってきたのちにLINEWORKSのチャットBotAPIにぶん投げてるだけです。笑

その際BOTに通知する人を選びたかったので、メールの内容にLINEWORKSアカウント(メールアドレス)を含めてメール通知するようにしています。(こうしないとそのBOTに入っている人全員に通知が飛ぶ....) 

通知UZEEEEEEEとならないように...w

■Gmailに来た特定のメールをAppScriptを使って検索する。

Gmailってスレッドって概念があるらしく、メールボックスを全検索してもだめらしいので二次元配列を使ってスターが付いていないメールを検索してます。

function getMail(){
 //件名の指定
 var FindSubject = 'subject:(タイトル) ';

 //指定した件名のスレッドを検索して取得 
 var myThreads = GmailApp.search(FindSubject, 0, 10); 
 
 //スレッドからメールを取得し二次元配列に格納
 var myMessages = GmailApp.getMessagesForThreads(myThreads);
 for(var i in myMessages){
   for(var j in myMessages[i]){

     //スターがついていないメッセージのみ処理   
     if(!myMessages[i][j].isStarred()){ 
       
       //  メッセージから本文の取り出して改行を,に変更
       var strMessage = myMessages[i][j].getPlainBody().slice(0,1000);   
       var strMessage = strMessage.replace(/\r?\n/g,",");
       
       //  本文を配列へ
       var resArray = strMessage.split(",");

       //メールアドレスを変数へ
       var mailpattern = new RegExp('.*?@unk.jp' );
       var onlyMail = resArray.filter(function(e){return mailpattern.test(e);});
       var mailAddres = onlyMail[0].substring(0)
       
       //URLを変数へ
       var URLpattern = new RegExp('^https' );
       var onlyURL = resArray.filter(function(e){return URLpattern.test(e);});
       var URL = onlyURL[0].substring(0);
               
       //LINEWORKSにメッセージを送信
       sendLine(mailAddres,URL);

       //処理済みのメッセージをスターをつけてゴミ箱へ
       myMessages[i][j].star(); 
       myMessages[i][j].markRead();
       myMessages[i][j].moveToTrash();
     }
   }
 }
}

■LINEWORKS  の特定のBOTへPOST

詳しくはここを参照してください。

詳しく書くとhttps://auth.worksmobile.com/ba/{API ID}/service/tokenにPOSTしてTokenを取ってきたのちにhttps://apis.worksmobile.com/r/{API ID}/message/v1/bot/{botNo}/message/pushに必要事項をかいてPOSTしているだけというオチ。

必要なパラメータはLINEWORKSの管理画面から取ってこれます。

//LineにPOST
function sendLine(mailAddres,URL){

 //パラメータを変数に代入

 var serverId = "<ServerID>"
 var privateKey = "-----BEGIN PRIVATE KEY-----\<PrivateKey>\r-----END PRIVATE KEY-----"
 var apiId = "<apiID>"
 var consumerKey = "ConsumerKEY";
 
 //JWTの生成
 
 const header = Utilities.base64Encode(JSON.stringify({"alg":"RS256","typ":"JWT"}), Utilities.Charset.UTF_8);
 const claimSet = JSON.stringify({
   "iss": serverId,
   "iat": Math.floor(Date.now() / 1000),
   "exp": Math.floor(Date.now() / 1000 + 2000)
 });
 const encodeText = header + "." + Utilities.base64Encode(claimSet, Utilities.Charset.UTF_8).slice(0, -2);
 const signature = Utilities.computeRsaSha256Signature(encodeText, privateKey);
 const jwtToken = encodeText + "." + Utilities.base64Encode(signature).slice(0, -2);
 
 //サーバートークンの生成
 
 const uri = 'https://authapi.worksmobile.com/b/' + apiId + '/server/token';
 const payload = {
   "grant_type" : encodeURIComponent("urn:ietf:params:oauth:grant-type:jwt-bearer"),
   "assertion" : jwtToken
 };
 
 const options = {
   'method': 'post',
   'headers': {'Content-Type' : 'application/x-www-form-urlencoded'},
   "payload": payload
 };
 
 var body = UrlFetchApp.fetch(uri, options);
 var jsonData = JSON.parse(body);  
 var token = jsonData.access_token;

 
 //LineにPOSTするデータの生成と送信
 //LINE通知文の生成
 
 var payload2 = {
   "accountId": mailAddres,
   "content": {
   "type": "text",
   "text":  \n'+ URL
 }
}
 
 var headers = {
   "Content-Type" : 'application/json; charset=utf-8',
   "consumerKey"   : consumerKey,
   "Authorization" : 'Bearer ' + token
 }

 var options2 = {
   "method" : 'post',
   "headers" : headers,
   "payload" : JSON.stringify(payload2)
 }

//API IDとBOT NOは適時修正してください
 UrlFetchApp.fetch("https://apis.worksmobile.com/r/{API ID}/message/v1/bot/{botNo}/message/push", options2); 
}

これ応用したらスプレッドシートに書いてある内容を取ってきて通知することも可能だなぁ....そうすればよかった。

この記事が気に入ったらサポートをしてみませんか?