特定のメールを Google Document に保存して、受信日とタイトルと保存先リンクをスプレッドシートに保存をする


タイトルのまんま。

Gmailチェックしろやという話になるんだけど、Google Documentに保存したいなぁという事があったので、人力はしんどい。というわけで、メール内容を`Google Document`に保存して、メールのサブジェクトと受信日をスプレッドシートの特定箇所に追加していくってのを Google App Script にした。

参考
- [特定のラベルが付いたgmailでの受信を自動的にスプレッドシートに記録したい](http://chaika.hatenablog.com/entry/2016/04/15/172404)
- https://developers.google.com/apps-script/reference/document/document
- https://developers.google.com/apps-script/reference/gmail/
- https://developers.google.com/apps-script/reference/spreadsheet/

# スクリプト

Google App Script では `main` 関数しか認識しないはずなので、一日置きとか数時間おき程度に、それを定期実行させます。

```javascript
/**
 * 特定のメールを Google Document に保存して、受信日とタイトルと保存先リンクをスプレッドシートに保存をする
 *
 * (c) a.yasui@gmail.com
 */
var GMAIL_LABEL_NAME = '<ラベル>';
var ATYS_GOOGLE_SPREAD_SHEET_FILE_NAME = '<スプレッドシート名>';
var ATYS_GOOGLE_SPREAD_SHEET_NAME = '<保存するシート名>';

/**
 * Gmail云々
 */
var gmail = function(label){
    this.label = label;
    
    this.getMails = function(){
      var start = 0;
      var max = 500;
      return GmailApp.search('label:' + label + ' is:unread', start, max);
    };
};

/**
 * SpreadSheet をよしなにする
 */
var sheet = function(spread_sheet_name, sheetname){
  var file_name = spread_sheet_name;
  
  
  this.sheet_name = sheetname;
  this.getSheetName = function(){
    return this.sheet_name;
  };
  
  this.spread_sheet = null;
  this.getSpreadSheet = function(){
    return this.spread_sheet;
  };
  
  this.setSpreadSheet = function(sp){ this.spread_sheet = sp; };
  
  // Search file.
  var drive_files = DriveApp.searchFiles('title contains "'+ file_name +'"')
  while(drive_files.hasNext()) {
    var file = drive_files.next();
    Logger.log("find file: " + file.getName());
    var sheet = SpreadsheetApp.open(file);
    
    this.setSpreadSheet(sheet);
    break;
  }
  
  /**
   * コンストラクタで指定したシートの末の行に、A,B,C列それぞれに値を入れる
   *
   * @param string date
   * @param string subject
   * @param string link
   */
  this.add = function(date, subject, link){
    var spread_sheet = this.getSpreadSheet();
    if(!spread_sheet){
        Logger.log("Cannot open the spreadSheet!!");
        return ;
    }
    
    var sheet = spread_sheet.getSheetByName( this.getSheetName() );
    var row = sheet.getLastRow() + 1;
    sheet.getRange("A" + row + ":C"+row).setValues([ [ date, subject, link ] ]);
  };
};


function main(){
    var gmail_messages = new gmail( GMAIL_LABEL_NAME );
    var g_sheet = new sheet( ATYS_GOOGLE_SPREAD_SHEET_FILE_NAME, ATYS_GOOGLE_SPREAD_SHEET_NAME );
    
    var threads = gmail_messages.getMails();
    for( var i in threads) {
        var thread = threads[i];
        var messages = thread.getMessages();
        for ( var j in messages ){
            var message = messages[j];
            if( message.isUnread() ){
                var date = message.getDate();
                var subject = message.getSubject();
                
                // ドキュメントを作成して保存をする
                var doc = DocumentApp.create( subject );
                doc.getBody().setText( message.getRawContent() );
                
                var url = doc.getUrl();
                doc.saveAndClose();
                
                g_sheet.add(date, subject, url);
            }
        }
        
        // 既読にする
        thread.markRead();
        Utilities.sleep(10000);
    }
}
```