[Google Apps Script] エクセルをGmailの下書きに圧縮して添付する

# 概要
　近く、Gsuiteを社内に導入し、gas(GoogleAppsScript)で業務改善を行ってい行く予定です。今回はその勉強として、Googleドライブにあるスプレッドシートをエクセル化して、Gmailの下書きに圧縮して添付するスクリプトを作成しました。

##動作結果
1. 事前準備として、エクセルとして使用するスプレッドシートをGoogleDriveに用意します。
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533728/052b29ab-a009-b4da-d7ca-936f9defb471.png)


2. スクリプトを実行すると以下のように圧縮されたものがGmailの下書きに添付されます。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533728/7d51e275-f38d-70fc-5f68-48cc90c3327a.png)

3. 添付されたpress.zipをダウンロードして開くと、以下のようにExcelが圧縮されています。
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533728/b17ede29-729a-81c0-8e6d-78d692fc360f.png)


# ソースコード

```javascript:make_draft
//圧縮対象フォルダのID
var zipfolder = "xxxxxxxxxxxxxxxxxxxx"
//spreadsheetのID
var spreadsheetId = "xxxxxxxxxxxxxxxxxxxxxxx";

function myFunction () {
  //　メールの宛先
  var mailTo = "to@example.com"
  //  メールのCc
  var mailCc = "cc@example.com"
  
  //　テキストメールの場合はここに本文テキストを設定します。
  var mailBody = 'てすとでございます'  
  var date = new Date()
  //　メールタイトル
  var mailTitle = date + " ほげほげ"
  // spreadsheetをexcel化する
  makeExcel()
  // 圧縮対象フォルダをzip化する
  var zipId = zippress()
  
  // ファイルIDを指定して、ファイルを取得する
  var report = DriveApp.getFileById(zipId);
  // 各引数をもとにgmailの下書きを作成する。
  GmailApp.createDraft(mailTo, mailTitle, mailBody,  {attachments: [report]})
}


//圧縮ルーチン
function zippress(){
//圧縮するファイルが入ってるフォルダを指定
var folder = DriveApp.getFolderById(zipfolder);
//カレントフォルダを取得する
var curdir = folder.getId();
//zip圧縮を行う
var zipman = Utilities.zip(getBlobs(folder, ''), folder.getName()+'.zip')

var zipFile = folder.getParents().next().createFile(zipman)
  return zipFile.getId()
}

//zip化するために、指定フォルダ内のファイルを配列にBlobで入れる関数
function getBlobs(rootFolder, path) {
  var blobs = [];
  var files = rootFolder.getFiles();
  while (files.hasNext()) {
    var file = files.next().getBlob();
    file.setName(path+file.getName());
    blobs.push(file);
  }
  var folders = rootFolder.getFolders();
  while (folders.hasNext()) {
    var folder = folders.next();
    var fPath = path+folder.getName()+'/';
    blobs.push(Utilities.newBlob([]).setName(fPath)); 
    blobs = blobs.concat(getBlobs(folder, fPath));
  }
  return blobs;
}


function makeExcel() {
  var excel_file = ss2xlsx(spreadsheetId);
  if (excel_file !== undefined) {
    Logger.log("Name:" + excel_file.getName());
  }
}

//SpreadsheetをExcelファイルに変換してドライブに保存、Fileを返す
function ss2xlsx(spreadsheet_id) {
  var new_file;
  var url = "https://docs.google.com/spreadsheets/d/" + spreadsheet_id + "/export?format=xlsx";
  var options = {
    method: "get",
    headers: {"Authorization": "Bearer " + ScriptApp.getOAuthToken()},
    muteHttpExceptions: true
  };
  var res = UrlFetchApp.fetch(url, options);
  if (res.getResponseCode() == 200) {
    var ss = SpreadsheetApp.openById(spreadsheet_id);
    //圧縮するファイルが入ってるフォルダを指定
    var folder = DriveApp.getFolderById(zipfolder);
    new_file = folder.createFile(res.getBlob()).setName(ss.getName() + ".xlsx");
  }
  return new_file;
}
```

##続編
ブラウザから入力を受け取り、gmailの下書きに反映するものを作成しました。

[[Google Apps Script] ブラウザからの入力値をもとにGmailの下書きを作成する](https://qiita.com/kihachi_takayama/private/e151c47b0ae4787d11db)