【GAS】Google Apps Scriptで約定通知メールをGmailからGoogle Spread Sheetに取り込む【3】

前回やったこと

前回は、メール本文から必要な情報を取り出し、slice()を使って不要な部分を切り取りました。

画像1


今回やりたいこと

スプレッドシートに情報を追加し、追加済みのメールに「done」のラベルを追加する。


スプレッドシートに入力する

まずは、追加するシートと行を取得します。

getLastRow()で現在入力されている最後の行を取得し、そこに1行足すことで、下へ下へ追加していくことができます。

// データを書き込むシートを取得
var sheet = SpreadsheetApp.getActive().getSheetByName('data');
    
// データを書き込む行を取得
var lastRow = sheet.getLastRow() + 1;


次に、追加するセルを取得して値を入力します。

getRange(行番号,列番号)で、追加するセルを取得し、setValue()で値を入力します。

// データを書き込むセルを取得して値を入力
sheet.getRange(lastRow, 1).setValue(executionTime);
sheet.getRange(lastRow, 2).setValue(tradingName);
sheet.getRange(lastRow, 3).setValue(transaction);
sheet.getRange(lastRow, 4).setValue(price);
sheet.getRange(lastRow, 5).setValue(amount);
sheet.getRange(lastRow, 6).setValue(classification);


ラベルを追加する

最後に、追加し終わったメールに対して、「done」のラベルを追加します。

// スレッドに処理済みラベルを付ける
var label = GmailApp.getUserLabelByName('alert_master/done');
thread.addLabel(label);


コード全文

以下がコード全文になります。

function myFunction() {
    // スレッド一覧を取得
    var threads = GmailApp.search('label:alert_master -label:alert_master/done subject:[Ose SBI証券]先物・OP約定通知/注文番号',0,1);
    
    // スレッド一覧に含まれる各スレッドを一つずつ取り出す
    threads.forEach(function(thread) {
        // スレッド内のメール一覧を取得
        var messages = thread.getMessages();
        
        // メールを一つずつ取り出す
        messages.forEach(function(message) {
        // メール本文を取得
        var plainBody = message.getPlainBody();
            // メール本文をログに出力して確認
            //Logger.log(plainBody);
            
            // 約定日時を取り出す
            var executionTime = plainBody.match(/[約定日時](.*)/g);
            executionTime = executionTime.toString().slice(5);
            
            // 銘柄を取り出す
            var tradingName = plainBody.match(/[銘柄](.*)/g);
            tradingName = tradingName.toString().slice(3);
            
            // 取引を取り出す
            var transaction = plainBody.match(/[取引](.*)/g);
            transaction = transaction.toString().slice(3);
            
            // 価格を取り出す
            var price = plainBody.match(/[価格](.*)/g);
            price = price.toString().slice(3); 
            
            // 数量を取り出す
            var amount = plainBody.match(/[数量](.*)/g);
            amount = amount.toString().slice(3);
            
            // 立会区分を取り出す
            var classification = plainBody.match(/[立会区分](.*)/g); 
            classification = classification.toString().slice(5);
            
            //Logger.log(executionTime + " " + tradingName + " " + transaction + " " + price + " " + amount + " " + classification);
            
            
            // データを書き込むシートを取得
            var sheet = SpreadsheetApp.getActive().getSheetByName('data');
            
            // データを書き込む行を取得
            var lastRow = sheet.getLastRow() + 1;
            
            // データを書き込むセルを取得して値を入力
            sheet.getRange(lastRow, 1).setValue(executionTime);
            sheet.getRange(lastRow, 2).setValue(tradingName);
            sheet.getRange(lastRow, 3).setValue(transaction);
            sheet.getRange(lastRow, 4).setValue(price);
            sheet.getRange(lastRow, 5).setValue(amount);
            sheet.getRange(lastRow, 6).setValue(classification);
            
            
            // スレッドに処理済みラベルを付ける
            var label = GmailApp.getUserLabelByName('alert_master/done');
            thread.addLabel(label);
            
        });
    });
}

実行してみます。

画像2

いい感じですね。検索上限を開放してみます。

すると、エラーが発生しました。

画像3

しばらくしてから試せとのことなので、少ししてもう一回やってみたらまた同じエラーで止まりました。

ただ一応スプレッドシートに追加して、「done」のラベルをつけることはできているので、今年の分全部取り込むまでは繰り返しやってみます。

画像4

全部取り込めました。全部取り込めたんですがよくみると、6行目と7行目は同じデータです。他にも同様に同じデータが取り込まれて実際の数より多くなっています。これではいけないので、重複した行を削除するようにしたいと思います。

重複した行を削除する

myFunctionの外に新しく関数を作ります。

そこで、removeDuplicates()で重複した行を削除します。

//重複削除するコード
function removeDouble(){
 //範囲を指定する
 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data");
 var range = sheet.getRange("A:F");
 
 //重複行を削除する
 range.removeDuplicates();
}

この関数を実行すると、重複した行の削除はできたのですが、今度は実際のメールの数より少なくなってしまいました。

調べてみると、複数ポジションを所持していて同時に決済すると、データ(日時や価格など)が同じになっていました。

なので、メールの件名の注文番号も取得して行に追加したいと思いますが、長くなりそうなので、今回はここまでにしたいと思います。

それではまた次回!


この記事が気に入ったらサポートをしてみませんか?