見出し画像

請求書、言われる前に渡せます

メールで送付されて来る請求書って渡すの忘れますよね
忘れてたからって探してみると埋れてますよね
そもそも請求書受け取るメアドを担当者に変えればいいのか?と思っても変えられなかったりしますよね

Google WorkSpace環境でGAS使っていい感じにできるのを書きました。

※色々雑なのはご了承ください

イメージ図

画像1

Slackに来る通知

画像2

GAS

これを毎月1日とか定期実行してください。毎日でもいいけど

//欲しい請求書の情報
//下記は例なので、自分の環境に合わせて変更してください。
//search_termには該当の請求書メールを抽出する為の検索条件を入れてください
//file_nameにはドライブに格納したいファイルの名称(一部でも可)を入れてください
const BILLINGS_INFO = [{
   "app_name":'Slack',
   "file_name":'slack_receipt_SBIE',
   "search_term":'from:(feedback@slack.com) to:(hogehoge@hoge.com) subject:(HOGEHOGE の月次サマリー) has:attachment'
 },{
   "app_name":'Zoom',
   "file_name":'INV',
   "search_term":'from:(billing@zoom.us) to:(hogehoge@hoge.com) subject:(Payment Processed for) has:attachment'
 },{
   "app_name":'Google',
   "file_name":'.pdf',
   "search_term":'from:(payments-noreply@google.com) subject:(Google Workspace: hoge.com の請求書をご利用いただけます) has:attachment'
 }
]
//GoogleドライブのID
const FOLDER_ID = '格納したいGoogleのID入れてください';
//Slackのtoken
const SLACK_TOKEN = "xoxb-xxxxxxxx-xxxxxxxx-xxxxxxxx"
//Slackのchannel
const SLACK_CHANNEL = "XXXXXXXXXX"

function save_mailItem_to_drive(){
 BILLINGS_INFO.map(function(billing_info){
   //請求書が送付されてくるメールの検索条件
   let search_term = billing_info.search_term;
   //必要なファイルの名称。
   let file_name = billing_info.file_name;
   //該当のサービス名称
   let app_name = billing_info.app_name;

   //メッセージ取得
   let messages
   try{
     console.log("メールを検索します。");
     messages = Gmail.Users.Messages.list('me',{"q":search_term});
   }catch(err){
     console.log("メール検索でエラーが発生しました : " + err );
     return
   }

   //該当するメッセージが1件でもあったら実行
   if(messages.resultSizeEstimate){
     let url_files = [];
     //メッセージの処理
     messages.messages.map(function(message){
       console.log("message.id:"+message.id);
       let data_message
       try{
         console.log("メールを取得します。");
         data_message = Gmail.Users.Messages.get('me',message.id);
       }catch(err){
         console.log("メールの取得でエラーが発生しました : " + err);        
         return
       }
       //添付ファイル取得
       data_message.payload.parts.map(function(part){
         if(part.partId!=0){
           const id_attachment = part.body.attachmentId;
           const mimeType_attachment = part.mimeType;
           const filename_attachment = app_name + "-" + part.filename;
           let file
           try{
             console.log("添付ファイルを取得します。");
             file = Gmail.Users.Messages.Attachments.get('me', message.id, id_attachment);
           }catch(err){
             console.log("添付ファイルの取得でエラーが発生しました : " + err);            
             return
           }
           const blob = Utilities.newBlob(file.data,mimeType_attachment,filename_attachment);
           const meta_file = {
             "title": filename_attachment,
             "mimeType": mimeType_attachment,
             "parents": [{"id": FOLDER_ID}]
           };
           const op = {
             "supportsAllDrives":true
           }
           let file_drive
           let filecheck = filename_attachment.match(file_name);
           //該当のファイルがあるか確認
           if(filecheck){
             try{
               console.log("共有ドライブへアップロードします");
               file_drive = Drive.Files.insert(meta_file,blob,op);
               //メール削除処理
               Gmail.Users.Messages.trash('me',message.id);
             }catch(err){
               console.log("共有ドライブへアップロードでエラーが発生しました : " + err);
               return
             }
             url_files.push(file_drive.alternateLink);
           }else{
             console.log("違うファイルでした");              
             console.log("filename_attachment: " + filename_attachment);              
           }
         }
       })
     })
     try{
       console.log("Slackに通知します");
       //Slackへ通知
       let result_post_slack = postMessage(url_files,app_name);
     }catch(err){
       console.log("Slackに通知できませんでした : " + err);
       return
     }
   }else{
     console.log("メールはなかったよ");
   } 
 })
}

function postMessage(url_files,app_name) {
 //アップロードされたファイルのリンクを取得
 let url_raw = "";
 url_files.map(function(url){
   url_raw = url_raw + url + "\n";
 })
 var url = "https://slack.com/api/chat.postMessage";
 
 // トークンとか入れる
 var payload = {
   "token" : SLACK_TOKEN,
   "channel" : SLACK_CHANNEL,
   "text" : app_name + " の請求書来ました\n"+ url_raw
 };
 var params = {
   "method" : "post",
   "payload" : payload
 };
 
 // Slackに投稿する
 UrlFetchApp.fetch(url, params);
}


Slackのtoken取得とかは下記を参考にやってみてください


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