Edited at

DB無しでゲームへランキング機能を実装する方法


自分で作ったゲームにランキング機能を追加したい……

プレイヤーの競争心を刺激してより沢山プレイしてもらう為に、ランキング機能を追加したい。

こう思った時、データをRDBMSに保存する方法ならそれぞれのRANK関数を使えば実現できる。

しかしDBを建てるのって正直面倒……:rolling_eyes:

DB無しでランキング機能を実装する事は出来ないだろうか。


GAS×スプレッドシート×RANK関数で実現する。

で、考えついたのがこれ。

仕組みとしてはGASで作ったWebアプリケーションへゲーム側からリクエストを送り、

GAS側でスプレッドシートを操作、スプレッドシートに組み込まれているRANK関数の結果を返す。


実装手順


①スプレッドシートを作成

ドライブからスプレッドシートを作成する。


②スクリプトを追加

作成したスプレッドシートの上部にある「ツール」から「スクリプトエディタ」を押下する。


③アプリケーション実装

var funcStr = "=RANK({0},A:A,0)"

function doGet(e){
var result = {};
//パラメータがある時だけ処理する
if(e.parameter.score != undefined){
//スプレッドシートを取得
//①、②で作ったらこの取得方法じゃなくても良い。
var spreadSheet = SpreadsheetApp.openById("[スプレッドシートID]");
var sheet = spreadSheet.getSheetByName("[シート名]");

//スコアパラメータの取得
var score = e.parameter.score;
//スプレッドシートに追加
sheet.appendRow(new Array(score));

//最低スコアの順位を母数ににする
//当該セルにRANK(MIN(列),列,0)を設定しておく
var totalRow = sheet.getRange("B2").getValue();

  //RANK関数をセルに設定
var funcCell = sheet.getRange("B1");
funcCell.setFormula(funcStr.replace("{0}",score));
//結果を取得
var rank = funcCell.getValue();

result.rank = rank + "/" + totalRow;
}else{
result.rank = "取得失敗...ごめん";
}
//jsonでレスポンス
return ContentService.createTextOutput(JSON.stringify(result));
}


④webアプリケーションとして公開

最後にこれをWebアプリケーションとして公開する。


ただし……

ただしこの方法では、同タイミングでランキング取得されると、RANK結果の取得がズレる可能性がある。

厳密にやるなら、追加中か否かのチェック機構が必要なので、注意。

しかし厳密にやるなら、DB使った方が安心な気が……


まとめ

これでDB無しでゲームにランキング機能を(一応)実装する事が可能。