前提・実現したいこと
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{} } //略 } } }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/11 14:43 編集