はじめに
社内コミュニケーションの中心にビジネスチャットツールを据えて情報を集約している会社も多いと思います。天下のSlack様であれば、最初から連携可能なサービスも豊富に用意されていますが、まだまだ対応できてないサービスもあることでしょう。Slack以外となれば推して知るべし。
「なんだよ、連携できねーのかよ。使えねーな!」と言う前に、メール通知機能は備わっていませんか?Gmailのメールアドレス宛に通知して、Google Apps Scriptで処理を行い、連携先のAPIを呼び出す。ただ、これだけです。
「なんだ、そんなことか。つまらん。」という方、その通りです。そんなつまらない内容です。
サービス連携の図
一例
私の会社では、請求管理システムとして「働くDB」というサービスを利用しています。データベースを核とした業務システムを簡単に構築できる、よくあるサービスです。
なぜそんなものを利用しているのかは置いといて、このサービスはExcelファイルへのデータ埋め込みによる帳票出力機能は備えていますが、PDFファイルの直接出力はできません。
そこで、Google Apps Scriptを使って処理したいと思います。
概略図
スクリプト
function myFunction() {
var threads = GmailApp.search('label:働くdb subject:承認 label:unread');
if (threads.length == 0) {
return;
}
for (var i = threads.length - 1; i >= 0; i--) {
var messages = threads[i].getMessages();
for (var j = messages.length - 1; j >= 0; j--) {
if (messages[j].isUnread()) {
var subject = messages[j].getSubject();
var body = messages[j].getPlainBody();
var attachment = messages[j].getAttachments()[0];
var ss = convertExcel2Sheets(attachment.copyBlob(), attachment.getName());
var pdf = convertSheet2Pdf(ss, attachment.getName().replace(/\.xlsx$/, '.pdf'), '見積書フォルダID');
var notice = new Notice(subject, body);
var message = chatwork.addMention('', chatwork.getIdByHDBName(notice.user), notice.user);
message += notice.title+"\n";
message += notice.url+"\n";
message += "見積書の作成が完了しました。\n";
message += pdf.getUrl();
chatwork.postMessage(ROOMNUMBER, message);
messages[j].markRead();
clear(attachment.getName());
}
}
}
}
function Notice(subject, body) {
var lines = body.split("\n");
this.title = lines[0].trim();
this.url = lines[1].trim();
this.user = lines[2].trim();
}
function convertSheet2Pdf(spreadsheet, filename, folderId) {
var params = {
headers: {'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()}
};
var response = UrlFetchApp.fetch('https://docs.google.com/spreadsheets/d/'+spreadsheet.getId()+'/export?format=pdf&size=A4&fitw=false&portrait=true', params);
var folder = (typeof folderId == 'undefined') ? DriveApp : DriveApp.getFolderById(folderId);
return folder.createFile(response.getBlob()).setName(filename);
}
解説
- Excelファイルを直接PDFファイルに変換することができません。一度Googleスプレッドシートに変換します。(参考1)
- レイアウトを気にしないのであれば、Fileクラスの
getAs('application/pdf')
でも変換可能ですが、変換時のオプションを指定するためにURLを呼び出しています。 - 社内ではチャットワークを利用しており、よく使う処理を別途ライブラリにまとめています。
- スクリプトを作成したら、トリガーを設定して定期的に実行することを忘れずに。
参考
-
convertExcel2Sheets
https://gist.github.com/azadisaryev/ab57e95096203edc2741 -
Google Apps Script リファレンス
https://developers.google.com/apps-script/reference/ -
チャットワーク API ドキュメント
http://developer.chatwork.com/ja/