
photo credit: CAF Wings Over Dallas IMG_5215_1_2016WOD_Gunfighter_KevinHong via photopin (license)
みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Google Apps Scriptで特定のメールの添付ファイルをGoogleドライブに保存するツールを作成しています。
前回はこちらの記事です。

重複して同じメッセージについて処理を行わないために、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関数を拝借しましょう。
この部分のスクリプトはこちらです。
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の受信日時は
で取得できますが、そのままチャットワークに送ると
という、我々日本人には見慣れないフォーマットになってしまいます。

そのために、日時の取り扱いがとっても便利になるmoment.jsライブラリを使います。
momentオブジェクトの生成および書式の設定はそれぞれ
とします。今回、書式としては一般的な「YYYY/MM/DD HH:mm」を使用したいと思います。


ということで、チャットワークに送るテキストの冒頭の部分はこのようにすれば良いですね。
/* チャットワークに送るBodyを生成 */
var mRvd = Moment.moment(myMessages[i][j].getDate()); //送信日時をmomentで取得
var strBody = "";
strBody += "[info][title]メール添付ファイル保存のお知らせ " + mRvd.format('YYYY/MM/DD HH:mm') + "[/title]";
メッセージの件名、送信元、添付ファイル名を取得する
続いて、メッセージの件名と送信元を取得します。
その場合はそれぞれ以下のようにすればOKです。

また、添付ファイルのファイル名は、getNameメソッドで取得します。
以上を踏まえて、チャットワークに送るテキストを生成する処理に以下を追加します。
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オブジェクトはどうやって取得すれば良いんだという話ですが、実は冒頭のベースとなるスクリプトの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でメールの添付ファイルのGoogleドライブ保存をチャットワークに通知する方法でした。
今回、新たに紹介したのはGoogleドライブ内のファイルURLを取得するgetUrlメソッドでした。
その他は、ほぼ過去に紹介したテクニックを組み合わせることで構成することができました。
メールの添付ファイルをGoogleドライブに保存するツールについては、これにて完成とさせて頂きます。
また、便利なツールがありましたら紹介していきますので、どうぞお楽しみに!
 
  
  
  
  

