Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

概要

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

動作結果

  1. 事前準備として、エクセルとして使用するスプレッドシートをGoogleDriveに用意します。
    キャプチャ3.PNG

  2. スクリプトを実行すると以下のように圧縮されたものがGmailの下書きに添付されます。
    無題.png

  3. 添付されたpress.zipをダウンロードして開くと、以下のようにExcelが圧縮されています。
    キャプチャ2.PNG

ソースコード

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の下書きを作成する

central-soft
システム開発、インフラ構築、IT運用管理のトータルソリューションを実現する企業です。
http://www.central-soft.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away