LoginSignup
10

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-19

この記事は 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", "メールのタイトルを入れて下さい", "メールの本文を入れて下さい");
}

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

以上です。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10