Gmailの添付ファイルをGoogleドライブに自動保存する

普段研究関連で利用している学内メールからGmailに転送するようにしており、添付ファイルをAndroid端末でもみたい。 だけど、大体送られてくるのがdocxだったりpptxだったりするので、手持ちの端末にそれらを開くアプリを入れてないため、見られない。 以前まではInboxアプリで開いたファイルを、そのままGoogleドライブのアプリで開けたような気がする(※気がする)けども、今では「表示するアプリが見つかりません」って出て終わるようになったため、とりあえず対応するためにGoogle Apps Scriptで作りました。

単純に受信トレイのメールを確認して、保存するフォルダに同名のファイルがなければ保存するだけです。ざっとリファレンスを眺めた感じ、特定フォルダ内の検索はできないっぽかったので、全フォルダ内の名前検索をして、得られたファイル一覧の親フォルダを判定しています。

保存したいフォルダのIDはドライブでそのフォルダを開いた時のURLの最後の部分です。Gmail受信をトリガーとして実行はできないので、5分毎に実行するようにしています。

function attachmentUploader() {
  var threads = GmailApp.getInboxThreads();
  var msgs = GmailApp.getMessagesForThreads(threads);
  for (var i = 0; i < msgs.length; i++) {
    for (var j = 0; j < msgs[i].length; j++) {
      var attachments = msgs[i][j].getAttachments();
      saveToGmailFolder(attachments);
    }
  }
}

function isInGmailFolder(name) {
  var files = DriveApp.getFilesByName(name);
  while (files.hasNext()) {
    var file = files.next();
    var folders = file.getParents();
    while (folders.hasNext()) {
      var folder = folders.next();
      if (folder.getId() === '保存したいフォルダのID') {
        return true;
      }
    }
  }
  return false;
}

function saveToGmailFolder(attachments) {
  var folder = DriveApp.getFolderById('保存したいフォルダのID');
  for (var i = 0; i < attachments.length; i++) {
    if (!isInGmailFolder(attachments[i].getName())) {
      var data = DriveApp.createFile(attachments[i]);
      folder.addFile(data);
    }
  }
}