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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

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

Q&A

解決済

1回答

7597閲覧

GASでの一斉送信メール(添付付き)について

mariko163

総合スコア11

Google Apps Script

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

0グッド

1クリップ

投稿2018/01/10 09:09

###前提・実現したいこと
GASでファイルを添付し、メーリングリストで一斉送信するシステムを作成したいのですが、
1.メーリングリストとしてのスプレッドシートからの社名・宛名・メールアドレス・本文等の差し込み
2.指定ファイルをPDF化して特定のメールアドレスに送付すること
動作はするのですが、差し込み元のスプレッドシート最終行の相手にしかメールが届かない状況です。
なぜなのかわからず困っております。お力をお貸しいただけませんでしょうか。

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

エラーメッセージはありません。

###該当のソースコード
function myFunction() {

/* スプレッドシートのシートを取得と準備 */
var spreadsheet=SpreadsheetApp.getActiveSheet(); //シートを取得
var rowSheet=spreadsheet.getDataRange().getLastRow(); //シートの使用範囲のうち最終行を取得

/* ドキュメントを取得する */
var docTest=DocumentApp.openById("ドキュメントID"); //ドキュメントをIDで取得
var strDoc=docTest.getBody().getText(); //ドキュメントの内容を取得

/////////////////////////////////////////////
// IDで指定したスプレッドシートをPDF化したい場合//
////////////////////////////////////////////
// PDF化したいスプレッドシートのID
var ssid = "スプレッドシートのID";// スプレッドシートのID

// シートID(gid)を指定
var sheetid = "シートID";

// 指定したスプレッドシートを開く
var ss = SpreadsheetApp.openById(ssid);

//スプレッドシート上のシートをPDFへ変換 var pdf = ss.getAs('application/pdf');

 var pdfname = "テスト.pdf";

//PDFをドライブへ作成(保存されます) DriveApp.createFile(pdf).setName(pdfname); /* メール表題、fromアドレス、差出人名を準備 */

var strSubject="テストタイトル"; //表題
var strFrom="メールアドレス"; //From
var strSender="名前"; //差出人

/* シートの全ての行について社名、姓名を差し込みログに表示*/
for(var i=2;i<=rowSheet;i++){

var strCompany=spreadsheet.getRange(i,1).getValue(); //社名 var strSecond=spreadsheet.getRange(i,2).getValue(); //姓 var strFirst=spreadsheet.getRange(i,3).getValue(); //名 var strTo=spreadsheet.getRange(i,4).getValue(); //toアドレス var strBody=strDoc.replace(/{社名}/,strCompany).replace(/{姓}/,strSecond).replace(/{名}/,strFirst); //社名、姓名を置換 Logger.log(strBody); //ドキュメントの内容をログに表示

}

GmailApp.sendEmail(
strTo,
strSubject,
strBody,
{attachments:pdf}
);
}
###試したこと
データレンジを変更してみたりなどしたのですが、うまくいきませんでした。

###補足情報(言語/FW/ツール等のバージョンなど)
こちらのコードを書くために参照したURL
リンク内容
リンク内容
リンク内容

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

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

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

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

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

guest

回答1

0

ベストアンサー

メール1件ごとに送信先アドレスを変更したいことを前提としますと、

forループの{}中にメール送信部を入れ込んでください。
Logger.log(strBody); //ドキュメントの内容をログに表示
}  ←このカッコを
GmailApp

{attachments:pdf}
);
} ←ここに移すだけ

スクリプト実行制限の5分とかからない送信件数ならこれだけで実行できると思います。

pdf作成が追い付かなくて途中で止まってしまうケースもありえますので、
送信済フラグかタイムスタンプをスプレッドシート側に1件ごとに書き込んでおいた方が
よいかもしれません。

これらで困ったらまた質問してください

for(var i=2;i<=rowSheet;i++){ var strCompany=spreadsheet.getRange(i,1).getValue(); //社名 var strSecond=spreadsheet.getRange(i,2).getValue(); //姓 var strFirst=spreadsheet.getRange(i,3).getValue(); //名 var strTo=spreadsheet.getRange(i,4).getValue(); //toアドレス var strBody=strDoc.replace(/{社名}/,strCompany).replace(/{姓}/,strSecond).replace(/{名}/,strFirst); //社名、姓名を置換 Logger.log(strBody); //ドキュメントの内容をログに表示 GmailApp.sendEmail( strTo, strSubject, strBody, {attachments:pdf} ); }

投稿2018/01/10 09:40

編集2018/01/10 09:53
jinshan

総合スコア107

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

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

mariko163

2018/01/10 09:50

ありがとうございます。 ご回答いただきました内容なのですが、下記のようにすればよいということでしょうか。 理解不足で申し訳ありません。 for(var i=2;i<=rowSheet;i++){ var strCompany=spreadsheet.getRange(i,1).getValue(); //社名 var strSecond=spreadsheet.getRange(i,2).getValue(); //姓 var strFirst=spreadsheet.getRange(i,3).getValue(); //名 var strTo=spreadsheet.getRange(i,4).getValue(); //toアドレス var strBody=strDoc.replace(/{社名}/,strCompany).replace(/{姓}/,strSecond).replace(/{名}/,strFirst).replace(/{Toアドレス}/,strTo).replace(/{Toアドレス}/,strTo); //社名、姓名を置換 Logger.log(strBody); //ドキュメントの内容をログに表示 } >>pdf作成が追い付かなくて途中で止まってしまうケースもありえますので、送信済フラグかタイムスタンプをスプレッドシート側に1件ごとに書き込んでおいた方が良いかもしれません。 アドバイスもありがとうございます。こちらは調べてまた試してみます。 よろしくお願いいたします。
jinshan

2018/01/10 10:15 編集

前述の説明に追記しましたので、確認してください。”}"の場所を移しただけですが念のため修正コード全部版も載せておきます。 function myFunction() { /* スプレッドシートのシートを取得と準備 */ var spreadsheet=SpreadsheetApp.getActiveSheet(); //シートを取得 var rowSheet=spreadsheet.getDataRange().getLastRow(); //シートの使用範囲のうち最終行を取得 /* ドキュメントを取得する */ var docTest=DocumentApp.openById("ドキュメントID"); //ドキュメントをIDで取得 var strDoc=docTest.getBody().getText(); //ドキュメントの内容を取得 ///////////////////////////////////////////// // IDで指定したスプレッドシートをPDF化したい場合// //////////////////////////////////////////// // PDF化したいスプレッドシートのID var ssid = "スプレッドシートのID";// スプレッドシートのID // シートID(gid)を指定 var sheetid = "シートID"; // 指定したスプレッドシートを開く var ss = SpreadsheetApp.openById(ssid); //スプレッドシート上のシートをPDFへ変換 var pdf = ss.getAs('application/pdf'); var pdfname = "テスト.pdf"; //PDFをドライブへ作成(保存されます) DriveApp.createFile(pdf).setName(pdfname); /* メール表題、fromアドレス、差出人名を準備 */ var strSubject="テストタイトル"; //表題 var strFrom="メールアドレス"; //From var strSender="名前"; //差出人 /* シートの全ての行について社名、姓名を差し込みログに表示*/ for(var i=2;i<=rowSheet;i++){ var strCompany=spreadsheet.getRange(i,1).getValue(); //社名 var strSecond=spreadsheet.getRange(i,2).getValue(); //姓 var strFirst=spreadsheet.getRange(i,3).getValue(); //名 var strTo=spreadsheet.getRange(i,4).getValue(); //toアドレス var strBody=strDoc.replace(/{社名}/,strCompany).replace(/{姓}/,strSecond).replace(/{名}/,strFirst); //社名、姓名を置換 Logger.log(strBody); //ドキュメントの内容をログに表示 GmailApp.sendEmail( strTo, strSubject, strBody, {attachments:pdf} ); } }
mariko163

2018/01/10 10:25

すみません、単純に慌てており見落としていました。ご指示のように、試してみます。 今日は試せないため、また改めます。 よろしくお願いします。
mariko163

2018/01/11 00:26

無事動きました。ありがとうございます。 また、この後ご指導いただきました件を試してみます。 またお世話になるかもしれませんが、その際は何卒宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問