テレビ局員の独学プログラム

ともきちの日曜プログラムとガジェット

最近プログラムにはまっているので、はてなブログもやってみる。プログラムは完全独学なのでいろいろご愛嬌。

Gmailの添付ファイルをDropboxに保存する

前回、Gmailの添付ファイルをgoogle driveに保存したが、今回はなぜかDropboxに保存する。
やろうとする人がいないと思うので、GASからDropbox APIを操作する記事が見当たらなかったので苦労した。

Dropbox APIのアプリを作成する

Dropboxに外部からアクセスするには、 Dropbox APIのアプリを作成する必要がある。
Dropbox APIのアプリを作成するには、Dropbox developersに登録する必要があるがそれは割愛

  1. https://www.dropbox.com/developersへアクセスして、「app console」をクリック
  2. アカウントを持っている場合はログイン
  3. My appsが表示されるので、「Create app」をクリック
  4. 今回は「Dropbox API」「App folder」を選択(既存フォルダにアクセスした場合は「Full Dropbox」で作成する必要あり)名前をつけて「Create app」をクリック
  5. Generated access tokenの「Generate」をクリック

これでとりあえず、外部からアクセス可能

コマンドを確認する

https://dropbox.github.io/dropbox-api-v2-explorer/APIの動きやコマンドを確認することができる

リストを取得する

まずは試しに、dropboxないのリストを取得してみる

  1. 左のリストから「list_folder」を探してクリック
  2. 先ほど取得したAccess Tokenを「Access Token」に貼り付けて、「Submit Call」をクリック。ResponseがJSON形式で帰ってくる。list_folderと言いつつ、ファイルも返ってくる。
  3. フォルダを指定した場合は「path」に「/testfoler」と指定する
  4. サブフォルダまで探す場合は「list_folder/continue」を使うみたいだが、今回はスルー
  5. 「Show Code」をクリックすると、サンプルコマンドが表示される。

HTTP POSTする際のheaderやparameterの書き方の参考にするため、よく見ておく

ファイルをアップロードする
  1. 次は左のリストから「upload」を探してクリック
  2. 今度は先ほどと同じAccess Tokenがすでに入っているので、Access Tokenの入力はなし
  3. 「File to upload」でアップしたファイルを選択。「path」に「/up_testfile.txt」と入力(アップロードは必ずファイル名を入力する必要がある。めんどくさい)
  4. 「mode」は「overwrite」を選択。(未選択で同名のファイルがある場合はエラーになる。「add」は別名保存、「update」は既存ファイルをリネームっぽい)
  5. 「Submit Call」をクリックすると、ResponseがJSON形式で帰ってくる。
  6. こちらも「Show Code」して、中身をよく見る。ふむふむ

list_folderとはいくつか違うので注意が必要。最初気付かず、しばらくはまった。。

  • アクセスURLが違う
  • headerにDropbox-API-Argが必要。Dropbox-API-ArgはJSON形式に注意。
  • parameterはファイルをそのまま書くだけ

GASからHTTPリクエストを送る

動きがなんとなく確認できたら、GASからリクエストを送っていく。GASでHTTPリクエストする際はUrlFetchApp.fetchを使用。

リストを取得する
function get_dbxList(Appkey,path) {
/*
dropboxのフォルダ・ファイルリストを取得する
rootを指定する場合はpathに””を指定
*/

  return UrlFetchApp.fetch(
    "https://api.dropboxapi.com/2/files/list_folder",
    {
      "method" : "post",
      "headers" : {
        "Authorization" :"Bearer " + Appkey,
        "Content-Type" : "application/json"
      },
      'payload' : JSON.stringify({
        "path" : path
      }),
      "muteHttpExceptions" : false
    }
  );
}

ファイルをアップロードする
function upload_dbx(Appkey,src,dest) 
{
/*
dropboxにファイルをアップロードする
rootにアップする場合もファイル名を必ず指定する必要あり
*/

  return UrlFetchApp.fetch(
    "https://content.dropboxapi.com/2/files/upload",
    {
      "method" : "post",
      "headers" : {
        "Authorization" :"Bearer " + Appkey,
        "Content-Type" : "application/octet-stream",
        "Dropbox-API-Arg" : "{\"path\":\"" + dest + "\",\"mode\":{\".tag\":\"overwrite\"}}"
      },
      // Convert the JavaScript object to a JSON string.
      'payload' : src ,
      "muteHttpExceptions" : false
    }
  );
}

Gmailの添付ファイルをDropboxに保存する

ここまでくれば、前回の記事と組み合わせるだけ。


mtomo661.hatenablog.jp


dropboxは保存するファイル名を必ず指定する必要があるので
取得した添付ファイルのファイル名を取得して、アップロードする際に使う。

function Attachment_to_dbx() {
  
Appkey = ”dropboxのアクセストークン”  
 
  //昨日の日付計算(検索条件用)
  var now = new Date();
  var yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);  
  yesterday = Utilities.formatDate(yesterday, "JST", "yyyy/MM/dd");
    
  //検索条件設定(Gmail で使用できる検索演算子 参照)
  var condition;
  condition  = " is:unread"  //未読
  condition += " has:attachment";  //添付あり
  condition += " after:" + yesterday;  //今日(昨日より後)
//  condition += " subject:添付やで";  //件名
//  condition += " from:hogehoge@じーめーる"
    
  //条件でメール検索
  var search_mail = GmailApp.search(condition);
  //検索したメールをスレッドで取得(二次配列)
  var messeges = GmailApp.getMessagesForThreads(search_mail);

  //スレッド数ループ
  for(var i = 0; i < messeges.length; i++) {
    //スレッドの中身数ループ
    for(var j = 0; j < messeges[i].length; j++) {
      //添付ファイル取得(一次配列)
      var attach = messeges[i][j].getAttachments();
      //添付ファイル数ループ
      for(var k = 0; k < attach.length; k++){
       //添付ファイルのファイル名取得
        fileName = attach[k].getName()
        Logger.log(fileName)
        //添付ファイル保存
        src = attach[k]
        dest = "/" + fileName
        upload_dbx(Appkey, src, dest) 
      }
    }
    //スレッドが終わったら、既読に
    messeges[i][0].markRead();
  }
}

あとは、前回同様、定期実行設定すれば自動保存されていく。
以上、なぜかGmailの添付ファイルがgoogledriveではなくDropboxに保存する方法。