9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

メール通知を介してGoogle Apps Scriptによりサービス間の連携を行う

Last updated at Posted at 2017-01-05

はじめに

社内コミュニケーションの中心にビジネスチャットツールを据えて情報を集約している会社も多いと思います。天下のSlack様であれば、最初から連携可能なサービスも豊富に用意されていますが、まだまだ対応できてないサービスもあることでしょう。Slack以外となれば推して知るべし。

「なんだよ、連携できねーのかよ。使えねーな!」と言う前に、メール通知機能は備わっていませんか?Gmailのメールアドレス宛に通知して、Google Apps Scriptで処理を行い、連携先のAPIを呼び出す。ただ、これだけです。

「なんだ、そんなことか。つまらん。」という方、その通りです。そんなつまらない内容です。

サービス連携の図

Untitled.png

一例

私の会社では、請求管理システムとして「働くDB」というサービスを利用しています。データベースを核とした業務システムを簡単に構築できる、よくあるサービスです。
なぜそんなものを利用しているのかは置いといて、このサービスはExcelファイルへのデータ埋め込みによる帳票出力機能は備えていますが、PDFファイルの直接出力はできません。
そこで、Google Apps Scriptを使って処理したいと思います。

概略図

Untitled.png

スクリプト

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を呼び出しています。
  • 社内ではチャットワークを利用しており、よく使う処理を別途ライブラリにまとめています。
  • スクリプトを作成したら、トリガーを設定して定期的に実行することを忘れずに。

参考

  1. convertExcel2Sheets
    https://gist.github.com/azadisaryev/ab57e95096203edc2741

  2. Google Apps Script リファレンス
    https://developers.google.com/apps-script/reference/

  3. チャットワーク API ドキュメント
    http://developer.chatwork.com/ja/

9
8
0

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
9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?