図に乗ってMobageに課金してたら、「今どれくらい投資しているのか」が気になった。
技術的には新しい内容ではありません。あくまでも、AppsScriptの事例ということで…。
使うもの(必要知識)
- GmailApp
- SpreadsheetApp
- ライブラリの追加
- moment.js
ライブラリの追加
Moment.jsのAppsScript移植版ライブラリがあるのでライブラリに追加します。(キー:MHMchiX6c1bwSqGM1PZiW_PxhMjh3Sh48)
最初のプログラム(仕様)
- Gmailに届く、件名が「Google Playのご注文明細」を含むメールを検索する。
- そのメール本文には、課金した金額が書かれているので、その金額を抜き出す。
- Spreadsheetに書き出し、sum()で集計して確認する。
- 月ごとの集計とかは、考えない。ひとまず今までの合計を。
function myFunction() {
var moment = Moment.load();
var startTime = moment();
var data = [];
var th = GmailApp.search("subject: Google Playのご注文明細");
for(var i = 0; i < th.length; i++) {
var messages = th[i].getMessages();
for(var j = 0; j < messages.length; j++) {
var message = messages[j].getPlainBody();
if( message != null) {
if(message.indexOf('株式会社ディー・エヌ・エー') >= 0) {
var start = message.indexOf('合計:'); // "合計:"と書かれた位置を検索。
var end = message.indexOf('(', start); // 次の(までの位置を取得。
if( start >= 0 && end >= 0) {
var rows = [];
var date = messages[j].getDate();
var sum = message.substring(start, end).match(/\d/g).join(""); // "合計:"の次に金額が書かれている。
rows.push(date);
rows.push(sum);
data.push(rows);
}
}
}
}
}
var ss = SpreadsheetApp.getActive();
ss.getRange("A:E").clearContent(); // A行からE行までを全てクリア
var range = "A1" + ":" + "B" + data.length;
ss.getRange(range).setValues(data);
ss.getRange("C1").setValue("投資金額");
ss.getRange("D1").setFormula("sum(B1:B" + data.length + ")");
ss.getRange("E1").setValue(moment().diff(startTime));
}
承認をする。
2つに分かれていますが、サンプルコードを貼り付けたら1回で済みます。
実行
実行時間は、55件のメール(幾つか、スレッド内にメールが複数ある)で162秒程度かかっていました。
これは遅い!
遅いのでチューニングしよう。
と、思ったのですが、JavaScriptのindexOf()、search()を比べると、indexOf()が一番早いということなので、変えられず、DeNA以外の購入通知も届くので、メールごとに微妙に文字位置も変わってしまうので、最初の1回だけ読みだして…。というわけにもいかず。
もし、興味が湧いたら、速度向上のチューニングに挑戦してみてください。
結論
課金はほどほどに…。
Disclaimer
- Google Playから送られてくる課金通知のフォーマットが変わったらプログラムは使い物にならなくなります。
- この記事は個人的なものです。私の雇用者とは全く関係はありません。(一応つけておきます)
参考資料
https://support.google.com/mail/answer/7190?hl=ja
http://catprogram.hatenablog.com/entry/2013/05/13/231457
http://qiita.com/FiNGAHOLiC/items/d80641251aff8f2d135a
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf
https://plus.google.com/+EricKoleda/posts/ThnVjUgU3E9
http://momentjs.com/docs/#/displaying/difference/