【GAS】特定メールの添付ファイルのGoogleドライブ保存をチャットワークに通知する

report

photo credit: CAF Wings Over Dallas IMG_5215_1_2016WOD_Gunfighter_KevinHong via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

Google Apps Scriptで特定のメールの添付ファイルをGoogleドライブに保存するツールを作成しています。

前回はこちらの記事です。

301 Moved Permanently

重複して同じメッセージについて処理を行わないために、Gmailのメッセージにスターを付与する方法を利用しました。

これにて、ツールとしては完成ということで、条件にマッチしたメール(例えばeFaxなど)が届いた場合にはGoogleドライブにその添付ファイルが自動保存されるようになりました。

今回は、この動作が行われたことをチャットワークに通知する処理を追加していきたいと思います。

GASで特定メールの添付ファイルのGoogleドライブ保存をチャットワークに通知する方法、行ってみましょう!

スポンサーリンク

前回までのおさらい

前回までで作成したスクリプトはこちらです。

var FOLDER_ID = 'XXXXXXXXXXXXXXXXX'; //保存するフォルダ
var SEARCH_TERM = 'subject:(添付ファイルテスト) ';

function fetchFile(){

  var myFolder = DriveApp.getFolderById(FOLDER_ID); //フォルダを取得

  var myThreads = GmailApp.search(SEARCH_TERM, 0, 100); //条件にマッチしたスレッドを検索して取得
  var myMessages = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得し二次元配列で格納

  for(var i in myMessages){
    for(var j in myMessages[i]){

      if(!myMessages[i][j].isStarred()){ //スターがないメッセージのみ処理をする

        var attachments = myMessages[i][j].getAttachments(); //添付ファイルを取得
        for(var k in attachments){
          myFolder.createFile(attachments[k]); //ドライブに添付ファイルを保存
        }

        myMessages[i][j].star(); //処理済みのメッセージにスターする
      }
    }
  }
}

件名に「添付ファイルテキスト」を含まれるメールを抽出して、その添付ファイルをFOLDER_IDで指定するGoogleドライブのフォルダに保存します。

前回追加した14行目のisStarredによる判定と、21行目のstar付与の処理により、同じメッセージには重複して処理がなされないようになっていますね。

チャットワークへの通知

チャットワークAPIを使用して、チャットワークに通知をする処理を考えます。

これは以下の記事で作成している、sendMessage関数を拝借しましょう。

【GAS】チャットワークのメッセージを取り出す関数とメッセージを送る関数
Google Apps Scriptを活用してチャットワークにおみくじチャットを作成しています。今回はチャットワークからメッセージを取り出す、メッセージを送る処理を関数化して全体のコードをスッキリさせます。

この部分のスクリプトはこちらです。

var CW_TOKEN = 'XXXXXXXXXXXXXXXXX '; //チャットワークAPIトークン
var ROOM_ID = XXXXXXXX; //通知先ルームID

/* チャットワークにメッセージを送る */
//room_id:ルームID
//body:メッセージ本文
function sendMessage(body){
  var params = {
    headers : {"X-ChatWorkToken" : CW_TOKEN},
    method : "post",
    payload : {
      body : body
    }
  };

  var url = "https://api.chatwork.com/v2/rooms/" + ROOM_ID + "/messages";
  var strResponse = UrlFetchApp.fetch(url, params);
  var json = JSON.parse(strResponse.getContentText());
  return json.message_id
}

チャットワークに送るテキストstrBodyを生成して

sendMessage(strBody);

とすることで、チャットワークにメッセージを送ることができますね。

チャットワークに送るテキストを生成する

そのチャットワークに送るテキストですが、以下項目を含めるようにしたいと思います。

  • 受信日時
  • 件名
  • 送信元
  • ファイル名
  • 保存したファイルのドライブ内URL

メッセージの受信日時とその書式の設定

Gmailの受信日時は

Messageオブジェクト.getDate()

で取得できますが、そのままチャットワークに送ると

Wed Dec 02 2017 00:00:00 GMT+0900(JST)

という、我々日本人には見慣れないフォーマットになってしまいます。

429 Too Many Requests

そのために、日時の取り扱いがとっても便利になるmoment.jsライブラリを使います。

momentオブジェクトの生成および書式の設定はそれぞれ

Moment.moment(日時)
momentオブジェクト.format(書式)

とします。今回、書式としては一般的な「YYYY/MM/DD HH:mm」を使用したいと思います。

日付&時刻の便利ライブラリ「Moment.js」をGoogle Apps Scriptで使う方法
Google Apps Scriptの日付&時刻ですが、Moment.jsライブラリで、非常に簡単に取り扱えます。今回はライブラリの追加方法とmomentオブジェクトの生成についてお伝えしていきます。
Google Apps ScriptでもMoment.jsで日付&時刻の書式フォーマットを簡単に指定
Google Apps Scriptで日付&時刻の便利ライブラリMoment.jsを使う方法についてお伝えしています。今回は日時の書式フォーマットを指定するformatメソッドの使い方です。

ということで、チャットワークに送るテキストの冒頭の部分はこのようにすれば良いですね。

/* チャットワークに送るBodyを生成 */
var mRvd = Moment.moment(myMessages[i][j].getDate()); //送信日時をmomentで取得
var strBody = "";
strBody += "[info][title]メール添付ファイル保存のお知らせ " + mRvd.format('YYYY/MM/DD HH:mm') + "[/title]";

メッセージの件名、送信元、添付ファイル名を取得する

続いて、メッセージの件名と送信元を取得します。

その場合はそれぞれ以下のようにすればOKです。

Messageオブジェクト.getSubject()
Messageオブジェクト.getFrom()
【GAS】Gmailからメールを検索してスプレッドシートに書き出す方法
Gmailに届いたWordPressサイトからの問い合わせメールの分析を進めています。今回はGoogle Apps ScriptでGmailから検索して取り出したメールたちをスプレッドシートに出力します。

また、添付ファイルのファイル名は、getNameメソッドで取得します。

GmailAttachmentオブジェクト.getName()
429 Too Many Requests

以上を踏まえて、チャットワークに送るテキストを生成する処理に以下を追加します。

strBody += "送信元: " + myMessages[i][j].getFrom() +"n";
strBody += "ファイル名: " + attachments[k].getName() +"n";
strBody += "ファイル名: " + attachments[k].getName() +"n";
strBody += "[hr]";

getUrlメソッドで保存ファイルのURLを取得する

Googleドライブ内のファイルURLを取得するには、Fileオブジェクトに対するgetUrlメソッドを使います。

書き方はこちらです。

Fileオブジェクト.getUrl()

Fileオブジェクトはどうやって取得すれば良いんだという話ですが、実は冒頭のベースとなるスクリプトの18行目、createFileメソッドは返り値としてFileオブジェクトを返します。

ですから以下のようにすれば、Fileオブジェクトを変数にとっておくことができます。

var file = myFolder.createFile(attachments[k]); //ドライブに添付ファイルを保存

ドライブ保存をチャットワークに通知するスクリプト

以上の処理を全て合体させますと、fetchFileは以下のようなスクリプトになります。

var FOLDER_ID = 'XXXXXXXXXXXXXXXXX'; //保存するフォルダ
var SEARCH_TERM = 'subject:(添付ファイルテスト) ';

function fetchFile(){

  var myFolder = DriveApp.getFolderById(FOLDER_ID); //フォルダを取得

  var myThreads = GmailApp.search(SEARCH_TERM, 0, 100); //条件にマッチしたスレッドを検索して取得
  var myMessages = GmailApp.getMessagesForThreads(myThreads); //スレッドからメールを取得し二次元配列で格納

  for(var i in myMessages){
    for(var j in myMessages[i]){

      if(!myMessages[i][j].isStarred()){ //スターがないメッセージのみ処理をする

        var attachments = myMessages[i][j].getAttachments(); //添付ファイルを取得
        for(var k in attachments){
          var file = myFolder.createFile(attachments[k]); //ドライブに添付ファイルを保存
        }

        /* チャットワークに送るBodyを生成 */
        var mRvd = Moment.moment(myMessages[i][j].getDate()); //送信日時をmomentで取得

        var strBody = "";
        strBody += "[info][title]メール添付ファイル保存のお知らせ " + mRvd.format('YYYY/MM/DD HH:mm') + "[/title]";
        strBody += "件名:" + myMessages[i][j].getSubject() + "n";
        strBody += "送信元: " + myMessages[i][j].getFrom() +"n";
        strBody += "ファイル名: " + attachments[k].getName() +"n";
        strBody += "[hr]";
        strBody += file.getUrl(); //ドライブURL
        strBody += "[/info]";

        sendMessage(strBody);

        myMessages[i][j].star(); //処理済みのメッセージにスターする
      }
    }
  }
}

ちょっと長くなりましたが、一つずつ積み重ねていけばクリアできるはず…!

チャットワークへの通知結果

上記を実行すると、Googleドライブに対象ファイルが保存された上で、以下のような通知がチャットワークに送られます。

GASで添付ファイル保存の通知をチャットワークに送った結果

対象となるメッセージと添付ファイルについての情報と、そのファイルへのリンクがひとまとまりで通知されます。

リンクを踏めば、そのファイルがすぐに確認できますので便利ですよ!

まとめ

以上、GASでメールの添付ファイルのGoogleドライブ保存をチャットワークに通知する方法でした。

今回、新たに紹介したのはGoogleドライブ内のファイルURLを取得するgetUrlメソッドでした。

その他は、ほぼ過去に紹介したテクニックを組み合わせることで構成することができました。

メールの添付ファイルをGoogleドライブに保存するツールについては、これにて完成とさせて頂きます。

また、便利なツールがありましたら紹介していきますので、どうぞお楽しみに!

連載目次:GASでGoogleドライブを操作してメール添付を自動保存

メールの添付ファイルをGoogleドライブに自動保存するツールを題材として、Google Apps ScriptでGoogleドライブを操作する方法についてお伝えするシリーズです。
  1. Google Apps ScriptでGoogleドライブを操作する最も簡単なスクリプト
  2. Google Apps ScriptでGoolgeドライブのフォルダ内にファイルを作成する方法
  3. Google Apps ScriptでGmailの添付ファイルをGoogleドライブに保存する
タイトルとURLをコピーしました