hartmannのゲームあれこれ

適当にやってるゲームのあれこれを偶に書きます

WoT CWE管理シート自動化の旅々 10.『2人のGM』

この話から「お約束」の内容は内輪ネタに近い内容が多いので注意

CWEも終わり、リアルの方も落ち着いてきたので更新再開します。

これの続き ts-hartmann.hatenablog.com

お約束1

はんどさん「ずいぶん古いタクですね……なんです?これ」
私「知らん。いつの間にかタクを管理してる場所に貼られていたらしい」
はんどさん「はあ……で、これをどうしろと?」
私「ここから海を越えて西にずっと進んだ先に、のどかな海岸C1ってポジションがあるんだがな……そこでの頭出しの打ち合いに役立つかもって話だ」
はんどさん「はあ……」
私「それを使って勝てばいいんだ。ちょろいだろ?」
はんどさん「えっ……それだけですか?こんなちょろい作業どうしてししょーがやらないんですか?(無茶ぶりだろ)」
私「私はこれからGMだからな」
はんどさん「GM?」
私「戦闘出すぎて疲れてよー」
はんどさん「はあ……(逃げたなてめー)」


私「くれぐれもそのタク以外のことをやるなって話だ。なんか皆の気が狂ってしまうかもな」
はんどさん「あいあいさー!絶対にこのタク以外はやりません!じゃ、行ってきまーす。ふっふぅー!」
私「さてと、じゃあ私もやるとするかな」

やりたいこと

 戦闘ログ取りたい。最終的には戦闘予定表の右側の表に結果を記入したい。

f:id:TS_hartmann:20201218132501p:plain
こういった表を自動で作ってくれれば便利ですよねえ……

戦闘ログを取得する手順

手順1. GAS側の記述

 多分これです。GMから直接データ取ってきてます。5話に書いてあるコードをトリガーにして実行するといいかもしれません。

function getLog() {
 
   //JavaScriptを使ったデータのスクレイピング※phantomjscloudを使用(クランCW戦闘ログの抽出)
 
  const URL = 'https://asia.wargaming.net/globalmap/#clanlog/clanID'; //Grobal Map for world of Tanks clan battle's log(TANOC)
  var key = 'Apikey';
  
  
  var option = 
      {url:URL,
       renderType:"HTML",
       outputAsJson:true};
  var payload = JSON.stringify(option);
  payload = encodeURIComponent(payload);
  var url = "https://phantomjscloud.com/api/browser/v2/"+ key +"/?request=" + payload;                
  var response = UrlFetchApp.fetch(url);
 
  var json = JSON.parse(response.getContentText()); 
  var source = json["content"]["data"];
  
  
  //logファイルにログを書き出す

  var id = "スプレッドシートのid";  
  var spreadSheet = SpreadsheetApp.openById(id);  
  var sheetName = "data_log";
  var str = source;
  var result = str.substr(95000);//n文字以降の文字のみ表示※削除する文字数は各CW・CWEごとに仕様を合わせる
  

  var ary = result.split(/(?=The clan lost a battle against the)|(?=The clan defeated the)/); //The clan lost a battle against theかThe clan defeated theで文字列を区切って配列格納
  var count = ary.length; //配列変数aryの配列数を調べる
  
  Logger.log(result);
  
  spreadSheet.getSheetByName(sheetName).getRange("A1:D1000").clearContent(); //セル内のコンテンツ削除※値や数式
  
  for (var i = 0; i < count; i++) {
  spreadSheet.getSheetByName(sheetName).getRange(i + 1, 1).setValue(ary[i]); //配列変数aryのi+1番目に格納されている値をセルAi+1に入力
  }
  
  logData1();
}

 clanIDには自クランのid、Apikeyには自分のphatomjscloudアカウントのApikeyを、スプレッドシートのidには使用しているスプレッドシートのIDを代入してください。  

手順2. スプレッドシート側の記述

 「data_log」「data_log2」のシートを作成します。それぞれのシートの役割はこんな感じです。

  1. 「data_log」: CW戦闘ログをGMからスクレイピングした内容が書かれているシートです。
  2. 「data_log2」: 「data_log」の内容を見やすいように加工。


 「data_log2」のいくつかのセルに以下のように記入をしてください。

  1. A2セル:=IFERROR(TEXT(TEXT(REGEXEXTRACT(data_log!$A2,"data-role="&CHAR(34)&"time"&CHAR(34)&">(.+?)</span>"),"[hh]:mm")+'Province参照'!$F$1,"[hh]:mm"))
  2. B2セル:=IFERROR(REGEXEXTRACT(data_log!$A2,"data-action="&CHAR(34)&"select-province"&CHAR(34)&">(.+?)</a> province."))
  3. C2セル:=iferror(if(B2="","",query('Province参照'!$A:$D,"select D where C ='"&B2&"'")))
  4. D2セル:=IFERROR(REGEXEXTRACT(data_log!$A2,"> \[(.+?)\]</span>"))
  5. E2セル:=IFERROR(IF(REGEXEXTRACT(data_log!$A2,"(.+?) <span class="&CHAR(34)&"clan-name"&CHAR(34)&">")="The clan lost a battle against the","敗北",IF(REGEXEXTRACT(data_log!A2,"(.+?) <span class="&CHAR(34)&"clan-name"&CHAR(34)&">")="The clan defeated the","勝利","")))


 これで手順は以上となります。これをなんとかして戦闘予定表に記入するのです。

f:id:TS_hartmann:20201214041809p:plain
こんな感じにデータ加工できていれば成功

お約束2

(会議中……)

つるさん「あなた変わりましたよねえ……」
私「別に。まあでも、合流すぐの頃よりは今の関係の方が好きかな。楽だし」
つるさん「ほんとに変わりましたね」
私「お互い(GM管理が)上手くなったってことだろ。さて、日を跨いじまう、急ぐぞ。」
私「?(何かを思い出す)」
私「あのタクティクス……あれは!」
私「今後の予定変更だ!」
つるさん「ちょっとどうしたんです?」
私「のどかな海岸の戦闘に行くぞ!!」
つるさん「もう唐突ですね、相変わらず……待ってくださーい」


 その日、私(ねろさん)はあるマップの指揮をやろうとしていました。そこは私の得意マップで、C1のポジションにおいて頭出しで殴り合い、そのまま決着が着く展開を良く見るチーフの聖地。そう、のどかじゃないマップ「のどかな海岸」です。

ts-hartmann.hatenablog.com

続き