Google Apps ScriptでMobageの課金状況を確認する

More than 3 years have passed since last update.


図に乗ってMobageに課金してたら、「今どれくらい投資しているのか」が気になった。

技術的には新しい内容ではありません。あくまでも、AppsScriptの事例ということで…。


使うもの(必要知識)


  • GmailApp

  • SpreadsheetApp

  • ライブラリの追加

  • moment.js


ライブラリの追加

Moment.jsのAppsScript移植版ライブラリがあるのでライブラリに追加します。(キー:MHMchiX6c1bwSqGM1PZiW_PxhMjh3Sh48)

momentjs.png


最初のプログラム(仕様)


  1. Gmailに届く、件名が「Google Playのご注文明細」を含むメールを検索する。

  2. そのメール本文には、課金した金額が書かれているので、その金額を抜き出す。

  3. Spreadsheetに書き出し、sum()で集計して確認する。

  4. 月ごとの集計とかは、考えない。ひとまず今までの合計を。


コード.gs

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回で済みます。

権限のリクエスト_GmailApp.png

承認_SpreadsheetApp.png


実行

実行時間は、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/