Gmailの添付ファイルをDropboxに保存する
前回、Gmailの添付ファイルをgoogle driveに保存したが、今回はなぜかDropboxに保存する。
やろうとする人がいないと思うので、GASからDropbox APIを操作する記事が見当たらなかったので苦労した。
Dropbox APIのアプリを作成する
Dropboxに外部からアクセスするには、 Dropbox APIのアプリを作成する必要がある。
Dropbox APIのアプリを作成するには、Dropbox developersに登録する必要があるがそれは割愛
- https://www.dropbox.com/developersへアクセスして、「app console」をクリック
- アカウントを持っている場合はログイン
- My appsが表示されるので、「Create app」をクリック
- 今回は「Dropbox API」「App folder」を選択(既存フォルダにアクセスした場合は「Full Dropbox」で作成する必要あり)名前をつけて「Create app」をクリック
- Generated access tokenの「Generate」をクリック
これでとりあえず、外部からアクセス可能
コマンドを確認する
https://dropbox.github.io/dropbox-api-v2-explorer/でAPIの動きやコマンドを確認することができる
リストを取得する
まずは試しに、dropboxないのリストを取得してみる
- 左のリストから「list_folder」を探してクリック
- 先ほど取得したAccess Tokenを「Access Token」に貼り付けて、「Submit Call」をクリック。ResponseがJSON形式で帰ってくる。list_folderと言いつつ、ファイルも返ってくる。
- フォルダを指定した場合は「path」に「/testfoler」と指定する
- サブフォルダまで探す場合は「list_folder/continue」を使うみたいだが、今回はスルー
- 「Show Code」をクリックすると、サンプルコマンドが表示される。
HTTP POSTする際のheaderやparameterの書き方の参考にするため、よく見ておく
ファイルをアップロードする
- 次は左のリストから「upload」を探してクリック
- 今度は先ほどと同じAccess Tokenがすでに入っているので、Access Tokenの入力はなし
- 「File to upload」でアップしたファイルを選択。「path」に「/up_testfile.txt」と入力(アップロードは必ずファイル名を入力する必要がある。めんどくさい)
- 「mode」は「overwrite」を選択。(未選択で同名のファイルがある場合はエラーになる。「add」は別名保存、「update」は既存ファイルをリネームっぽい)
- 「Submit Call」をクリックすると、ResponseがJSON形式で帰ってくる。
- こちらも「Show Code」して、中身をよく見る。ふむふむ
list_folderとはいくつか違うので注意が必要。最初気付かず、しばらくはまった。。
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に保存する
ここまでくれば、前回の記事と組み合わせるだけ。
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に保存する方法。