見出し画像

GAS Sample_スプレッドシート上で宛先を選択しメール送信(その3)

前回までスプレッドシート上で宛先を選択しメール送信する手順を記しました。

スクリプトでは「メール送信」「下書き作成」のメニューを実装していますが、同様の内容が重複したスクリプトが2つあり長いので、構造をシンプルにします。

前回のスクリプトはこちら。

function sendMail(){
 
 //スプレッドシート、および各シートを取得
 const ss        = SpreadsheetApp.getActiveSpreadsheet();
 const listSheet = ss.getSheetByName('list')
 const mailSheet = ss.getSheetByName('mail')
 
 //mailSheetのセルB1-B2から件名、本文を取得
 const subject = mailSheet.getRange(1, 2).getValue();
 const body    = mailSheet.getRange(2, 2).getValue();
 
 //listSheetの最終行を取得、メアドを格納する変数recipient,cc,bccを準備
 const lastRow   = listSheet.getLastRow();
 let   recipient = '';
 let   cc        = '';
 let   bcc       = '';
 
 //listSheetの列A-Cにチェックが入っていたらメアドを追加
 for(let i = 2 ;i <= lastRow ; i++){
   const checkTo  = listSheet.getRange(i, 1).getValue();
   const checkCc  = listSheet.getRange(i, 2).getValue();
   const checkBcc = listSheet.getRange(i, 3).getValue();
   const address  = listSheet.getRange(i, 5).getValue();
   
   if(checkTo == true){
     recipient += address + ',';
   }
   if(checkCc == true){
     cc += address + ',';
   }
   if(checkBcc == true){
     bcc += address + ',';
   }
 }
 //  メール送信  
 GmailApp.sendEmail(recipient, subject, body, {cc:cc, bcc:bcc});
}

function createDraft(){
 
 //スプレッドシート、および各シートを取得
 const ss        = SpreadsheetApp.getActiveSpreadsheet();
 const listSheet = ss.getSheetByName('list')
 const mailSheet = ss.getSheetByName('mail')
 
 //mailSheetのセルB1-B2から件名、本文を取得
 const subject = mailSheet.getRange(1, 2).getValue();
 const body    = mailSheet.getRange(2, 2).getValue();
 
 //listSheetの最終行を取得、メアドを格納する変数recipient,cc,bccを準備
 const lastRow   = listSheet.getLastRow();
 let   recipient = '';
 let   cc        = '';
 let   bcc       = '';
 
 //listSheetの列A-Cにチェックが入っていたらメアドを追加
 for(let i = 2 ;i <= lastRow ; i++){
   const checkTo  = listSheet.getRange(i, 1).getValue();
   const checkCc  = listSheet.getRange(i, 2).getValue();
   const checkBcc = listSheet.getRange(i, 3).getValue();
   const address  = listSheet.getRange(i, 5).getValue();
   
   if(checkTo == true){
     recipient += address + ',';
   }
   if(checkCc == true){
     cc += address + ',';
   }
   if(checkBcc == true){
     bcc += address + ',';
   }
 }
 //下書き  
 GmailApp.createDraft(recipient, subject, body, {cc:cc, bcc:bcc});
}

function onOpen(){
 
 SpreadsheetApp.getUi()
 .createMenu('スクリプト')
 .addItem('メール送信', 'sendMail')
 .addItem('下書き作成', 'createDraft')
 .addToUi();
}

自力で調べて書き換えようトライしてみましたが上手くいかず、所属しているコミュニティの方に教えていただきました。ありがとうございました。
書き換えたスクリプトはこちら。

function createMailData(doSend){
 
 //スプレッドシート、および各シートを取得
 const ss        = SpreadsheetApp.getActiveSpreadsheet();
 const listSheet = ss.getSheetByName('list')
 const mailSheet = ss.getSheetByName('mail')
 
 //mailSheetのセルB1-B2から件名、本文を取得
 const subject = mailSheet.getRange(1, 2).getValue();
 const body    = mailSheet.getRange(2, 2).getValue();
 
 //listSheetの最終行を取得、メアドを格納する変数recipient,cc,bccを準備
 const lastRow   = listSheet.getLastRow();
 let   recipient = '';
 let   cc        = '';
 let   bcc       = '';
 
 //listSheetの列A-Cにチェックが入っていたらメアドを追加
 for(let i = 2 ;i <= lastRow ; i++){
   const checkTo  = listSheet.getRange(i, 1).getValue();
   const checkCc  = listSheet.getRange(i, 2).getValue();
   const checkBcc = listSheet.getRange(i, 3).getValue();
   const address  = listSheet.getRange(i, 5).getValue();
   
   if(checkTo == true){
     recipient += address + ',';
   }
   if(checkCc == true){
     cc += address + ',';
   }
   if(checkBcc == true){
     bcc += address + ',';
   }
 }
 
 //doSendがtrueならメール送信、falseなら下書き作成を実行
 if (doSend) {
   GmailApp.sendEmail(recipient, subject, body, {cc:cc, bcc:bcc}); //送信  
 } else {
   GmailApp.createDraft(recipient, subject, body, {cc:cc, bcc:bcc}); //下書き   
 }
}

function sendMail() {
 
 //誤操作による誤送信防止のためにメッセージボックスを実装
 if (Browser.msgBox('メール送信しますか?', Browser.Buttons.OK_CANCEL) == 'cancel') {
   return;   
 } 
 createMailData(true);
}

function createDraft() {
 
 createMailData(false);
}

function onOpen(){
 
 SpreadsheetApp.getUi()
 .createMenu('スクリプト')
 .addItem('メール送信', 'sendMail')
 .addItem('下書き作成', 'createDraft')
 .addToUi();
}

「メール送信」なら'true'、
「下書き作成」なら'false'を関数createMailDataに渡して実行します。

また、関数sendMailでは意図せず「メール送信」メニューをクリックした場合に備え、

 if (Browser.msgBox('メール送信しますか?', Browser.Buttons.OK_CANCEL) == 'cancel') {
   return;   
 } 

としてメッセージボックスを実装しました。

画像1

誤って操作した場合は「キャンセル」を押下するとメール送信はされずスクリプトが終了します。

この記事が気に入ったらサポートをしてみませんか?