見出し画像

【GAS】Google Apps Script 活用事例 inlineImageでメール文面に画像の挿入をした下書きを作成しよう。

メールの自動化は、想像以上に便利

GASのトリガーを使って決まった時間になったら、メールが自動で飛んでくれるのも便利なのですが、なかには、ちょっと加筆したいなとか、スプレッドシートの情報を貼り付けたいなと思うシーンがあります。社外に出すメールであれば、なおさら送る前に相手の社名や担当者の名前、部署、変換ミスがないか確認するフローがあった方がいいでしょうね。誤って送ってしまったら、もう既に後の祭りです。

そんな時は、GmailApp.sendEmail じゃなくて、GmailApp.createDraft を使ってみましょう。スクリプトを実行するとGmailの下書きに、あらかじめ用意したテンプレートに沿った文面が作成され、送信先を確認してから送信する事が出来ます。

今回は、シートのグラフを画像化→それをメールに貼り付けて送る下書きを作成するというスクリプトです。

サンプルはこちら

便利だけど、グラフの見た目はシートと同じにならない。

ちょっと、グラフのレイアウトが崩れてしまいます。なので、詳細は、シート見てくださいと逃げる算段......。

スクリーンショット 2020-11-03 19.52.25

完成形のスクリプト

2020/11/03 V8で書き換えました。
実務で使った際は、一つのシートに、メール送信したいグラフが2つありました。driveImage1とか、driveImage2の変数の置き方は、もうちょっと良い方法がありそうな気がします.....。

function draftEmail(){
 //送るシートのURLを取得するための記述
 const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
 const sheet       = spreadsheet.getSheetByName('グラフ');
 const url         = spreadsheet.getUrl() + '#gid=' + sheet.getSheetId();
 
 //前月の日付を取得
 const date      = new Date();
 date.setMonth(date.getMonth() -1);
 const lastMonth = Utilities.formatDate(date, 'JST', 'yyyy年MM月度');
 
 console.log('前月の日付', lastMonth);
 console.log('シートのURL', url);
 
 
 //スプレッドシートからグラフを取得する。
 const charts = sheet.getCharts();
 const folder = DriveApp.getFolderById('14By_SmRXnkPCy7GJ4STZA_rMfZgv0Q73');
 
 //フォルダ名の確認
 console.log(folder.getName());
 
 let count = 1;
 //シート上のチャートをあるだけ取得、今回は2つのみ。1つであればfor文は不要。
 for(const chart of charts) {
   const imageBlob  = chart.getBlob().getAs('image/png').setName(lastMonth + 'chart_image_'+ count +'.png');//グラフを画像に変換
   const image      = folder.createFile(imageBlob);
   count += 1;
   
 }//for
 
 
 //1度、Google Driveに保存した画像を取得
 const driveImage1 = DriveApp.getFilesByName(lastMonth + 'chart_image_'+ 1 +'.png').next();
 const driveImage2 = DriveApp.getFilesByName(lastMonth + 'chart_image_'+ 2 +'.png').next();
 
 
 //メールを送信する設定
 const mailListSheet = spreadsheet.getSheetByName('メーリス');  
 const mailAddress   = mailListSheet.getRange(2, 2, mailListSheet.getLastRow()-1).getValues(); //メールアドレスをリストから取得して配列に入れる
 const mailCc        = "*********@gmail.com,**********@gamil.com";
 const subject       = lastMonth + " " + "の*******集計結果について";
 const mailBody      = '';
 let mailHtmlBody    = '各位<br><br>お疲れ様です。<br>〇〇です。<br><br>********の集計結果についてご報告致します。<br>下記のグラフのように推移しています。ご確認ください。<br><br>';
 
 
 //該当するスプレッドシートのURLを貼り付ける
 mailHtmlBody += '<img src="cid:chart1"><br><img src="cid:chart2">';
 mailHtmlBody += url + '<br><br>';
 
 const options = {
   cc: mailCc,
   htmlBody: mailHtmlBody,
   inlineImages:{
     chart1: driveImage1.getBlob(),
     chart2: driveImage2.getBlob()
   }
 }
 
 GmailApp.createDraft(mailAddress, subject, mailBody, options);
 
}

ポイントはシート上のグラフ→画像にして→Google Driveに保存→そのあと、ファイル名を指定してDriveから読み込み、取得→HTML形式で貼り付けという感じです。

実は今回、この記事を書こうと思ったのは、下記の記事を読んで、こんな事もGASで出来るのかぁと知り、画像の挿入:インラインも出来るのかなぁと思ったのがきっかけです。

画像の添付だと、クリックしないと何の画像か分からない。ちょっと僕は、そこが面倒だなぁと思っていました。通販とかの販促メールだと画像が本文中に掲載されているのとかありますよね?やりたい事はまさにアレです!!

SONYさんから届いたテレビ買いませんか?メールの例、4Kディプレイとか憧れるけど、置く場所がないなぁ.....。

スクリーンショット 2019-11-30 7.33.12

画像を手動で挿入する際は、インラインか添付かを選べます。これ、GASで出来ないのかなと思うのは、ごく自然な流れかなと思います。

スクリーンショット 2019-11-29 21.23.47

ノンプロ研の主催者、高橋さんに聞いてみるも反応が超ドライ.....。

スクリーンショット 2019-11-30 7.16.35

こうすれば、出来ます!!コード貼っときますね〜くらいの回答を期待していたのですが、現実は思い通りにならず、読み漁っていくうちに、この記事にたどり着き、ヒントを掴んで今に至ります。

//メールを送信する設定
 const mailListSheet = spreadsheet.getSheetByName('メーリス');  
 const mailAddress   = mailListSheet.getRange(2, 2, mailListSheet.getLastRow()-1).getValues();
for(let i = 0; i < mailAddress.length; i++){

    const address = mailAddress[i];
    
    //送る相手、件名、本文、CCなどのオプション情報
    GmailApp.createDraft(address, subject, mailBody, options);


}

for文の中に、createDraft()や、sendEmail()を書くと名前や、シート上の値を挿入する、差し込みメールを作成する事が出来ます。

本文が長い場合は?

本文が長い場合は、スクリプトに書くよりも、Google Documentなどにメールのテンプレを作成し、Document本文を取得する方法がオススメです。

日付やZoom URLなど、間違ってはいけないものを、自動で挿入出来るようにしています。


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