雪降って地固まる

Dota 2に関する内容を中心に扱います

Google SpreadsheetとApps Scriptを使ってMMRを記録し公開する

毎日のSolo MMRの推移をGoogle Spreadsheetで記録してみましょう。

前提条件として、YaspMMRが表示されている必要があります(Dotaのプロフィール上に表示していれば、Yaspに登録していなくてもMMRが表示されるはずです)。

1. 記録用シートの作成

まず、Google Spreadsheetで記録用のシートを作成します。このシートは一切編集しないでください。

2. MMRを記録するスクリプトの作成

次に、先ほど作ったシートを開いている状態で、ツール→スクリプトエディタからスクリプトエディタを開き、以下の内容を貼り付けます。その際、2箇所変更が必要な箇所があるので、注意してください。

function myFunction(){
  var currentDate = new Date();
  // [要変更1] MMRを記録するためのシートのURLを入力する(gidの部分まで必要)
  var url = "https://docs.google.com/spreadsheets/d/**********/edit#gid=0";
  var spreadsheet = SpreadsheetApp.openByUrl(url);

  var sheet = spreadsheet.getSheets()[0];
  
  // [要変更2] あなたのFriend IDに書き換える
  var soloMMR = getSoloMMR("85275184");
  
  if (soloMMR) {
    sheet.appendRow([
      Utilities.formatDate(currentDate, "JST", "yyyy-MM-dd"),
      soloMMR
    ]);
  }
  else {
    var retryInterval = 5; // minutes
    if (currentDate.getMinutes() < 60 - retryInterval && currentDate.getHours() < 23) {
      ScriptApp.newTrigger("myFunction").timeBased().after(1000 * 60 * retryInterval).create();
    }
    else {
      sheet.appendRow([
        Utilities.formatDate(currentDate, "JST", "yyyy-MM-dd"),
        "N/A"
      ]);
    }
  }
}

function getSoloMMR(playerID) {
  try {
    var html = UrlFetchApp.fetch('https://yasp.co/players/' + playerID).getContentText();
    return html.match(/<small style="margin-left:.5em">(\d+)<\/small>/)[1];
  } catch (e) {
    return null;
  }
}  

3. スクリプトの動作確認

手動で実行(再生アイコンのボタン)して動作を確認します。正常に動いている場合、スプレッドシートに最新のMMRが追加されるはずです。もし実行ボタンが押せない場合は、"関数を選択"部分がmyFunctionになっているか確かめてみてください。

アクセス権限の許可を求められた場合は、内容をよく確認した上で、同意しましょう(スプレッドシートを読み込む許可と外部のURLを開く許可を求められるはずです)。

4. 自動実行の設定をする

"現在のプロジェクトのトリガー"(時計アイコン)をクリックしてスクリプトの自動実行を設定しましょう。

f:id:d2yukidaruman:20160518162240p:plain
毎日のMMRを記録する目的から、一日の終わりごろに実行する設定にするとよいでしょう。

5. 表示用のシートを作成する

シートを追加してデータを表示したいセル(見出しを付けない場合はA1、見出しを付ける場合はB1)に
=query('シート1'!A:B, "select A, B ORDER BY A DESC LIMIT 7")
と入力すれば最新の7件を表示するようにできます。もし14日分表示したい場合は7の部分を14に変えると良いでしょう。Query文を編集して細かい条件を指定したい場合は、ドキュメントを参照してください。

f:id:d2yukidaruman:20160518162842p:plain
9日分のデータが記録されたシート

f:id:d2yukidaruman:20160518162848p:plain
身だし付きの表の例

6. シートを公開する

f:id:d2yukidaruman:20160518211048p:plain

最後に、公開用シートを誰でも見られるようにするため、ファイル→ウェブに公開→埋め込むから公開したいシートを指定して公開しましょう。

完成例

サイズ・スタイルは必要に応じて調節してください(デフォルトではセルの横幅が100px、縦幅が20pxですので、widthの部分は(横幅+1)*2=202px、heightの部分は(縦幅+1)*表示行数=168pxにする*1とうまく収まるはずです)。

<iframe src="https://docs.google.com/spreadsheets/d/*******/pubhtml?chrome=false" style="width: 202px; height: 168px;"></iframe>

補足

  • f:id:d2yukidaruman:20160518160915p:plain
    自分のフレンドIDがわからない場合、プロフィールを開いての赤線の部分にある数字を確認してください。
  • 公開用URLの最後に &chrome=false とつけるとヘッダー/フッターが消えてすっきりします。
  • Yaspにつながらない場合は自動的にリトライし、日付が変わるタイミングまで取得できない場合はN/Aという値が保存されます。
  • 公開用のurlのpubhtmlの部分をexport?format=csv[任意のフォーマット]とするとCSV[任意のフォーマット]でエクスポートすることができます。
  • 正規表現MMRを取得しているのでYASPのHTMLのフォーマットが変わった途端に動かなくなることが予測されます…。

おまけ

Hello I'm Snith, voting my 51620th vote on Chen.

http://images.akamai.steamusercontent.com/ugc/447358656218019965/5858684CC8A4F10C3262E2574C05FB0BCBC73615/

*1:+1という数字はCSSのbox-sizingの仕様とSpreadsheetの罫線の位置に由来するもの