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

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

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

SendGridは、米SendGrid社のクラウド型メール配信サービス。アカウントを作成するだけですぐに利用することが可能です。さらに到達率向上のための送信ドメイン認証対応や、柔軟性のあるスケーラビリティなど多くの機能を有します。

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

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

Q&A

解決済

1回答

374閲覧

スプレッドシートからGASでセンドグリッドを介してメールを自動送信したい

10-mo

総合スコア21

SendGrid

SendGridは、米SendGrid社のクラウド型メール配信サービス。アカウントを作成するだけですぐに利用することが可能です。さらに到達率向上のための送信ドメイン認証対応や、柔軟性のあるスケーラビリティなど多くの機能を有します。

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google Apps Script

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

0グッド

1クリップ

投稿2024/03/06 05:48

編集2024/03/07 00:16

実現したいこと

ここに実現したいことを箇条書きで書いてください。
・スプレッドシートのコンテナバインドから、センドグリッドを介してメールを自動送信したい
・できるだけ現状のコード改変は避けたい

前提

◯ここに質問の内容を詳しく書いてください。◯

イベントの申し込みフォームを作成しています。Googleフォームで申込受付⇨スプレッドシートに集約⇨QRコードを生成し申込者にメール送信という流れです。
申込者が想定よりも多くなりそうで、GASでの返信だと制限に引っかかる可能性が出てきたため、センドグリッドを利用して自動返信したいと思っています。
下記サイトを参考にしながら作成を試みるも、エラー表示ばかりで一向に解決できないため、こちらに質問させていただきました。

https://teratail.com/questions/eab8j0pf72wzkk
https://www.safetyrabbit.net/techinfo/google-apps-script-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-5-sendgrid-web-api-v3%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E9%80%81%E3%82%8B/

スクリプトの作成も動画やサイトを見ながら作りましたが、センドグリッドとの連携については情報量が少なく、上記サイトを参考にしても解決できず、ご質問させていただきました。よろしくお願いいたします。

発生している問題・エラーメッセージ

①Exception: Request failed for https://api.sendgrid.com returned code 400. Truncated server response: {"errors":[{"message":"The to email parameter is required.","field":"personalizations.0.to.0.email","help":"http://sendgrid.com/docs/API_Reference/... (use muteHttpExceptions option to examine full response) at sendEmail(無題:24:28) ※どの時に表示されたのかコードの記録がありません… **⇨表示されなくなりました** ②Exception: Request failed for https://api.sendgrid.com returned code 400. Truncated server response: {"errors":[{"message":"Additional property mail is not allowed.","field":"personalizations.0.mail","help":null},{"message":"Invalid type. Expected:... (use muteHttpExceptions option to examine full response) at sendmail(センドグリッド送信:44:15) at sendEmail(コード:226:3) at form(コード:69:3) ※再度表示されるようになりました 手を加えながらのため、ここにあげたコードと行数が一致しないかもしれません。。。

③コメントいただき修正後、再度スクリプト実行したところ「完了」と表示されました。しかし、実際はメールが送信されておりませんでした。私のテストメールアドレスに受信メールがありません
※20240307 8:45現在
※function sendGridEmail~は別のスクリプトに記入しました。

該当のソースコード

Google

1 2function form(e) {//メイン関数 3 var values = e.values;//フォームの回答を取得 4 //var stamp = values[0];//タイムスタンプを取得 5 var mail = values[1];//アドレス 6 var date = values[2];//日付 7 var name = values[3];//氏名 8 var total = values[4]+values[5]+values[6]+values[7]+values[8];//人数←「シンプルに+で足すでOK」 9 var way = values[9];//イベントをどのように知ったか 10 var up = 'FALSE'; 11 var brank = ''; 12 var ss = SpreadsheetApp.getActiveSpreadsheet();//スプレッドシートを有効にする 13 var sht = ss.getSheetByName("来場者"); 14 sht.appendRow([brank, mail, name, way, total, up, date]); 15 console.log(sht); 16 17 var today = Utilities.formatDate(new Date(), "JST", "yyyy/MM/dd"); 18 var ss = SpreadsheetApp.getActiveSpreadsheet(); 19 var sht = ss.getSheetByName("来場者"); 20 var lastrow = sht.getLastRow(); // 最終行を取得 21 var lastcol = sht.getLastColumn(); // 最終列を取得 22 var range = sht.getRange(1, 1, lastrow, lastcol); 23 var values = range.getValues(); // 情報をオンメモリに保持 24 25 /*来場者シートのデータを全部取得し、1行ずつチェック。 26 A列が空欄の場合はランダムな文字列を記入。 27 I列にQRコードの数式を設定 28 */ 29 for (var i = 1; i < lastrow; i++) { 30 data = values[i][0]; 31 if (data == "") { 32 values[i][0] = getRndStr(); 33 } 34 values[i][8] = false; 35 var qrc1 = '=image(\"https://chart.apis.google.com/chart?chs=250x250&cht=qr&chl=\"&A' + (i + 1) + ')'; 36 values[i][7] = qrc1; 37 } 38 range.setValues(values); //スプレッドシートに書き戻し 39 40 /*回答の名前と一致する行の1列目をidとして取得する*/ 41 for (let row = 1; row <= lastrow; row++) { 42 if (sht.getRange(row, 3).getValue() == name) { 43 var id = sht.getRange(row, 1).getValue(); 44 } 45 } 46 //------------------上まではOK(フォームのセクションが消えると、動作不良になるので注意------------------------ 47 //------------------------------------------ 48 // 日程シートから該当日のデータを取得 49 // フォームの送信内容を取得 50 // const reserveDate = items[2].getResponse(); // 下のように修正 51 const reserveDate = date; // dateをそのまま使う 52 //console.log(reserveDate);//5月5日(日) 10:00←日付が取得できてる 53 54 // 予約処理 55 const reservationCount = parseInt(total); // 予約人数 56 //console.log(reservationCount); 57 const result = updateDatesSheet(reserveDate, reservationCount ); // 予約人数も渡す。←ここがエラー 58 //console.log(reservationCount);//予約総数を取得◯ 59 //console.log(result);// 60 // 追加:reserveSheet変数の定義 61 const reserveSheet = ss.getSheetByName("予約"); 62 console.log(reserveSheet); 63 64 if (result === "success") { 65 reserveSheet.appendRow([mail, reserveDate]); // 予約シートに追記 66 updateForm(); // フォームの「空き状況」を更新 67 } 68 69 // 追加。メール送信時にid, name, totalを渡す。 70 sendEmail(mail, date, result, id, name, total); 71 //createDraft(mail, date, result, id, name, total); 72} 73 74/** 75 * 引数に指定した予約日の予約人数が、定員オーバーでないか確認する。 76 * オーバーしていなければ、日程シートの現在の予約数に予約人数を加算し、文字列"success"を返す。 77 * オーバーしている場合は、文字列"error"を返す。 78 * 引数:reserveDate フォームに入力された予約日 79 * reservationCount フォームの回答から計算した予約人数 80*/ 81function updateDatesSheet(reserveDate, reservationCount ) { // 修正:予約人数を受け取る。 82 const ss1 = SpreadsheetApp.openById("ここにスプレッドシートID"); 83 const datesSheet = ss1.getSheetByName("日程"); 84 const table = datesSheet.getDataRange().getValues(); 85 const index = table.findIndex(row => row[0] === reserveDate); 86 console.log(table); 87 88 // 追加:フォームで回答された日付がスプレッドシート中になかった場合の処理。 89 if (index === -1) return "error"; 90 91 const target = { 92 rowNum: index + 1, 93 date: table[index][0],//日にち 94 cap: table[index][1],//定員 95 reserved: table[index][3], // 予約済人数:日程シートのD列 96 } 97 98 // 定員超過しなければ「予約済」に加算する 99 // [更新前予約人数+フォームで回答された予約人数]と定員とを比較する。+ reservationCount 100 if (target.reserved <= target.cap) { //予約数<=定員 101 // 更新後予約済人数を日程シートの予約済(C列)に書き込む。+ reservationCount 102 datesSheet.getRange(target.rowNum, 3).setValue(target.reserved ); 103 return "success" 104 } else { 105 return "error" 106 } 107} 108 109function sendEmail(mail, preferredDate, result, id, name, total) { // id,name,totalを受け取るように修正 110//function createDraft(mail, preferredDate, result, id, name, total) { 111 const mailTitle = "イベント予約結果について"; 112 const imageurl = 'https://chart.apis.google.com/chart?chs=250x250&cht=qr&chl=' + id; 113 const response = UrlFetchApp.fetch(imageurl); // option削除 114 const blob = response.getBlob().getAs(MimeType.JPEG); 115 116if (result === "success" && preferredDate === "2024年5月5日(日) 11:00") { 117 //var emailFrom = ".com"; 118 // QRコード付きのメール 119 var mailBody = "この度はお申込みをいただきありがとうございます。下記の内容でご予約を承りました。\n 当日、このメールに添付されているQRコードを受付でご提示ください。 \n\n" 120 + `【予約日】:${preferredDate}\n` 121 + '【氏 名】:' + name + '様\n' 122 + '【来場者ID】:' + id + '\n' 123 + '【お申込み人数】:' + total + '名\n' 124 + "-------------------------------\n" 125 126 127 128 + "-------------------------------\n" 129 130 var option = { 131 method: "get", 132 "attachments": blob, 133 'name': イベント事務局' 134 } 135} 136//11時以外 137 else if(result === "success") { 138 // QRコード付きのメール 139 var mailBody = "この度はお申込みをいただきありがとうございます。下記の内容でご予約を承りました。\n 当日、このメールに添付されているQRコードを受付でご提示ください。 \n\n" 140 + `【予約日】:${preferredDate}\n` 141 + '【氏 名】:' + name + '様\n' 142 + '【来場者ID】:' + id + '\n' 143 + '【お申込み人数】:' + total + '名\n' 144 145 //+ "【イベント】\n" 146 + "-------------------------------\n" 147 148 149 + "-------------------------------\n" 150 151 var option = { 152 method: "get", 153 "attachments": blob, 154 'from': "com", 155 'name': 'イベント事務局' 156 } 157 158 } 159 else { 160 // QRコードなしのメール 161 var mailBody = "下記のご希望の日程は満席のため予約できませんでした。下記のフォームから再度申請してください。\n" 162 + `【予約日】:${preferredDate}は満席です。\n` 163 + '【氏 名】' + name + '\n' 164 + "-------------------------------\n" 165 + "【予約お申込み】\n" 166 + "https://forms.gle/~~~~~~~~~ \n" //このURLをHPのURLへ変更して 167 168 var option = { 169 'name': 'イベント事務局' 170 } 171} 172 //GmailApp.createDraft(mail, mailTitle, mailBody, option); 173 174**//ここ変更しました** 175 sendGridEmail( mail, mailTitle, mailBody, option); 176 //GmailApp.sendEmail( mail, mailTitle, mailBody, option); 177} 178 179function getRndStr() { 180 var str = "abcdefghijklmnopqrstuvwxyz0123456789"; 181 var len = 8; 182 var result = ""; 183 for (var i = 0; i < len; i++) { 184 result += str.charAt(Math.floor(Math.random() * str.length)); 185 } 186 return result; 187} 188 189 190function updateForm() { 191 console.log("ダミーのupdateForm()が呼ばれました。") 192} 193 194**---------ここからセンドグリッドAPI連携---------** 195**//ここ変更しました** 196**上記とは違う別のスクリプト内に書きました。** 197function sendGridEmail(mail, mailTitle, mailBody, option){ 198 199// SendGrid V3 Mail Send API を使って、メールを送信する --- 200// スクリプトプロパティは、「プロジェクトの設定」->「スクリプトプロパティの追加」を行なう 201var scriptProperties = PropertiesService.getScriptProperties(); 202var SEND_GRID_ENDPOINT = scriptProperties.getProperty('SEND_GRID_ENDPOINT'); 203var SEND_GRID_API_KEY = scriptProperties.getProperty('SEND_GRID_API_KEY'); 204 205 206// メール送信用スクリプト --------------------------------- 207 208 209 var body = { 210 personalizations: [ 211 { 212 to: [ 213 { 214 email: mail, 215 }, 216 ], 217 218 subject: mailTitle, 219 }, 220 ], 221 from: { 222 //email: emailFrom, 223 name: option, 224 }, 225 content: [ 226 { 227 // text/plain で指定しないと \n で改行されない 228 type: "text/plain", 229 value: mailBody, 230 }, 231 ], 232 }; 233 234 235 // メール送信に必要な記述 236 var payload = JSON.stringify(body); 237 UrlFetchApp.fetch(SEND_GRID_ENDPOINT, { 238 method: 'POST', 239 headers: { 240 'Content-Type': 'application/json', 241 'Authorization': ' Bearer ' + SEND_GRID_API_KEY, 242 }, 243 payload: payload, 244 }); 245} 246**//sendEmailBySendGrid( mail, mailTitle, mailBody, option);** 247 248 249 250

試したこと

・GmailApp ⇨ sendEmailBySendGridやsendEmailに変更してみた
・APIキーをスクリプト内に入れてみた

補足情報(FW/ツールのバージョンなど)

プロジェクトの設定から、APIキーやエンドポイントをスクリプトプロパティに入れています。

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

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

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

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

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

YAmaGNZ

2024/03/06 13:16

sendEmailという関数が複数定義されているように見えるのですが、提示されているコードは正しいのですか?
10-mo

2024/03/06 22:33

YAmaGNZさん コメントありがとうございます。 参考サイトから引用させていただいておりまして、これが正しいのか分かりません… GmailApp.を使わないのは分かっているのですが、そこからどうやってセンドグリッド経由で送信するのかに手を焼いています。
YAmaGNZ

2024/03/06 22:41

そういうことではなく提示されているコードの109行目に function sendEmail(mail, preferredDate, result, id, name, total) { // id,name,totalを受け取るように修正 というsendEmailの定義があり、193行目にも function sendEmail(){ と同じ名前の関数が定義されています。 なので提示されたコードで正しいのかを聞きました。 「手を加えながら」とも書かれているのでエラーメッセージも不明瞭ですし このコードで実行したらこういうエラーが出たとキッチリ書いたほうがいいかと思います。 でないと、「ここはこうじゃ?」→「いえそこはもうそうではなくこう直してます」みたいなやり取りが発生したりしてしまうかと思います。
YAmaGNZ

2024/03/06 22:43

また193行目から定義してあるsendEmailにはmail、mailTitleといった変数の定義が無いように見えます。
10-mo

2024/03/07 00:12

YAmaGNZさん ご指摘いただきありがとうございます。ご指摘通りでして、記載の仕方は良くありませんでした。申し訳ありません。ご指摘下さった点について変更を加えました。
guest

回答1

0

ベストアンサー

実際に実行したわけではありませんが
sendGridEmailの引数のoptionが正しくないように見えます。

from: { //email: emailFrom, name: option, },

この部分ですが、optionの中身は条件分岐で中身が変わりますが

var option = { method: "get", "attachments": blob, 'name': イベント事務局' }

このような形でsendGridEmailに渡しています。

しかし、SendGridのV3 Mail Send API概要を見るとfromの部分は

JSONパラメータ必須
fromオブジェクトYes
emailstringYes
namestringNo

と書いてあってemailは必須となっています。

なのでfromの部分は

from: { email: ’送信元のメールアドレス’, name: '送信元の名前' },

とemailは指定しないといけないはずですが現在のコードだと

from: { //email: emailFrom, name: { method: "get", "attachments": blob, 'name': イベント事務局' }, },

といった形になってしまっています。

なのでsendGridEmailの引数としてfromEmailAddressとfromNameといった感じで送信元アドレスと名前を受け付けるようにしてfrom部分に設定するのがいいのではないかと思います。

JAVAScript

1function sendGridEmail(mail, mailTitle, mailBody, fromEmailAddress, fromName){ 2 3// SendGrid V3 Mail Send API を使って、メールを送信する --- 4// スクリプトプロパティは、「プロジェクトの設定」->「スクリプトプロパティの追加」を行なう 5var scriptProperties = PropertiesService.getScriptProperties(); 6var SEND_GRID_ENDPOINT = scriptProperties.getProperty('SEND_GRID_ENDPOINT'); 7var SEND_GRID_API_KEY = scriptProperties.getProperty('SEND_GRID_API_KEY'); 8 9 10// メール送信用スクリプト --------------------------------- 11 12 13 var body = { 14 personalizations: [ 15 { 16 to: [ 17 { 18 email: mail, 19 }, 20 ], 21 22 subject: mailTitle, 23 }, 24 ], 25 from: { 26 email: fromEmailAddress, 27 name: fromName, 28 }, 29 content: [ 30 { 31 // text/plain で指定しないと \n で改行されない 32 type: "text/plain", 33 value: mailBody, 34 }, 35 ], 36 }; 37 38 39 // メール送信に必要な記述 40 var payload = JSON.stringify(body); 41 UrlFetchApp.fetch(SEND_GRID_ENDPOINT, { 42 method: 'POST', 43 headers: { 44 'Content-Type': 'application/json', 45 'Authorization': ' Bearer ' + SEND_GRID_API_KEY, 46 }, 47 payload: payload, 48 }); 49}

また、添付ファイルを付けるためにOption指定をしたかったのだと思いますが、そちらは
attachmentsとして追加しないといけないので

attachments: { content: 添付ファイルのコンテンツをBase64エンコードしたもの, type: 添付するコンテンツのMIMEタイプ。例えば、application/pdfやimage/jpegなど, filename: 添付ファイルのファイル名, }

といった感じの情報をbodyに追加しないといけないでしょう。


2024/3/12 追記

下記コードにて添付ファイルつきでメールの送信ができました。

JAVAScript

1function sendTest() { 2 sendGridEmail('送信先メールアドレス','メールタイトル','送信テスト\n改行テスト','送信元メールアドレス','テスト送信者') 3} 4 5function sendGridEmail(mail, mailTitle, mailBody, fromEmailAddress, fromName){ 6 7// SendGrid V3 Mail Send API を使って、メールを送信する --- 8// スクリプトプロパティは、「プロジェクトの設定」->「スクリプトプロパティの追加」を行なう 9var SEND_GRID_ENDPOINT = 'https://api.sendgrid.com/v3/mail/send'; 10var SEND_GRID_API_KEY = 'API KEY'; 11 12 13// メール送信用スクリプト --------------------------------- 14 var img = encodeImage(); 15 16 var body = { 17 personalizations: [ 18 { 19 to: [ 20 { 21 email: mail, 22 }, 23 ], 24 25 subject: mailTitle, 26 }, 27 ], 28 from: { 29 email: fromEmailAddress, 30 name: fromName, 31 }, 32 content: [ 33 { 34 // text/plain で指定しないと \n で改行されない 35 type: "text/plain", 36 value: mailBody, 37 }, 38 ], 39 attachments: [{ 40 content: img, 41 type: 'image/jpeg', 42 filename: '添付ファイルのファイル名', 43 }] 44 }; 45 46 47 // メール送信に必要な記述 48 var payload = JSON.stringify(body); 49 UrlFetchApp.fetch(SEND_GRID_ENDPOINT, { 50 method: 'POST', 51 headers: { 52 'Content-Type': 'application/json', 53 'Authorization': ' Bearer ' + SEND_GRID_API_KEY, 54 }, 55 payload: payload, 56 }); 57} 58 59function encodeImage(){ 60 //Googleドライブにある画像ファイルを読み込んでBlobオブジェクトで取得 61 const image = DriveApp.getFileById("ファイルID").getBlob(); 62 //BlobオブジェクトからByteを取得してBase64にエンコード 63 const baseImage = Utilities.base64Encode(image.getBytes()); 64 //Base64エンコードした結果を戻り値とする 65 return baseImage; 66}

attachmentsについて回答に書きましたが、こちらに間違いがあり添付ファイルの情報を配列で設定しないといけません。

attachments: [{ content: img, type: 'image/jpeg', filename: '添付ファイルのファイル名', }]

投稿2024/03/07 10:57

編集2024/03/12 10:44
YAmaGNZ

総合スコア10258

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

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

10-mo

2024/03/08 00:49

ご回答下さりありがとうございます! 25行目の from: { email: fromEmailAddress,⇦自分のアドレス(センドグリッド認証した時の) name: fromName,⇦名前 }, を入力しました。 1行目の function sendGridEmail(mail, mailTitle, mailBody, fromEmailAddress, fromName){ のfromEmailAddress,fromNameがグレー表示になります。 そこにも、25行目に入力したアドレスと名前を入れてみたのですが、保存できません。 ここの部分を教えていただけますでしょうか?
YAmaGNZ

2024/03/08 10:28

保存できないとはエラーが出るのですよね? そのエラーを見てコードを修正してみてください。 一応私の提示したコードだとエディタで保存できました。
10-mo

2024/03/09 23:31

ご返信遅くなりました。。。 下記のように修正し、スクリプト自体は保存できました。しかし、実行するとエラーになります。attachmentに問題があると思うのですが、下記に問題がありますでしょうか? エラーコード: Exception: Request failed for https://api.sendgrid.com returned code 400. Truncated server response: {"errors":[{"message":"Invalid type. Expected: array, given: object.","field":"attachments","help":"http://sendgrid.com/docs/API_Reference/Web_API_... (use muteHttpExceptions option to examine full response) at sendGridEmail(コード:295:15) at sendEmail(コード:228:3) at form(コード:70:3) 修正 //--------------センドグリッド--------------------------------------------------------- function sendGridEmail(mail, mailTitle, mailBody, fromEmailAddress, fromName ){ // SendGrid V3 Mail Send API を使って、メールを送信する --- // スクリプトプロパティは、「プロジェクトの設定」->「スクリプトプロパティの追加」を行なう var scriptProperties = PropertiesService.getScriptProperties(); var SEND_GRID_ENDPOINT = scriptProperties.getProperty('SEND_GRID_ENDPOINT'); var SEND_GRID_API_KEY = scriptProperties.getProperty('SEND_GRID_API_KEY'); // メール送信用スクリプト --------------------------------- var body = { personalizations: [ { to: [ { email: mail, }, ], subject: mailTitle, }, ], from: { email: fromEmailAddress, name: fromName, }, content: [ { // text/plain で指定しないと \n で改行されない type: "text/plain", value: mailBody, }, ], attachments: { //content: 添付ファイルのコンテンツをBase64エンコードしたもの, types: 'image/jpeg'   //添付するコンテンツのMIMEタイプ。例えば、application/pdfやMimeType.JPEGなど, //filename: 添付ファイルのファイル名, } }; // メール送信に必要な記述 var payload = JSON.stringify(body); UrlFetchApp.fetch(SEND_GRID_ENDPOINT, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': ' Bearer ' + SEND_GRID_API_KEY, }, payload: payload, }); }
YAmaGNZ

2024/03/10 01:58

私が提示したAPI概要のページを見ていただければわかるのですが attachmentsの項目にはcontentとfilenameは必須項目となっています。 しかし提示されているコードではその2つがコメントアウトされています。 Base64にエンコードする方法は「GAS BLOB BASE64」といった感じで検索すればいろいろと解説ページが見つかるかと思います。
YAmaGNZ

2024/03/10 02:17

また基本的な部分が機能するかテストするために添付ファイルはつけずにメール送信してみてはどうでしょうか。
10-mo

2024/03/10 06:35

ご教示くださりありがとうございます。 必須項目を見落としていました...... しかし、一向に解決できる感じがせず、エラー続きです。新たにエンコードするスクリプトが必要になったため、更に複雑になり解決できそうにありません。 ここまでご教示いただきありがとうございました。このスクリプトを参考に解決に向けてやっていきます。
YAmaGNZ

2024/03/12 10:36

実際に添付ファイル付きで送信できたコードを追記しておきます。
10-mo

2024/03/13 02:20

うわぁ、ありがとうございます!! 一気に解決できる兆しが出てきました! 一点お伺いしたいのですが、 上記の私が最初に記載したコードの34~38行目で、QRコードをスプレッドシートで作成し、それをスプレッドシート内のセルに入れていてファイルに入れられていません。来場者シート(sht)のC列に人名があるので、それをファイル名にしたいのですが、この場合、どこにどう書いたら良いのしょうか? 試しに書いてみたのですが、 for (var i = 1; i < lastrow; i++){ response = UrlFetchApp.fetch("http://chart.apis.google.com/chart?cht=qr&chs=150x150&chl=" + data[i][7]); // H列にQRがある image = response.getBlob().setName(data[i][2] + ".jpeg"); // C列が人名なので、これをファイル名 SpreadsheetApp.createFile(image); }
YAmaGNZ

2024/03/13 10:21

// イメージを取得 const image = response.getBlob(); //BlobオブジェクトからByteを取得してBase64にエンコード // これで得られたものをattachmentsの部分へセット const baseImage = Utilities.base64Encode(image.getBytes()); といった感じになるのではないかと思います。 もしメールに添付する画像が複数なのだとしたら attachments: [ { content: img1, type: 'image/jpeg', filename: 'ファイル名1', }, { content: img2, type: 'image/jpeg', filename: 'ファイル名2', }, { content: img3, type: 'image/jpeg', filename: 'ファイル名3', }, ] という感じにすればいいでしょう
10-mo

2024/03/14 02:06

複数添付できるコードまでいただきありがとうございます。 // イメージを取得 const image = response.getBlob(); //BlobオブジェクトからByteを取得してBase64にエンコード // これで得られたものをattachmentsの部分へセット const baseImage = Utilities.base64Encode(image.getBytes()); 上のコードですと、ファイル名が取得できないように思うのです。教えていただいた下記の必須コードでは、ファイル名の記載が絶対だったと思うのですが、QRコードなので全て違うデータが入ったものになります。全て同じだと、ファイル名指定できるのですが、スプレ上で作成していてドライブ保存していません。 attachments: [{ content: img, type: 'image/jpeg', filename: '添付ファイルのファイル名', // これが毎回違う }]
10-mo

2024/03/14 02:07

// イメージを取得 const image = response.getBlob(); //BlobオブジェクトからByteを取得してBase64にエンコード // これで得られたものをattachmentsの部分へセット const baseImage = Utilities.base64Encode(image.getBytes()); を実行したところエラーになりました。 ReferenceError: response is not defined at encodeImage(無題 2:259:17) at sendGridEmail(無題 2:212:13) at sendEmail(無題 2:177:3) at form(無題 2:69:3)
10-mo

2024/03/15 04:45

挿入する場所が違うのでしょうか? attachments: [{ content: img, type: 'image/jpeg', filename: '添付ファイルのファイル名', }] でファイル名を指定しないダメだと思うのですが、これが一定ではなく常に変わります。
YAmaGNZ

2024/03/15 07:14

だからそこをスプレッドシートから読み込んだ名前にしましょうということです。
10-mo

2024/03/15 23:55

すみません、理解しました。 頭の中がこんがらがっていて、見えていませんでした。。。。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問