hartmannのゲームあれこれ

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

WoT CWE管理シート自動化の旅々 6.『正直者のシート』

ts-hartmann.hatenablog.com

これの続き

はじめに

私「正直者のシート…ですか……見たところ普通のシートですが」
私「とりあえず嘘が書けないかどうか試してみましょう」
私「この表は美しくありませんと書いてみましょう」
私「ゴホン(咳払い)」
私「この表は美しくあり…あr…あ…この表はとても美しい!」
私「おーっ!手が勝手に動いて真実を!嘘が書けないというのは本当のことだったのですね……」

やりたいこと

 CWE中、一々Fame Lookup開いて各クラメンのpoint確認するのめんどい……そうだ!だったらボタン押せば勝手にシートに書いてくれるようにしちゃえばいいじゃない!! ……との考えです。

 元々、私のクランでも戦闘が建っているときにpointを確認するのは困難であったので1日1回、一日の戦闘がすべて終わった夜中2時以降に確認するだけ……っていうのが常でした。
 それが、シートを見るだけで確認できるようになれば便利ですよねえ……

Fame Lookupをスクレイピングする手順

手順1. GAS側の記述
function Scraping8() {

  //FameLookupを取得

  var id = "スプレッドシートのid";  
  var spreadSheet = SpreadsheetApp.openById(id);  
  var sheetName = "名声の街道";
  var cell = spreadSheet.getSheetByName(sheetName).getRange("L4").getValue();
  

  
   //JavaScriptを使ったデータのスクレイピング※phantomjscloudを使用
 
  const URL = cell; //Fame Lookup(TANOC)
  var key = 'phantomjscloudの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"];
  
  
  
  var str = source;
  var result = str.substr(16000);//n文字以降の文字のみ表示
  

   //var ary2 = data.toString();
   var rep = result.replace(/"/g,"");
   var mat = rep.split(/<td class=text-muted row-counter-target>/); 
   var count3 = mat.length; //配列変数aryの配列数を調べる
   Logger.log(mat);
   
   var sheetName2 = "Fame Lookup";
   
   spreadSheet.getSheetByName(sheetName2).getRange("A1:A120").clearContent();//セル内のコンテンツ削除※値や数式
   
   for (var i = 0; i < count3; i++) {
   spreadSheet.getSheetByName(sheetName2).getRange(i + 1, 1).setValue(mat[i]); //配列変数aryのi+1番目に格納されている値をセルAi+1に入力
   }
}

 今回スクレイピングする対象は「Fame Lookup」のページなのですが、このページはjavascriptで書かれています。そのために1話で紹介したphantomjscloudを使ってスクレイピングをするのです。

 使い方が分からないという方は1話を見直してみてください。使い方を紹介している他の人のブログが貼ってあるので。 ts-hartmann.hatenablog.com

 使い方わかってるよーという方は続きをどうぞ……
 スプレッドシートのidには使用しているスプレッドシートのidを、phantomjscloudのApikeyには自分のphantomjscloudアカウントに表示されているApikeyを書いてください。

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

 まず、「Fame Lookup」「名声の街道」の2つのシートを用意します。それぞれのシートの役割はこんな感じです。

  1. 「Fame Lookup」: Fame Lookupからデータをスクレイピングした内容が出力されています。
  2. 「名声の街道」: 「Fame Lookup」に書かれてある内容を見やすい形に加工。


 そして、「名声の街道」のそれぞれのセルに次のように記入します。

  1. B3セル:=IFERROR(REGEXEXTRACT('Fame Lookup'!$A2,"target=_blank>(.+?)</a>"))
  2. C3セル:=IFERROR(VALUE(REGEXEXTRACT('Fame Lookup'!$A2,"<td class=bold sorting_1>(.+?)</td>")))
  3. D3セル:=IFERROR(VALUE(REGEXEXTRACT('Fame Lookup'!$A2,"</td><td>(.+?)</td>")))
  4. E3セル:=IFERROR(VALUE(REGEXEXTRACT('Fame Lookup'!$A2,"<td class=bold>(.+?)</td>")))


 その後、それぞれ下にオートフィルしてください(100行くらい)。

 次は、押したら上にあるコードを起動してくれるボタンを作ります。ボタンの作り方はちらっと2話で紹介しているのですが、とりあえずこちらの解説記事を見てください。

www.atmarkit.co.jp

 こちらの通りにボタンを作成して、「Scraping8」を割り当てればボタンを押すだけで名声の街道を表示してくれるシートに早変わりです。

f:id:TS_hartmann:20201213140604p:plain
「名声の街道」シートはこのような表示になります。他日本人クランの前回のCWE成績も書かれていますが……そこは見逃してください……

 「名声の街道」のL4セルに書かれているURLのページがスクレイピングされますので、各自で使用する場合はFame Lookupの自クランのページのURLをL4セルに貼り付けてください。元データの更新が1時間おきなのでその点だけ注意してください。

 基本的にはこれで作業は終わりとなります。作ったやつにさらなる加工を施したり、別の用途で扱うのは皆さん各自の良心に任せます。

 あまり短時間に連続して稼働させて各サイトのサーバーに負荷をかけるのは止めましょうね……

最後に

 シート様は自分の非を認め、嘘が付けないようなシートにしてしまったことを素直にクラメンに詫びました(シートの保護削除)。このシートが編集できるようになるかどうかは分かりませんが、はんどさんも指揮官に復帰したことですし、何とかなるのでしょう。多分。

 とりあえずこれで一回終わりとなります(多分)。続きがあるにしろ、しばらく明けてからになるでしょう(おそらく)。実験環境(通常CW)を経験していないコードなんて公開していいものか迷っているので。

ts-hartmann.hatenablog.com

続き