hartmannのゲームあれこれ

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

WoT CWE管理シート自動化の旅々 12.『ありとあらゆるありふれたCWE管理シートの物語』

ts-hartmann.hatenablog.com

これの続き

お約束1

 CWEの物語をしましょう。私は副指令であり、GM担当官です。
 CWEは出会いと別れの連続で、同時に選択の連続でもあります。
 いくつもの後戻りできない選択をして、私は今ここにいるのです。

やりたいこと

 前回、表にマークをつけるついでにメモを挿入しましたが、そのメモをなんちゃらかんちゃらして指揮官ログを取ってしまおうという感じです。

 今まで、私がシートやGMの管理をやっていたクランではCWE中、各戦闘終了毎、指揮官にフォームでログを書いてもらっていました(IGN・相手クラン・マップ・勝敗)。

f:id:TS_hartmann:20201220165653p:plain
こんな感じのやつ
 この作業をなくしてしまおうというわけです。今まで指揮官ログとして集めていた情報は先の4つの情報なわけなのですが、4つとも前回上書きした後のメモ書き内に情報として入っています。
f:id:TS_hartmann:20201221010127p:plain
表にマークつけた後のメモ書き
 このメモ書きから4つの情報を抜き出して、一つの指揮官ログとして出してしまおうよというのが今回の内容になっております。  

指揮官ログの記入自動化

手順1. GAS側の記述

 それではいつも通りGASのコードからです。

function commanderLog() {

  var id = "スプレッドシートのid";  
  var spreadSheet = SpreadsheetApp.openById(id);  
  var sheetName = "戦闘予定(CWE用)";
  var sh = spreadSheet.getSheetByName(sheetName); //メモ書きを上書きするため
  
  var note = sh.getRange("P11:BC109").getNotes(); //メモ書きの参照
  var Arr = Array.prototype.concat.apply([],note);//2次元配列を1次元配列にする
  var Arr2 = Arr.filter(function(s){return s !== '';}); //1次元配列の空白要素を削除する
  var count = Arr2.length; //配列変数Arrの配列数を調べる
  
  var data = []; //データ格納用空白定義
  var data3 = []; //データ格納用空白定義
  for ( var i = 0; i < count; i++) {
       var time = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd HH:mm');

      if(Arr2[i].match(/Commander:    (.+)/) == null){
        var commander = ["?","?"];
      }else{
        var commander = Arr2[i].match(/Commander:    (.+)/);
      }

      if(Arr2[i].match(/Enemy clan name:    (.+)/) == null){
        var enemy = ["?","?"];
      }else{
        var enemy = Arr2[i].match(/Enemy clan name:    (.+)/);
      }

      var map = Arr2[i].match(/Map name:    (.+)/);

      if(Arr2[i].match(/Result:    (.+)/) == null){
        var result = ["?","?"];
      }else{
        var result = Arr2[i].match(/Result:    (.+)/);
      }
      var format = Arr2[i].match(/format:    (.+)/);
      data.push([time,commander[1],enemy[1],map[1],result[1]])
  }
  
  var result = data.filter(function(value){return (value[1] !== '?')}); //指揮官名が?になっている要素の配列を削除
  var count2 = result.length; //配列変数resultの配列数を調べる
    
  var sheetName2 = "指揮官ログ";
  var sh2 = spreadSheet.getSheetByName(sheetName2); //メモ書きを加えていくため
  
  for ( var j = 0; j < count2; j++) {
     sh2.appendRow(result[j])
     }
  
  Logger.log(result);
}

 スプレッドシートのidは使っているシートのidを、シートの名前(sheetNameのところ)は使用している予定表シートの名前を入れてください。

 指揮官名・敵クラン名・マップ名・結果の4つのデータに加えて現在時刻を出力する理由は、次の回の内容である指揮官統計を取る時にデータの絞り込みをするためです。  

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

 「指揮官ログ」の名前にしたシートを用意してください。2行目以降の左の列から時刻・指揮官名・敵クラン名・マップ名・結果の順に出力されますので、分かりやすいよう1行目に項目を書いておくといいかもしれません(ログは上書きされることなく、新しい行に記載されていきます)。  下の画像みたいになれば成功です。  

f:id:TS_hartmann:20201222200516p:plain
こんな感じ

お約束2

私「あれ......?夢……?」
私「さて、行きましょうか!」


 はいっ、それでは問題です!いろいろなコードを書く、近くに人がいたのなら間違いなく誰もが振り返り、ため息をこぼしてしまうほどの乱雑なコードは一体誰のでしょう?それは、運営をしてCWEの、管理シートの物語を綴り続ける、そう私です!



 私が誰かとぶつかる……

??「ごめんなさい、(タクを)書くのに夢中で……」
私「いえいえ、こちらこそ……」
私「でも、指揮するときは周りを見た方がいいですね。視野を自ら狭めているとしか言いようがありません」
??「ごめん、ありがとう……あっ(新しいタクを思いつく)」
私「ま、次からはお互い気を付けましょ」
??「は、はい(礼をして立ち去る)」


 当時の私はまだ知りませんでした。この先、彼が立派な指揮官になることを。彼の名は「The Laughing Hand」



 「魔女の旅々」は第2クールやりそうな終わり方でしたね。この話はあと1話分続く予定ですが、もし第2クールがあるとしたらなんとか24話分まで書けることがあるのかないのか……ものすごく不安です……