請求書、言われる前に渡せます
メールで送付されて来る請求書って渡すの忘れますよね
忘れてたからって探してみると埋れてますよね
そもそも請求書受け取るメアドを担当者に変えればいいのか?と思っても変えられなかったりしますよね
Google WorkSpace環境でGAS使っていい感じにできるのを書きました。
※色々雑なのはご了承ください
イメージ図
Slackに来る通知
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取得とかは下記を参考にやってみてください
この記事が気に入ったらサポートをしてみませんか?