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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

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

Google Apps Script

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

解決済

2回答

1192閲覧

ASで複数の企業に複数の添付ファイルを送りたいが、添付が抜けてしまうかエラーが出てしまいます

kiha82

総合スコア1

Google スプレッドシート

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

Google Apps Script

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

0グッド

1クリップ

投稿2020/08/05 11:32

編集2020/08/11 14:40

前提・実現したいこと

 googleスプレッドシートにある宛先リスト(会社名、メールアドレス、複数の添付ファイル名)と
メール内容テンプレートをからgoogle Drive上のファイルを取得し、添付メールを送信したいです。

 企業によって毎月添付するファイルの数が異なり、1~5つほど1通に添付をしています。
フォルダの中に同じファイル名はなく、毎月同じ名前のファイル(ファイル数は異なる)を
googleドライブに保存し、それを添付して送りたいです。

発生している問題

1,添付ファイルが1つ抜けてしまう
2,対象ファイル名(拡張子付き)がシート記載にあるが、google Drive上にデータが存在するとエラーが出てしまう。

該当のソースコード

function sendMail(){ //----- スプレッドシートのシートの取得-------- var book = SpreadsheetApp.getActiveSpreadsheet(); //------------メール本文-------------------------- //ドキュメント「メール本文」を取得する */ var docTest = book.getSheetByName("メール本文"); // メール件名を取得 var subject = docTest.getRange(2, 2).getValue(); // メール本文を取得 var body = docTest.getRange(3, 2).getValue(); //----- 宛先リストシートを取得-------------------- var Atesakisheet = book.getSheetByName("宛先リスト"); // 処理対象の行数を取得 var lastRow = Atesakisheet.getLastRow(); //------ 添付ファイル用の配列を作成-------- var attachmentFiles =[] var arr = Atesakisheet.getRange(2, 1, lastRow - 1 , 12).getValues(); // /* arr を以下のように取得 [['会社名','部署名','名前','送信先アドレス','添付1ファイル名','添付2ファイル名','添付3ファイル名','添付4ファイル名','添付5ファイル名',…]] */ //フォルダー情報を添付ファイルのフォルダIDで取得 var folderid = [ DriveApp.getFolderById('----------------------------') ]; for(var i = 0; i < arr.length; i++){ //送付先メールアドレスを取得 var strTo = arr[i][3]; for (var j = 0; j <= 5; j++) { //添付ファイル1~5を取得(空白ならスキップ) if(arr[i][j + 4] != ''){ var filename = arr[i][j + 4]; var files = folder.getFilesByName(filename); //ファイルがあるかどうか while (files.hasNext() ){   //添付する attachmentFiles.push(files.next()) } } } //-----------本文の差込データ作成------------   // 対象行の差込データを取得 var sasikomiData1 = Atesakisheet.getRange(i +2, 1).getValue();//社名 var sasikomiData2 = Atesakisheet.getRange(i +2, 2).getValue();//部署 var sasikomiData3 = Atesakisheet.getRange(i +2, 3).getValue();//名前 var sasikomiGoBody = body; // 差込データが入力されている場合は、差込処理を行う if (sasikomiData1 != "") { sasikomiGoBody = sasikomiGoBody.replace("{{差込データ1}}", sasikomiData1, "g"); } if (sasikomiData2 != "") { sasikomiGoBody = sasikomiGoBody.replace("{{差込データ2}}", sasikomiData2, "g"); } if (sasikomiData3 != "") { sasikomiGoBody = sasikomiGoBody.replace("{{差込データ3}}", sasikomiData3, "g"); } //--------------------メール送信と次の行への準備----------------- //メールを送信 //GmailApp.sendEmail(strTo, subject, sasikomiGoBody,{attachments:attachmentFiles}); //添付の初期化 attachmentFiles = []; }; // 終了確認ダイアログを表示 Browser.msgBox("確認", "メール送信が完了しました。", Browser.Buttons.OK); /* forループでの処理 企業ごとに添付取得、本文差替、メール送信までを行います。 */ }; /* スプレッドシートを開いた際に自動実行 コントロールメニューにスクリプト実行コマンドを追加 */ function onOpen() { var sheet = SpreadsheetApp.getActiveSpreadsheet(); var entries = [ { name : "メール一斉送信", functionName : "sendMail" } ]; sheet.addMenu("スクリプト実行", entries); };

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

こちらを参考にしました。
リンク

添付がズレている点の修正とファイルのあるかどうかを修正しました。(ver1.1)
実現したいことの文を修正しました。

参考スクリプト
スプレッドシート上のファイルがあるか判断して削除していく

function myFunction() {  var folderid = DriveApp.getFolderById('-----------');  var book = SpreadsheetApp.getActiveSpreadsheet(); var Atesakisheet = book.getSheetByName("宛先リスト"); var lastRow = Atesakisheet.getLastRow(); var arr = Atesakisheet.getRange(2, 5, lastRow - 1 , 12).getValues();   for(var i = 0, l = arr.length; i < l; i++){ if(arr[i][0] != ''){ var filesname = arr[i][0] var files_ichiran = folderid.getFiles(); if ( files_ichiran.hasNext() ){  while ( files_ichiran.hasNext() ){  var deletefiles = files_ichiran.next(); if ( deletefiles.getName().indexOf(arr[i][0]) != -1 ){ var deletefiles = deletefiles.getId();  var deletefile = DriveApp.getFileById(deletefiles);  deletefile.setTrashed(true); } } }else{} } //略 } } }

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

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

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

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

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

guest

回答2

0

ベストアンサー

js

1//フォルダー情報を添付ファイルのフォルダIDで取得 2var folder = DriveApp.getFolderById('----------------------------'); 3 4for(var i = 0; i < arr.length; i++){ 5 6 //送付先メールアドレスを取得 7 var strTo = arr[i][3]; 8 9 for (var j = 0; j <= 5; j++) { 10 //添付ファイル1~5を取得(空白ならスキップ) 11 if(arr[i][j + 4] != ''){ 12 var filename = arr[i][j + 4]; 13 var files = folder.getFilesByName(filename); 14 15 //ファイルがあるかどうか 16 while (files.hasNext() ){  17  //添付する 18 attachmentFiles.push(files.next()) 19 } 20 } 21 } 22 23 // 以降省略 24} 25

投稿2020/08/10 23:09

macaron_xxx

総合スコア3191

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

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

kiha82

2020/08/11 14:43 編集

macaron_xxx様 ご回答ありがとうございます。 無事に動くことができました! ありがとうございました。
guest

0

空白かどうかをチェックしているセルと、実際にファイル名を取得するセルがずれているからですね。

Diff

1- if(arr[i][5] != ''){ 2+ if(arr[i][4] != ''){ 3 attachmentFiles.push(folders[0].getFilesByName(arr[i][4]).next()); 4 }    5- if(arr[i][6] != ''){ 6+ if(arr[i][5] != ''){ 7 attachmentFiles.push(folders[0].getFilesByName(arr[i][5]).next()); 8 }// 9- if(arr[i][7] != ''){ 10+ if(arr[i][6] != ''){ 11 attachmentFiles.push(folders[0].getFilesByName(arr[i][6]).next()); 12 } 13- if(arr[i][8] != ''){ 14+ if(arr[i][7] != ''){ 15 attachmentFiles.push(folders[0].getFilesByName(arr[i][7]).next()); 16 } 17- if(arr[i][9] != ''){ 18+ if(arr[i][8] != ''){ 19 attachmentFiles.push(folders[0].getFilesByName(arr[i][8]).next()); 20 }

投稿2020/08/05 12:48

Daregada

総合スコア11990

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

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

kiha82

2020/08/06 13:36 編集

Daregada 様 回答ありがとうございます。 無事、全ての添付ファイルが全て添付されるようになりました。 ありがとうございました。 しかし、google Driveにフォルダがない場合(例としてあ①.pdf、あ②.xlsx、あ③.xlsxのうち あ③.xlsxが今回はない場合)等には下記のエラーが出てしまいます。 次のオブジェクトを取得できません。イテレータが末尾に到達しました。 (行 〇〇、ファイル「コード」) 〇〇の部分はそのファイルがなかった行を実行した際に、そこで止まってしまうようです。 当方、初心者の為、可笑しな考え方でしたら申し訳ないのですが、 if(arr[i][5] != ''){ 以降にファイルがない場合は後の処理をスキップするなどの処理をするように しなければいけないのでしょうか? お忙しいところ恐縮ですが、ご教授頂ければ幸いです。
Daregada

2020/08/06 13:51

添付するファイルをご自分で指定しているのに、それが実際には存在しないために起こる問題は、あなたの運用の不備であって、今回の質問とは関係ないのではないですか。 解決したいのであれば、getFilesByNameの使い方をご自分で調べ、ファイルの存在チェックを行なってからattachmentFiles.pushを行なえばいいのです。
kiha82

2020/08/10 03:30

Daregada 様 回答と方向性の指示ありがとうございます。 問題点に記載させていただきましたが、要点のわかりにくい記述となっておりすみません。 問題としては2点あり、 1,添付ファイルが1つ抜けてしまう→前回ご回答にて解決することができました。 2,対象ファイル名(拡張子付き)がシート記載にあるが、  google Drive上にデータが存在するとエラーが出てしまう。 要点が分かりにくい文章や、他にも誤解を招いてしまう記載等がございましたら、 ご迷惑をおかけしてしまい申し訳ありません。   方向性についてご指摘頂いた件、作成し追記し修正したのですが、 今度はデータが添付できないようになりました。 取得したデータが変わってしまった等の理由があるのでしょうか? また、ご指摘の運用につきましては、 送付先の事を考えファイル名を1つ1つ別にして、送付をしたいのと、 その後の確認用の為に、スプレッドシート上でのリストを元に動くようにしています。 お忙しいところ恐縮ですが、ご教授頂ければ幸いです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問