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

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

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

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

Q&A

解決済

3回答

9620閲覧

GASで複数の企業に複数の異なるファイルを添付して一斉メール送信する際、空白のセルが存在すると実行できない

seijisam

総合スコア7

Google Apps Script

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

0グッド

0クリップ

投稿2018/03/27 01:53

編集2018/03/29 00:18
GoogleスプレッドシートとGASを用いて、複数の企業にそれぞれの企業別に異なる複数のファイルを添付して、メールを一斉送信したい。 ただし、企業によって添付するファイルの数が異なり、添付ファイルが1つだけのところもあれば、2つ、あるいは3つの企業もあります。 ![イメージ説明](ccbdc8dc28a04611568ba01b7801d891.gif) ### 発生している問題・エラーメッセージ 添付のように添付ファイル名を呼び出すセルが空白だと、そこでスクリプトの実行が止まってしまいます。 空白はそのままスキップし(添付なし)で、次の行に移動して欲しいのですが。 ### 該当のソースコード //------------- Google Driveから添付ファイルを取得 ----------------------- // 添付ファイル用の配列を作成 var attachmentFiles = new Array(); // 添付ファイル1~3を取得 var folder = DriveApp.getFolderById('-----------------------'); //(添付1ファイル)のフォルダIDで取得 var file1 = folder.getFilesByName(mySheet.getRange(i,3).getValue()).next(); //(添付1ファイル)のファイル名を取得 var folder = DriveApp.getFolderById(''-----------------------'); //(添付2ファイル)のフォルダIDで取得 var file2 = folder.getFilesByName(mySheet.getRange(i,4).getValue()).next(); //(添付2ファイル)のファイル名を取得  var folder = DriveApp.getFolderById(''-----------------------'); //(添付3ファイル)のフォルダIDで取得 var file3 = folder.getFilesByName(mySheet.getRange(i,5).getValue()).next(); //(添付3ファイル)のファイル名を取得 ### 試したこと 素人で全く分からないのですが、指定されたセルにデータが存在しない(空白)のときは、戻り値はブランクで処理終了(次の行に移動)といった処理が出来ないものかと思うのですが、そういったことは可能でしょうか? 宜しくご教授願います。 ### 補足情報(FW/ツールのバージョンなど) ```function sendMailWithAttachments(){ /* スプレッドシートのシートを取得と準備 */ var mySheet=SpreadsheetApp.getActiveSheet(); //シートを取得 /* ドキュメント「メール本文」を取得する */ var docTest=DocumentApp.openById("-----------------------"); //メール本文のドキュメントをIDで取得 var strDoc=docTest.getBody().getText(); //ドキュメントの内容を取得 /* メール表題、fromアドレス、差出人名を準備 */ var strSubject="複数添付ファイルの送付"; //表題 var strFrom="-----------------------"; //From var strSender="-----------------------"; //差出人 // 添付ファイル用の配列を作成 var attachmentFiles =[]; var arr = mySheet.getRange(2, 2, 4, 4).getValues();// //処理負荷軽減のためまとめてフォルダー情報を取得 var folders = [ DriveApp.getFolderById('-----------------------'), //(添付1ファイル)のフォルダIDで取得 DriveApp.getFolderById('-----------------------'), //(添付2ファイル)のフォルダIDで取得 DriveApp.getFolderById('-----------------------') //(添付3ファイル)のフォルダIDで取得 ]; for(var i = 0, i= arr.length; i <1; i++){ var strTo=arr[i][0].getValue().next(); //送付先メールアドレスを取得 //添付ファイル1~3を取得(空白ならスキップ) if(arr[i][1] != ''){ attachmentFiles.push(folders[0].getFilesByName(arr[i][1]).next()); } if(arr[i][2] != ''){ attachmentFiles.push(folders[1].getFilesByName(arr[i][2]).next()); } if(arr[i][3] != ''){ attachmentFiles.push(folders[2].getFilesByName(arr[i][3]).next()); } } var strBody=strDoc /* メールを送信 */ GmailApp.sendEmail( strTo, //toアドレス strSubject, //表題 strBody, //本文 { from: strFrom, //fromアドレス name: strSender, //差出人 attachments: [] } ); } コード

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/03/27 06:15

初心者マークは付けておきましょうね。
guest

回答3

0

ベストアンサー

改めて回答させていただきますね。
コード中に補足も入れています。

javascript

1function sendMailWithAttachments(){ 2 3 /*省略*/ 4 5 var arr = mySheet.getRange(2, 2, 4, 4).getValues();// 6 /* 7 arr が二次元配列として以下のように取得されていることがイメージできていますか? 8 [['送信先アドレス','添付1ファイル名','添付2ファイル名','添付3ファイル名'],...[]] 9 */ 10 11 /*省略*/ 12 13 for(var i = 0, l = arr.length; i < l; i++){//←修正しました。 14 15 //var strTo=arr[i][0].getValue().next(); //送付先メールアドレスを取得 16 var strTo=arr[i][0]; 17 18 //添付ファイル1~3を取得(空白ならスキップ) 19 20 if(arr[i][1] != ''){ 21 attachmentFiles.push(folders[0].getFilesByName(arr[i][1]).next()); 22 } 23 if(arr[i][2] != ''){ 24 attachmentFiles.push(folders[1].getFilesByName(arr[i][2]).next()); 25 } 26 if(arr[i][3] != ''){ 27 attachmentFiles.push(folders[2].getFilesByName(arr[i][3]).next()); 28 } 29 //} 30 31 //var strBody=strDoc //←必要ですか? 32 33 /* メールを送信 */ 34 GmailApp.sendEmail( 35 strTo, //toアドレス 36 strSubject, //表題 37 //strBody, //本文 38 strDoc, 39 { 40 from: strFrom, //fromアドレス 41 name: strSender, //差出人 42 //attachments: [] //←空配列を添付? 43 attachments:attachmentFiles 44 } 45 ); 46 47 attachmentFiles = []; //初期化 48 } 49/* 50forループでの処理が間違っています。 51最初に示したロジック通りになっていません。 52「企業ごとに」空値チェック、添付ファイル取得、メール送信までを行います。 53*/ 54 55 }

[補足]
お約束ではございますが、動作確認等はしておりませんので、参考までに。

投稿2018/03/29 01:43

編集2018/03/30 02:21
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

seijisam

2018/03/30 01:43

stshisho様 いろいろ詳細までご教授頂き有難うございます。 昨日ご提示いただいたスクリプトをデッドコピーし実行しましたが、 "GmailApp.sendEmail(" の行で 無効なメール: undefined(行 49、ファイル「コード」)というエラーが出てしまいます。 もう少し頑張ってみます。 有難うございます。
退会済みユーザー

退会済みユーザー

2018/03/30 02:18

失礼しました。コード中、for分の条件式部分にミスがございました。 修正しておきます。
seijisam

2018/04/03 00:17

stshisho様 いろいろとご教授頂き有難うございます。 お教え頂いた for分の条件式部分の修正も反映しプログラムを実行していますが、 /* メールを送信 */   GmailApp.sendEmail( strTo, //toアドレス のところで『メールを送信できませんでした: 受信者が指定されていません(行 49、ファイル「コード」)』というメッセージが表示され、ストップしてしまいます。 試しに、 var strTo=arr[i][0]; //送付先メールアドレスを取得 の部分で、[i]の”i"を手で0"に変えて実行すると、1行目のメールアドレスを取得してメールは送信できました。 ただし、その時 指定フォルダからの指定ファイルの取得・添付は出来ていません。 (添付ファイル取得部分の構文の[i]を[0]に変えて動かしても添付ファイルは取得出来ませんでした) お時間がある時に、ご教授頂ければ幸いです。 宜しくお願い致します。
退会済みユーザー

退会済みユーザー

2018/04/03 00:43 編集

for分の括り、間違っていませんか? attachmentFiles = []; //初期化 までがループ処理になります。 あと、要所要所でLogger.log()にて値がちゃんと取得できているか確認してみてください。 (具体的にはstrTo、arr[i][1]、arr[i][2]、arr[i][3])
seijisam

2018/04/04 00:21

stshisho様 for分の括りを見直し修正したところ、正確に動かすことが出来ました!! 本当に有難うございました!!
退会済みユーザー

退会済みユーザー

2018/04/04 00:55

何よりです。
guest

0

function sendMailWithAttachments(){ /* スプレッドシートのシートを取得と準備 */ var mySheet=SpreadsheetApp.getActiveSheet(); //シートを取得 /* ドキュメント「メール本文」を取得する */ var docTest=DocumentApp.openById("------------------------------"); //メール本文のドキュメントをIDで取得 var strDoc=docTest.getBody().getText(); //ドキュメントの内容を取得 /* メール表題、fromアドレス、差出人名を準備 */ var strSubject="複数添付ファイルの送付"; //表題 var strFrom="------------------------------"; //From var strSender="------------------------------"; //差出人 // 添付ファイル用の配列を作成 var attachmentFiles =[]; var arr = mySheet.getRange(2, 2, 4, 4).getValues();// //処理負荷軽減のためまとめてフォルダー情報を取得 var folders = [ DriveApp.getFolderById('------------------------------'), //(添付1ファイル)のフォルダIDで取得 DriveApp.getFolderById('------------------------------'), //(添付2ファイル)のフォルダIDで取得 DriveApp.getFolderById('------------------------------') //(添付3ファイル)のフォルダIDで取得 ]; for(var i = 0, i= arr.length; i <1; i++){ var strTo=arr[i][0].getValue().next(); //送付先メールアドレスを取得 //添付ファイル1~3を取得(空白ならスキップ) if(arr[i][1] != ''){ attachmentFiles.push(folders[0].getFilesByName(arr[i][1]).next()); } if(arr[i][2] != ''){ attachmentFiles.push(folders[1].getFilesByName(arr[i][2]).next()); } if(arr[i][3] != ''){ attachmentFiles.push(folders[2].getFilesByName(arr[i][3]).next()); } } var strBody=strDoc /* メールを送信 */ GmailApp.sendEmail( strTo, //toアドレス strSubject, //表題 strBody, //本文 { from: strFrom, //fromアドレス name: strSender, //差出人 attachments: [] } ); }

投稿2018/03/29 00:21

seijisam

総合スコア7

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

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

0

まず、ループ中の処理だけを提示されているのかと思いますが、全体が見えないので見える部分のみでの回答となります。
ロジックとしては以下のようにすれば良いと思います。
0. メールアドレス~添付ファイル名_3までの範囲を取得(B2:E5)
0. 企業ごとに空値チェック、添付ファイル取得、メール送信までを行う

条件分岐をわかりやすく、あえて泥臭く適当に組んだサンプルです。
動作確認はしていませんので参考程度に。

javascript

1 /*省略*/ 2 var arr = mySheet.getRange(2, 2, 4, 4).getValues();// 1 3 //処理負荷軽減のためまとめてフォルダー情報を取得 4 var folders = [ 5 DriveApp.getFolderById('-----------------------'), //(添付1ファイル)のフォルダIDで取得 6 DriveApp.getFolderById('-----------------------'), //(添付2ファイル)のフォルダIDで取得 7 DriveApp.getFolderById('-----------------------') //(添付3ファイル)のフォルダIDで取得 8 ]; 9 // 2 10 for(var i = 0, l = arr.length; i < l; i++){ 11 if(arr[i][1] != ''){ 12 attachmentFiles.push(folders[0].getFilesByName(arr[i][1]).next()); 13 } 14 if(arr[i][2] != ''){ 15 attachmentFiles.push(folders[1].getFilesByName(arr[i][2]).next()); 16 } 17 if(arr[i][3] != ''){ 18 attachmentFiles.push(folders[2].getFilesByName(arr[i][3]).next()); 19 } 20 /*メール送信処理省略 to:arr[i][0] */ 21 attachmentFiles = []; //初期化 22 } 23 /*省略*/

[補足]
一部、コード中に記述ミスがありましたので修正しました。

投稿2018/03/27 06:14

編集2018/03/27 12:52
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

seijisam

2018/03/27 23:45

早速アドバイスを頂き、有難うございました。 これから試してみます。まずはお礼まで。
seijisam

2018/03/28 07:00

stshisho様 教えて頂いた内容をもとに本日ずっとトライしていますが、ご推察のとおり当方初心者マークが10個くらい必要なスーパー素人なため、未だにうまく動かせていません。 試行錯誤して現在下記のようなスクリプトに辿り着いたのですが、方向性は合っていますでしょうか? (無効なメール: undefined 行48 というエラーが出ています) あるいは全くトンチンカンなことをやっていますでしょうか? お忙しいところ恐縮ですが、ご教授頂ければ幸いです。 -------------------------------------------------------------------- function sendMailWithAttachments(){ /* スプレッドシートのシートを取得と準備 */ var mySheet=SpreadsheetApp.getActiveSheet(); //シートを取得 /* ドキュメント「メール本文」を取得する */ var docTest=DocumentApp.openById("---------------------------"); //メール本文のドキュメントをIDで取得 var strDoc=docTest.getBody().getText(); //ドキュメントの内容を取得 /* メール表題、fromアドレス、差出人名を準備 */ var strSubject="複数添付ファイルの送付"; //表題 var strFrom="------------------------"; //From var strSender="----------------------"; //差出人 // 添付ファイル用の配列を作成 var attachmentFiles =[]; var arr = mySheet.getRange(2, 2, 4, 4).getValues();// //処理負荷軽減のためまとめてフォルダー情報を取得 var folders = [ DriveApp.getFolderById('--------------------------'), //(添付1ファイル)のフォルダIDで取得 DriveApp.getFolderById('--------------------------'), //(添付2ファイル)のフォルダIDで取得 DriveApp.getFolderById('--------------------------') //(添付3ファイル)のフォルダIDで取得 ]; for(var i = 0, i= arr.length; i <1; i++){ var strTo=arr[i][0].getValue().next(); //送付先メールアドレス if(arr[i][1] != ''){ attachmentFiles.push(folders[0].getFilesByName(arr[i][1]).next()); } if(arr[i][2] != ''){ attachmentFiles.push(folders[1].getFilesByName(arr[i][2]).next()); } if(arr[i][3] != ''){ attachmentFiles.push(folders[2].getFilesByName(arr[i][3]).next()); } } var strBody=strDoc /* メールを送信 */ GmailApp.sendEmail( strTo, //toアドレス strSubject, //表題 strBody, //本文 { from: strFrom, //fromアドレス name: strSender, //差出人 attachments: [] } ); }
退会済みユーザー

退会済みユーザー

2018/03/28 09:19

申し訳ございませんが、コメント欄にコードを記述されると可読性が悪いため、質問欄に補足として追記していただければと思います。 (「</>」のアイコンをクリックしてください。) あと、できれば適切なインデント処理(字下げ)もお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問