Excel
GoogleAppsScript
spreadsheet

GoogleAppScriptを使ってスプレッドシートをExcel形式で添付してメール送信する

この記事は Wanoグループ Advent Calendar 2017の18日目の記事になります。

タイトルの通りです。

ビジネスの二大お荷物ツールであるところのメールとExcelを使った業務フローってまだまだありますよね。
そして、こういった業務フローを効率化したいという要望も同じくよくあります。

そんななか、Googleスプレッドシートには「メールに添付して送信」という機能があり、Excel形式(.xlsxファイル)を選択することもできます。
この機能をGoogleAppScriptから扱えれば!ということで調べた結果が当記事になります。

xlsxファイルをエクスポートしてメールを送る関数

スプレッドシートオブジェクトとメールの送り先などなどを渡してやると、Excel形式で添付してメール送信をしてくれるという処理を関数にまとめました。

ところで、スプレッドシートオブジェクトにはgetAsというメソッドが用意されていて、PDF形式ならこれで取り出せるんですが、Excel形式は準備されていないんですね。
なので、前段で述べたような機能をそのまま実現できるAPIは用意されていないということになります。
その代わり、エクスポート用のURLが用意されているようなので、今回はこちらを使います。

//
// スプレッドシートをExcel形式で添付してメール送信する関数
// 
// ssFile: スプレッドシートオブジェクト
// mailto: メールの送信先
// subject: メールのタイトル
// body: メールの本文
function sendEmailAsXlsx(ssFile, mailto, subject, body) {

  //スプレッドシートオブジェクトからIDを取り出す
  var fileId   = ssFile.getId();

  //Excelファイルの名前は適当に
  var xlsxName = ssFile.getName() + ".xlsx";

  //エクスポート用のURLはこちら
  var fetchUrl = "https://docs.google.com/feeds/download/spreadsheets/Export?key=" + fileId + "&exportFormat=xlsx";

  //OAuth2対応が必要
  var fetchOpt = {
    "headers" : { Authorization: "Bearer " + ScriptApp.getOAuthToken() },
    "muteHttpExceptions" : true
  };

  //URLをダウンロード
  var xlsxFile = UrlFetchApp.fetch(fetchUrl, fetchOpt).getBlob().setName(xlsxName)

  //ダウンロードしたxlsxファイルを添付してメール送信
  MailApp.sendEmail(mailto, subject, body, {attachments:[xlsxFile]});
}

呼び出し例

function createSpreadSheet() {

  //今回は新しくスプレッドシートを作成するところから
  var ssName     = "GASから作成";

  //ここで取得したスプレッドシートオブジェクトを先に作った関数の引数として使う
  var ssFile     = SpreadsheetApp.create(ssName); 

  //適当な値でセルを埋めてるだけ
  var sheet      = ssFile.getSheets()[0];
  var cell       = sheet.getRange('A1');
  cell.setValue(new Date());

  //setValueしただけだとスクリプトが終了するまで値が反映されない。なぜかこれを入れると反映されるというおまじない
  Logger.log(cell.getValue()); 

  //先の関数を呼び出して、メールを送信
  sendEmailAsXlsx(ssFile, "hoge@example.com", "メールのタイトルを入れて下さい", "メールの本文を入れて下さい");
}

後はテンプレートとなるスプレッドシートを用意しておいて、何かのアクションをトリガーにスプレッドシートをコピーしつつデータを入れ込みつつ、上記を呼び出せれば完成なんではないでしょうか。

以上です。