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

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

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

Sendmailは、インターネットで電子メールを送受信するサーバソフトウェア(MTA)です。ユーザーが送信したメールを受け、他メールサーバへ引き渡しバケツリレー式に配送したり、届いたメールをユーザーが受け取るまでの間保管するといった働きをします。

Google スプレッドシート

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

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Google Apps Script

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

Q&A

解決済

1回答

1407閲覧

GASで添付ファイル付きのメール送付

csua

総合スコア1

Sendmail

Sendmailは、インターネットで電子メールを送受信するサーバソフトウェア(MTA)です。ユーザーが送信したメールを受け、他メールサーバへ引き渡しバケツリレー式に配送したり、届いたメールをユーザーが受け取るまでの間保管するといった働きをします。

Google スプレッドシート

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

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Google Apps Script

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

0グッド

1クリップ

投稿2021/10/15 04:22

###前提・実現したいこと

GASを使って、添付ファイル・インライン画像付きのメールを
スプレッドシートのリストから自動送付したいと思っています。
リストには試しに2行別の宛先で記載しており、
1行目に書いてある宛先には添付ファイルなど全て問題なく送れるのですが
2行目が送れない状況です。

コードのご確認とご指摘をお願いいたします。

エラーメッセージは下記のものが表記されています。

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

Exception: 次のオブジェクトを取得できません。イテレータが末尾に到達しました。

該当のソースコード

function sendMail(){

const mySheet = SpreadsheetApp.getActiveSheet();
const lastRow = mySheet.getLastRow();
const DOC_URL = '×××××××××××××';
const doc = DocumentApp.openByUrl(DOC_URL);
const docText = doc.getBody().getText();

const tempu = DriveApp.getFilesByName('××××××.png');
const tempu2 = DriveApp.getFilesByName('××××××.png');
const image = DriveApp.getFilesByName('××××××.png').next().getBlob();

// スプレッドシートの情報を取得
for(let i = 2; i <= lastRow; i++){

// A列(No)が未入力の行までいったら終了する
if (mySheet.getRange(i,1).getValue() == ""){
Browser.msgBox(i + "行目まで実行しました。終了します。");
return;
}

var sent = mySheet.getRange(i,6).getValue(); if (sent == "送信済み") { // 送信済みの行はスキップ Browser.msgBox(i + "行目:送信済みのためスキップします"); } else { // チェックボックスの判定 var status = mySheet.getRange(i, 7).getValue(); // チェックボックスにチェックが入っている場合 if(status == true){ // 入力内容を取得 const subject = "×××××××××" //件名 const address = mySheet.getRange(i, 2).getValue(); //宛先 const Name = mySheet.getRange(i, 3).getValue(); //氏名 const recipient = mySheet.getRange(i, 4).getValue(); //送信先メールアドレス const cc = mySheet.getRange(i, 5).getValue(); //cc // ドキュメントのテキストを置き換える const body = docText

   .replace('{宛先}',address)
.replace('{氏名}',Name)

// メールを送信する

  MailApp.sendEmail({
to: recipient,
subject: subject,
body: body,
htmlBody: body,
inlineImages:{imageFileName:image},
cc: cc,
name: "×××××××××",
attachments : [tempu.next(),tempu2.next()],
});

  // メールの送信を記録
var range = mySheet.getRange(i,6).setValue("送信済み");

} else {
// チェックが入っていない場合スキップする
var range = mySheet.getRange(i,6).setValue("送信スキップ");
}
}
}
}

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

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

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

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

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

guest

回答1

0

ベストアンサー

Exception: 次のオブジェクトを取得できません。イテレータが末尾に到達しました。

メールを送るときに、next() しているせいで出るエラー。
image と同じく、最初に next().getBlob() すれば回避できる。

javascript

1const q364511 = () => { 2 const sheet = SpreadsheetApp.getActiveSheet(); 3 const list = sheet.getDataRange().getValues(); 4 const documentURL = '×××××××××××××'; 5 const templateText = DocumentApp.openByUrl(documentURL).getBody().getText(); 6 const subject = "×××××××××" //件名 7 const attachment1 = DriveApp.getFilesByName('x1.png').next().getBlob(); 8 const attachment2 = DriveApp.getFilesByName('x2.png').next().getBlob(); 9 const image = DriveApp.getFilesByName('x3.png').next().getBlob(); 10 const sent = "送信済み"; 11 for(let i = 1; i < list.length; i++) { 12 const [no,address,name,recipient,cc,isSent,toSend] = list[i]; 13 if(no === "") { 14 notify(`${i}行目まで実行しました。終了します。`); // 1 つ手前の行番号を言わないと奇妙に見える。例えば A10 が空白で止まったとき、"実行した"のは A9 なので、9 行目まで実行した、と報告してほしいのでは。 15 break; 16 } 17 if(isSent === sent) { 18 notify(`${i+1}行目:送信済みのためスキップします`); 19 continue; 20 } 21 if(toSend !== true) { 22 list[i][5] = "送信スキップ"; 23 continue; 24 } 25 const body = templateText.replace('{宛先}',address).replace('{氏名}',name); 26 MailApp.sendEmail({ 27 to: recipient, 28 subject: subject, 29 body: body, 30 htmlBody: body, 31 inlineImages:{imageFileName:image}, 32 cc: cc, 33 name: "×××××××××", 34 attachments : [attachment1,attachment2], 35 }); 36 list[i][5] = sent; 37 } 38 sheet.getRange(1,1,list.length,list[0].length).setValues(list); 39} 40function notify(message) { 41// Browser.msgBox(message); // 送信済みをいちいち msgBox してたらしんどいのでやめたほうがいい。 42 console.log(message);// スクリプト画面でテストするならこれで十分 43 // SpreadsheetApp.getActive().toast(message,"スクリプトから通知",2); //ボタンとかメニューをシート側に作るなら、こうすれば 2 秒で勝手に消える。 44}

投稿2021/10/15 15:41

papinianus

総合スコア12705

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

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

csua

2021/10/18 16:24

ご回答ありがとうございます! 実行できました。 質問内容以外にも、アドバイスいただき感謝ですm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問