質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

2700閲覧

GmailAppにてinlineに複数画像を入れたメールを送付したい

manataku

総合スコア45

Gmail

GmailとはGoogleによって提供されているウェブメールのサービスのことです。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2021/09/02 08:06

GASを利用してスプレッドシート上に作成された2つのグラフをgmailにて送付することを実現したいです。
一つの画像を送付することはできましたが、2つのグラフをinlineに入れるとエラーになりました。
解決するにはどこを修正する必要がありますでしょうか。

エラー
TypeError: Cannot read property 'getBlob' of undefined
2つ目の画像の取得が失敗しているのだと思いますが解決方法が分かりません。
場所
コード下部のGmailApp.sendEmail() inlineImagesの部分

function send_gmail() {//シート名をして指定してシートを取得します。今回の場合は「graph」シート var mySheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("graph"); //getChartsメソッドでシート内のチャートを取得 var charts = mySheet.getCharts(); //charts配列に格納されたデータから0番目と1番目のグラフを画像として取得 var imageBlob = charts[0].getBlob().getAs('image/png').setName("chart_image.png"); var imageBlob2 = charts[1].getBlob().getAs('image/png').setName("chart_image.png"); //フォルダIDを指定して、フォルダを取得 var folder = DriveApp.getFolderById('フォルダーID'); //フォルダにcreateFileメソッドを実行して、ファイルを作成 folder.createFile(imageBlob); folder.createFile(imageBlob2); // 画像ファイルを取得 var graphFiles = []; var Folderkey = "フォルダID"; var files = DriveApp.getFolderById(Folderkey).getFiles(); if (files.hasNext()) { graphFiles.push(files.next()); } /* 更新日時の降順に並び替え */ graphFiles.sort(function(a,b){ if(a.getLastUpdated() > b.getLastUpdated()) return -1; if(a.getLastUpdated() < b.getLastUpdated()) return 1; return 0; }); var sheet = SpreadsheetApp.openById("スプレッドシートID"); var mail_info = sheet.getSheetByName("mail_info"); var send_to = mail_info.getRange("A2").getValue(); var send_cc = mail_info.getRange("B2").getValue(); var send_subject = "【テスト】" var send_body = mail_info.getRange("C2").getValue(); var today = Utilities.formatDate(new Date(), "JST", "yyyyMMdd"); GmailApp.sendEmail( send_to, send_subject + today, { cc: send_cc, from: "send@gmail.com",//送信元 name: "テスト",//表示名 htmlBody: send_body, inlineImages: { Graph: graphFiles[0].getBlob().getAs('image/png'), Graph2: graphFiles[1].getBlob().getAs('image/png') } } ); }

エラー箇所
Graph2: graphFiles[1].getBlob().getAs('image/png')
TypeError: Cannot read property 'getBlob' of undefined

send_bodyの中身
こんにちは
<br>
<img src='cid:Graph' width="90%" height="90%"><br>
<br>
<img src='cid:Graph2' width="90%" height="90%"><br>
<br>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

2つ目の画像の取得が失敗しているのだと思いますが解決方法が分かりません。

if (files.hasNext()) { graphFiles.push(files.next()); }

これだと1個しか画像イメージをgraphFilesに追加できていないと思います。したがって

while (files.hasNext()) { graphFiles.push(files.next()); }

とします。


あと、このままだとメール本文が[object][Object]としか表示されないかもしれません。
なぜなら、現行のコードでは
GmailApp.sendEmail()関数の第3引数にObjectが指定されているからです。

第3引数は本文(body)として扱われます。

class GmailApp #sendEmail(recipient, subject, body, options)

optionsの部分が長大になるとメンテしにくくなるので、あらかじめまとめて定義しておきましょう。

var options = { cc: send_cc, from: "send@gmail.com", //送信元 name: "テスト", //表示名 htmlBody: send_body, inlineImages: { Graph: graphFiles[0].getBlob().getAs('image/png'), Graph2: graphFiles[1].getBlob().getAs('image/png') } }

そして、第3引数は本文になるので適当な文字列を指定します。空文字でもいいです。

GmailApp.sendEmail( send_to, //送付先アドレス send_subject + today, //メールの件名 '', // 本文プレーンテキスト options // あらかじめ指定したoptions );

あと、このままだと生成した画像ファイルが残り続け、実行する都度同じ画像ファイルが増え続けるため、処理が終わった後等、適切なタイミングで画像ファイルをクリーンアップする必要があるかもしれません。(質問と直接関係ないのでやり方については省略します)

投稿2021/09/02 15:42

編集2021/09/02 15:46
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manataku

2021/09/03 03:01

qnoir さん ありがとうございます。 アドバイス通り反映し、想定の動作となりました。 画像ファイルをクリーンアップさせる処理は 必要ですので調べながらやってみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問