【GAS】Google Apps Scriptで約定通知メールをGmailからGoogle Spread Sheetに取り込む【3】
前回やったこと
前回は、メール本文から必要な情報を取り出し、slice()を使って不要な部分を切り取りました。
今回やりたいこと
スプレッドシートに情報を追加し、追加済みのメールに「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);
});
});
}
実行してみます。
いい感じですね。検索上限を開放してみます。
すると、エラーが発生しました。
しばらくしてから試せとのことなので、少ししてもう一回やってみたらまた同じエラーで止まりました。
ただ一応スプレッドシートに追加して、「done」のラベルをつけることはできているので、今年の分全部取り込むまでは繰り返しやってみます。
全部取り込めました。全部取り込めたんですがよくみると、6行目と7行目は同じデータです。他にも同様に同じデータが取り込まれて実際の数より多くなっています。これではいけないので、重複した行を削除するようにしたいと思います。
重複した行を削除する
myFunctionの外に新しく関数を作ります。
そこで、removeDuplicates()で重複した行を削除します。
//重複削除するコード
function removeDouble(){
//範囲を指定する
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("data");
var range = sheet.getRange("A:F");
//重複行を削除する
range.removeDuplicates();
}
この関数を実行すると、重複した行の削除はできたのですが、今度は実際のメールの数より少なくなってしまいました。
調べてみると、複数ポジションを所持していて同時に決済すると、データ(日時や価格など)が同じになっていました。
なので、メールの件名の注文番号も取得して行に追加したいと思いますが、長くなりそうなので、今回はここまでにしたいと思います。
それではまた次回!
この記事が気に入ったらサポートをしてみませんか?