この記事は 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", "メールのタイトルを入れて下さい", "メールの本文を入れて下さい");
}
後はテンプレートとなるスプレッドシートを用意しておいて、何かのアクションをトリガーにスプレッドシートをコピーしつつデータを入れ込みつつ、上記を呼び出せれば完成なんではないでしょうか。
以上です。