Gmailの画像をGASでGoogleドライブに保存

# やりたいこと
Gmailに届いたメールの画像をいちいち保存するのがめんどくさいことありますよね。例えば乃木坂46のモバイルメールをメンバーごとに違うフォルダに保存したり毎日欠かさず保存したりするのは結構大変です。なので，今回はそれをGAS(Google App Script)を使って自動化します。
#GASでGmailの画像をGoogleドライブにアップロード
まずは，手動（実行は自分でする）でGmailで受信したメールの画像ファイルをGASを使ってGoogleドライブにアップロードするスクリプトを作ります。

# 手順
1. Gmailから特定の人物（ここでは阪口珠美や梅澤美波）から約1日以内に来たメールを取得
2. メールから画像のURLやタイトル・本文を取得
3. 画像ファイルをGoogleドライブにアップロード


## スクリプト
```bash

function tamami() {
  var fol = DriveApp.getFolderById('folder id'); #https://drive.google.com/drive/folders/{この部分}
  var thds = GmailApp.search("from:nogizaka46-tamami_sakaguchi@m.nogizaka46.com newer_than:1d", 0, 20);#メールアドレスを指定。1日以内のものを取得，20はスレッド数，一日当たりのメールが多い場合は大きめに設定。
  var messe = GmailApp.getMessagesForThreads(thds);
  for(var i = 0; i < messe.length; i++) {
    for(var j = 0; j < messe[i].length; j++) {
      var body　=　messe[i][j].getBody();
      var myRegexp = /src="([\s\S]*?)">/g;#正規表現でURLを抽出。この当たりはメールによりけり。
      urls = body.match(myRegexp);
      if(urls) {
          for(var k = 0; k < urls.length; k++ ) {
             url = urls[k].slice(5,-2)#ここも環境により異なります
             email_body = messe[i][j].getPlainBody()#メール本文
             var fileName = email_body.slice(0,15) + String(k) + '.jpg';#メール本文の一部をファイル名に使用。（タイトルは常に”たまみより”なので）
             try {
               var response = UrlFetchApp.fetch(url);
               var fileBlob = response.getBlob().setName(fileName);
               new_file = fol.createFile(fileBlob);
               new_file.setDescription(email_body);#ファイルの情報にメールの本文を追加。
             }catch(e){
               Logger.log(e);
             }
          }
      }
    }
  }
}


```

これをGAS上で実行するとGoogleドライブ上に画像ファイルが保存されます。

## [追記1]ファイル名に日付を使いたい場合
ファイル名の部分を以下のように変更

```bash
receive_date = Utilities.formatDate(messe[i][j].getDate(), "JST", 'yyyy/MM/dd-HH:mm');
var fileName = receive_date + String(k) + '.jpg';

```


## [追記2] デコメーラーの場合
高山一実や齋藤飛鳥などのメンバーでも保存できる方法が見つかったので追記します。
~~上記メインスクリプトのtry部分を書き換えます。~~
URLの検出ロジックが変わるので関数全部を載せておきます。
URLの書き換えとCookie利用することによってオリジナルの高画質画像にアクセスできるようになります。

```bash
 function asuka() {
  var fol = DriveApp.getFolderById('folder id'); 
  var thds = GmailApp.search("from:nogizaka46-asuka_saito@m.nogizaka46.com newer_than:1d", 0, 20);
  var messe = GmailApp.getMessagesForThreads(thds);
  for(var i = 0; i < messe.length; i++) {
    for(var j = 0; j < messe[i].length; j++) {
      var body　=　messe[i][j].getBody();
      var myRegexp = /href="([\s\S]*?)">/g;
      urls = body.match(myRegexp);
      //画像が複数枚あるので
      if(urls) {
          for(var k = 0; k < urls.length; k++ ) {
             url = urls[k].slice(6,-2)
             email_body = messe[i][j].getPlainBody()
             var fileName = messe[i][j].getSubject() + String(k) + '.jpg';
             try {
                 var response = UrlFetchApp.fetch(url);
                 var srcReg = /src="([\s\S]*?)"/;
                 srcurl = response.getContentText().match(srcReg)[0];
                 vurl = 'http://dcimg.awalker.jp/v' + srcurl.slice(7,-1);
                 iurl = 'dcimg.awalker.jp' + srcurl.slice(5,-1);                 
                 response =  UrlFetchApp.fetch(vurl);
                 var cookies = response.getHeaders()["Set-Cookie"];
 
               // ログインで認証されたcookieはヘッダーで使用
               var headers = { 'Cookie' : cookies };
               options = {
                 method : "get",
                 headers : headers,
                 followRedirects: false, //リダイレクトあり
               };
                response =  UrlFetchApp.fetch(iurl, options);
                var fileBlob = response.getBlob().setName(fileName);
                new_file = fol.createFile(fileBlob);
                new_file.setDescription(email_body);

             }catch(e){
               Logger.log(e);
             }
          }
      }
    }
  }
}
```


#スクリプトを定期実行
あとは上のスクリプトを定期的に自動で実行させるだけです。そのためには，GASのトリガーという機能を使います。
GASのメニューから「編集→現在のプロジェクトのトリガー」をクリック。
遷移先のページで「トリガーを追加」をクリック。
トリガーを次のように設定（ここではメールが22時以降にくることはあまりないので22時に定期実行としています）
<img width="671" alt="スクリーンショット 2019-07-08 20.20.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60236/06e4c50a-96c0-b328-5d66-fa0d0338ed16.png">

#まとめ
GASを使ってGmailの画像ファイルを自動でGoogleドライブに保存することができました。命名などは好きなように変更していただくと良いと思います。これで乃木坂ライフが少し豊かになりましたね。



## 参考サイト
[GASで正規表現](https://tonari-it.com/scraping-javascript-gas-phantomjscloud-regexp/)
[ファイル保存](https://a-zumi.net/google-apps-script-image-download-save-google-drive/)
[定期実行](https://tonari-it.com/gas-trigger-set/)

###似たような記事
自分とほぼ同じことを考えていた人がいるようです。
こちらの記事は真面目に書いてありますので参考にどうぞ。
https://qiita.com/nirs_kd56/items/590756d9dcd89b7e0cd4

##[エラー]その操作を実行するには承認が必要です
定期実行を設定後一定期間経つとこのようなエラーが出る（メールが来ます）場合があるようです。
その場合はスクリプトの編集ページから関数→関数を実行を押してください。アクセスを許可するようなダイアログが出るのでそれを許可すれば再度自動実行が可能になります。