google apps script スプレッドシートから指定したシートを強引に添付してメール送付する。

##スプレッドシートから指定したシートのみを選択してメール送信する
 - 添付するファイル形式を、Spread、pdf、xlsxで指定できる。
 - 複数ファイル指定可能  
 - 指定したシートを添付できるメソッドが見当たらなかったため、一度ドライブ上のルートにスプレッドシートのコピーを作成して、指定したシート以外を削除して、それを添付するという強引な処理。（最後にコピーしたスプレッドシートを削除）


```js
function sendEmailattAchmentMultiFile() {

  // 現在日付を取得
  var nowDate = Utilities.formatDate(new Date(), 'JST', 'yyyyMMdd');
  
  // 自分自身のスプレッドシート名を取得
  var mySpreadSheetName = SpreadsheetApp.getActiveSpreadsheet().getName();
  
  
  //＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
  //＊設定項目↓↓
  //＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊

  // [宛先]
  // ダブルコーテーションの中にメールアドレスを設定して下さい。複数設定する場合は、カンマ区切りで設定します。
  // to,cc,bcc共に設定方法は同一です。
 
  // To
  var strMailTo = "test@gmail.com";
  // Cc
  var strMailCc = "";
  // Bcc
  var strMailBcc = "";

  
  // [メールタイトル]
  // ダブルコーテーションの中にメールのタイトルを設定して下さい。	
  
  var strSubject = "テスト" + nowDate;

  
  // [メール本文] 
  // ダブルコーテーションの中にメールのタイトルを設定して下さい。	
  // 「+」は文字列連結になります
  // 「/n」は改行コードになります。改行したい箇所に/nを記述して下さい。

  var strBody = nowDate + "日のメール送付いたします。テスト配信です。\n"
                + "複数ファイル添付のテストを行っています。";
  
  // [送信するスプレッドシートの情報を設定する] 
  // 複数スプレッドシートを送信する場合は、送信するスプレッドシート数分の変数(配列)を宣言してください。
  // 配列に以下のように設定する↓↓
  // 0番目：送信するスプレッドシート名（ドライブ上にあるスプレッドシート）　自分自身のスプレッドシートを送信する場合は「mySpreadSheetName」という変数を使用する。
  // 1番目：送信するファイル名　送信する際のファイル名を設定して下さい。日付を付与する場合は「nowDate」を + で連結してください。
  // 2番目：送信するファイルフォーマットを指定して下さい。特に変換が必要ではない場合（スプレッドシートで送信する）は、""(ブランク)を設定
  //       指定可能ファイルフォーマット指定値　"pdf","xlsx",””
  // 3番目以降：送信するシート名を設定して下さい。
  //
  // ※変数名を指定する以外はダブルコーテーションで囲んで、[ ] の間に定義して下さい。カンマ区切りで設定します。
  //
  
  // 送信するファイル1つ目
  var sendSpreadsheet = [
     // 配列0番目
   　mySpreadSheetName,
     // 配列1番目
     mySpreadSheetName + "_" + nowDate,
     // 配列2番目
     "xlsx",
     // 配列3番目以降
     "シート1",
     "シート2",
     "シート3"];
     
       // 送信するファイル2つ目
  var sendSpreadsheet2 = [
     // 配列0番目
   　"送信したいスプレッドシートの名前",
     // 配列1番目
     "送信したいスプレッドシートの名前" + "_" + nowDate,
     // 配列2番目
     "pdf",
     // 配列3番目以降
     "Spread2シート1",
     "Spread2シート2",
     "Spread3シート3"];


  // [送信するスプレッドシートを纏める] 
  // 上記で宣言した配列スプレッドシートの情報を2次元配列として設定します。
  // カンマ区切りで設定して下さい。
  // 変数を設定していないと、上記で変数宣言していてもメールに添付されません。
  var allSendSpreadsheets = [sendSpreadsheet,sendSpreadsheet2]
    
  
  //＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
  //＊設定項目↑↑
  //＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
  
  //＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
  //＊ここから処理↓↓
  //＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
 
  
  // ↓Google OAuth認証↓
  
  // Googleドライブのルートフォルダを取得
  // この処理を記述しないとメール送信の際に、Googleドライブへのアクセスするためのスコープが取得されない。
  // スクリプトの初回起動時にGoogleドライブへアクセス許可を求められる。
  DriveApp.getRootFolder();
  // スプレッドシートをメールに添付する際のアクセストークン取得
  var fetchOpt = {
    "headers" : { Authorization: 'Bearer ' + ScriptApp.getOAuthToken() },
    "muteHttpExceptions" : true
   };
   
  // ↑Google OAuth認証↑
  
  
  // メール送信時の添付用ファイル用の配列の宣言
  var attachmentFiles = new Array();
  
  // スプレッドシートのKEY値
  var key; 
  
  // 送信ファイル名
  var sendName;
  
  // fetch用のリクエストURL
  var fetchUrl;
  
  // 送信用スプレッドシートのKEY値の配列
  var keys = new Array(allSendSpreadsheets.length);
  
  // 送信するスプレッドシートの情報ごとに繰り返し処理
  for(i = 0; i < allSendSpreadsheets.length; i++){
  
    // 送信のスプレッドシートの作成
    key = createSendFile_(allSendSpreadsheets[i]);
   
    // 送信用スプレッドシートのKEY値がブランクの場合
    if(key == ""){
    
     // 送信用スプレッドシートの作成に失敗したため、次のスプレッドシート情報を処理する。
     keys[i] = "";
     continue;
    }
    
    // KEY値の配列にKEY値を設定する
    keys[i] = key;
    
    // PDFで送信する場合
    if(allSendSpreadsheets[i][2] == "pdf"){
    
    　// 送信ファイル名の作成
      sendName = allSendSpreadsheets[i][1] + ".pdf";
      
      // 送信スプレッドシートのファイル情報を取得
      var attachmentFile = DriveApp.getFileById(key).getBlob();
    
    　// 添付用ファイルをgoogleにリクエストする。結果を格納。
      attachmentFiles.push({fileName:sendName, mimeType: attachmentFile.getContentType(), content:attachmentFile.getBytes()});

    }　// エクセルで送信する場合 
    else if(allSendSpreadsheets[i][2]  == "xlsx" ){
    
    　// 送信ファイル名の作成
      sendName = allSendSpreadsheets[i][1] + ".xlsx";
    
      // fetch用のリクエストURLを作成
      fetchUrl = "https://docs.google.com/feeds/download/spreadsheets/Export?key=" + key + "&amp;exportFormat=xlsx";
  
      // 添付用ファイルをgoogleにリクエストする。結果を格納。
      attachmentFiles.push(UrlFetchApp.fetch(fetchUrl,fetchOpt).getBlob().setName(sendName));

    
    } // スプレッドシートで送信する場合(ファイル変換なし)
    else if(allSendSpreadsheets[i][2] == ""){
    
      // 送信ファイル名の作成
      sendName = allSendSpreadsheets[i][1];
    
      // fetch用のリクエストURLを作成
      fetchUrl = "https://docs.google.com/feeds/download/spreadsheets/Export?key=" + key;
      
      // 添付用ファイルをgoogleにリクエストする。結果を格納。
      attachmentFiles.push(UrlFetchApp.fetch(fetchUrl, fetchOpt).getBlob().setName(sendName));
    
    } // 上記以外のファイルフォーマットが指定されている場合
    else {
    
      // 指定外のファイルフォーマットのため、次のスプレッドシート情報を処理する。
      continue;
    }
    
  }

  // メール送信
  MailApp.sendEmail(strMailTo, strSubject, strBody, {cc:strMailCc, bcc:strMailBcc, attachments:attachmentFiles});
  
  // 送信用に作成したスプレッドシートを全て削除する
  for(i = 0; i < keys.length; i++){
 
    if(keys[i] == ""){continue;}
  
    // ファイル削除処理
    deleteFile_(keys[i]);
  }

}

/**
*
* 送信するスプレッドシートを作成する(privateメソッド)
*
* @param String[] sendSpreadsheetInfo 送信するファイル情報(配列)
* @return String 作成したスプレッドシートのKEY値
*
*/
function createSendFile_(sendSpreadsheetInfo){

  // 送信対象のファイルオブジェクトを、指定ファイル名でGoogleドライブより取得する。
  var Files = DriveApp.getFilesByName(sendSpreadsheetInfo[0]);
  
  // ファイルオブジェクトが取得できない場合は、戻り値はブランクで処理終了
  if(!Files.hasNext()){return "";}

  // ファイルオブジェクト取得
  var objFile;
  while (Files.hasNext()) {
      objFile = Files.next();
  }
  
  // スプレッドシートオブジェクトを取得するためのURL作成
  var url = "https://docs.google.com/spreadsheets/d/" + objFile.getId() + "/edit";
  
  // スプレッドシートオブジェクト取得
  var spreadSheet = SpreadsheetApp.openByUrl(url);
  
  // 指定されたシートの存在確認を行う
  for (var i = 3; i < sendSpreadsheetInfo.length; i++){
    var sheet = spreadSheet.getSheetByName(sendSpreadsheetInfo[i]);
    
    // 指定されたシートが存在しない場合は、戻り値はブランクで処理終了
    if(sheet == null){return "";}
  }
   // 送信用のファイル名の作成
  var sendName = sendSpreadsheetInfo[1];
  
  // スプレッドシート作成(コピー)
  var copySpreadsheet = spreadSheet.copy(sendName);
  
  pivotTableChangeWrite_(copySpreadsheet);
  
  
  // コピーしたスプレッドシートの送信しないシートを削除(送信するシートのみ残す)
  var sheets = copySpreadsheet.getSheets();
  for (var i = 0; i < sheets.length; i++){  
    if(sendSpreadsheetInfo.indexOf(sheets[i].getName()) == -1){
         copySpreadsheet.deleteSheet(sheets[i]);
    }
  }
  
  // コピーしたスプレッドシートのKEY値を返却
  return copySpreadsheet.getId();
}

/**
*
* スプレッドシートを削除する(privateメソッド)
*
* @param String deleteKey 削除するスプレッドシートのKEY値
*
*/
function deleteFile_(deleteKey){
  
  // スプレッドシートのKEY値よりファイルオブジェクトを取得する
  var objFile = DriveApp.getFileById(deleteKey);
  // スプレッドシートファイルを削除する
  DriveApp.getRootFolder().removeFile(objFile);
}
```