🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google Apps Script

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

Q&A

解決済

2回答

4414閲覧

GAS で宛先ごとに別々のPDFを添付して一括メール送信

Non.Nana.Mina

総合スコア1

Google Apps Script

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

0グッド

0クリップ

投稿2020/12/18 10:28

編集2020/12/18 10:30

前提・実現したいこと

スプレッドシートを使ってGmailで60件ほど一括送信をしようと思っています。 宛先もGmailです。 宛先別にそれぞれのPDFがGoogleドライブの中にあります ・ファイルIDではなくファイル名から添付ファイルを参照させたい。 ・メールリスト全てを1通づつ送信したい ・リストに添付ファイルがない場合はメールを送らない 上記の条件で一括メール送信を行うには下記のGASコードをどう修正すれば良いでしょうか?

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

実行すると中断するまでメールリストの1行目を永遠と送り続けてしまいます。

該当のソースコード

function send_invoice() { var spreadsheet = SpreadsheetApp.openById('{speadsheet_id_here}'); //SpreadsheetのID var sheet = spreadsheet.getSheetByName('send'); //シート名 var lastRow = sheet.getLastRow(); for(var i = 2; i <= lastRow; i ) { //getRangeの第1引数は行(1,2,3..)、第2引数はカラム(A,B,C...の順番を数値にしたもの) var filename = sheet.getRange(i,1).getValue() var report = DriveApp.getFilesByName(filename).next(); var to = sheet.getRange(i,2).getValue(); var name = sheet.getRange(i,3).getValue(); var flag = sheet.getRange(i,4).getValue(); if (flag != "NO"){ var title = "メール件名"; var content = name "様\n" "いつも大変お世話になっております。\n" "添付にて今月のインボイスをお送りいたします。\n\n" "どうぞよろしくお願いいたします。" ; GmailApp.sendEmail( to, title, content, {attachments: [report], //fromをGmail以外にする際は紐付けが必要。下記で説明。 from: 'email@example.com', cc: 'email@example.com', replyTo: 'email@example.com', name: 'My name here' } ); if (to == "") { break; } } } }

試したこと

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

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

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

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

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

guest

回答2

0

ベストアンサー

for(var i = 2; i <= lastRow; i ) {

iが増えません

投稿2020/12/18 10:53

y_waiwai

総合スコア88038

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

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

papinianus

2020/12/18 15:02

これとても正しい指摘なんですが、このコード、元サイトからそのまま持ってきているのですよね… ブログの作者にこの回答を見て欲しいです。
guest

0

・メールリスト全てを1通づつ送信したい
・リストに添付ファイルがない場合はメールを送らない

↑これファイル名がなかったら送らない、で解釈してます。ファイル名があるのに、G Drive にファイルがないパターンは検知してないので、その場合その行でエラーで止まります。

上記の条件で一括メール送信を行うには下記のGASコードをどう修正すれば良いでしょうか?

手っ取り早いのは 1 から書くことじゃないですかね。リストを 1 つずつという書き方をすれば、永遠に 1 行目を送ることはないですから。

javascript

1const q311092 = () => { 2 const bookId = "{spreadsheet_id_here}"; 3 const sheetName = "send"; 4 const subject = "メール件名"; 5 const list = SpreadsheetApp.openById(bookId).getSheetByname(sheetName).getDataRange().getValues().slice(1); 6 list.filter(e=> e[0] !== "" && e[1] !== "" && e[3] !== "NO").forEach(r=>{ 7 const [fileName, to, name,] = r; 8 const file = DriveApp.getFilesByName(fileName).next().getBlob(); 9 const body = `${name}10いつも大変お世話になっております。 11添付にて今月のインボイスをお送りいたします。 12 13どうぞよろしくお願いいたします。`; 14 GmailApp.sendEmail(to, subject,body, {attachments: [file], from: 'email@example.com', cc: 'email@example.com', replyTo: 'email@example.com', name: 'My name here'}); 15 }); 16}

補足ですが、どこの何を引用したか書かないと flag という D 列の NO を判定しているというのが、意図したものなのか、引用元のコードのままなのかが分からないです。
別に分からなくても私は全く困らないのですが、そういうことでは求めた回答が得られないです。

投稿2020/12/18 15:01

papinianus

総合スコア12705

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

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

papinianus

2020/12/18 15:03

https://dev.classmethod.jp/articles/gas-email-with-files/ これですよね。ちょっと探した程度で見つかるようなものを隠蔽してどういう嬉しさがあるのか教えて欲しいです。 これ元のコードのまま何も触られてないように見えるんですけど、ホントにここから求めた姿に自力で直せるんですかね。 丸投げにすらなってないと思えてならないです。
Non.Nana.Mina

2020/12/19 10:16

特に自分で組んだように隠蔽とかでもなく、これで喜びを得たかったわけではないですが 引用元を記載していなくて申し訳ないです。 今後気をつけます。 ありがとございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問