hartmannのゲームあれこれ

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

WoT CWE管理シート自動化の旅々 5.『私立マクロテリア』

ts-hartmann.hatenablog.com

これの続き

 

はじめに

私「Google Apps script……?」
私「Excelのマクロみたいなものでしょうか……(参考書を読む)」
私「っ!」
私「マクロと同じことが出来るってだけじゃなくて、なんかより便利な気がしますねえ……」

  私はその本を眺めながら4か月前に起きていた出来事を思い出していました。それはこれに比べてはるかにデータ量があって、その名をCWE管理用スプレッドシートと謂いました。

やりたいこと

 前回の続きです。敵クラン名を出力できたので、今までに出力した情報を戦闘予定表にメモとして記入します。どこのセルにメモを挿入すればいいのかは、以前作成した「スクレイピング4(戦)」でもう求めているので、あとはそのセルにメモを挿入するコードを書けばいいのです。

メモ書きを挿入するまで

手順1. GASの記述

   とりあえずコードを出しましょう。基本的には前回のコードに連続して動作するコードとなります。前回のコードの続きに書いてください。

function Memo() {

  //戦闘情報をメモとして挿入

  var id = "スプレッドシートのid";  
  var spreadSheet = SpreadsheetApp.openById(id);  
  var sheetName = "スクレイピング4(戦)";
  var cell = spreadSheet.getSheetByName(sheetName).getRange("E2:E100").getValues();//表示セル
  var result = cell.filter(function(value){return (value[0].length > 0)});//空白要素の配列を削除
  var Arr = Array.prototype.concat.apply([],result);//2次元配列を1次元配列にする
  var count = Arr.length; //配列変数Arrの配列数を調べる
  
  var cell2 = spreadSheet.getSheetByName(sheetName).getRange("I2:I100").getValues();//開始陣地
  var result2 = cell2.filter(function(value){return (value[0].length > 0)});//空白要素の配列を削除
  var Arr2 = Array.prototype.concat.apply([],result2);//2次元配列を1次元配列にする
  
  var cell3 = spreadSheet.getSheetByName(sheetName).getRange("H2:H100").getValues();//相手クラン名
  var result3 = cell3.filter(function(value){return (value[0].length > 0)});//空白要素の配列を削除
  var Arr3 = Array.prototype.concat.apply([],result3);//2次元配列を1次元配列にする
  
  var cell4 = spreadSheet.getSheetByName(sheetName).getRange("D2:D100").getValues();//開始時間
  var result4 = cell4.filter(function(value){return (value[0].length > 0)});//空白要素の配列を削除
  var Arr4 = Array.prototype.concat.apply([],result4);//2次元配列を1次元配列にする
  
  
  var cell6 = spreadSheet.getSheetByName(sheetName).getRange("A2:A100").getValues();//プロヴィンス名
  var result6 = cell6.filter(function(value){return (value[0].length > 0)});//空白要素の配列を削除
  var Arr6 = Array.prototype.concat.apply([],result6);//2次元配列を1次元配列にする
  
  var cell7 = spreadSheet.getSheetByName(sheetName).getRange("K2:K100").getValues();//マップ名
  var result7 = cell7.filter(function(value){return (value[0].length > 0)});//空白要素の配列を削除
  var Arr7 = Array.prototype.concat.apply([],result7);//2次元配列を1次元配列にする
  
  var cell8 = spreadSheet.getSheetByName(sheetName).getRange("L2:L100").getValues();//戦線名
  var result8 = cell8.filter(function(value){return (value[0].length > 0)});//空白要素の配列を削除
  var Arr8 = Array.prototype.concat.apply([],result8);//2次元配列を1次元配列にする
  
  var sheetName2 = "戦闘予定(CWE用)";
  var sheetName3 = "対戦相手判別用";
  
  for ( var i = 0; i < count; i++) {
  
      if(Arr[i] !== "--"){
         if(spreadSheet.getSheetByName(sheetName2).getRange(Arr[i]).getValue() === "?" || spreadSheet.getSheetByName(sheetName2).getRange(Arr[i]).getValue() === "@"){
         spreadSheet.getSheetByName(sheetName2).getRange(Arr[i]).clearNote();
         spreadSheet.getSheetByName(sheetName2).getRange(Arr[i]).setNote( "Start time:    " + Arr4[i] + String.fromCharCode(10) + String.fromCharCode(10) + "front name:    " + Arr8[i] + String.fromCharCode(10) + "Province name:    " + Arr6[i] + String.fromCharCode(10) + "Map name:    " + Arr7[i] + String.fromCharCode(10) + String.fromCharCode(10) + "Start side:    " + Arr2[i] + String.fromCharCode(10) + "Enemy clan name:    " + Arr3[i]);
        
         if(Arr2[i] === "seed"){
            spreadSheet.getSheetByName(sheetName2).getRange(Arr[i]).setValue("→");
            var memo = spreadSheet.getSheetByName(sheetName2).getRange(Arr[i]).getNote(); //該当するセルのメモを参照
          
            spreadSheet.getSheetByName(sheetName2).getRange(Arr[i]).clearNote(); //該当するセルのメモを消去
            spreadSheet.getSheetByName(sheetName2).getRange(Arr[i]).setNote( memo + String.fromCharCode(10) + String.fromCharCode(10) + "Commander:    " + "?" + String.fromCharCode(10) + "Result:    " + "?"); //該当するセルのメモを記入
         
        }else{
              if(Arr2[i] !== "?"){
                spreadSheet.getSheetByName(sheetName2).getRange(Arr[i]).setValue("@");
                }
             }
         }
        spreadSheet.getSheetByName(sheetName3).getRange(Arr[i]).setValue(Arr3[i]);
        }
      }
 
  
  

   Logger.log(Arr2);
   
}

 これ書いているうちに私にも何と書いてあるのかわからなくなりました。えーなんですかね?多分これコピペするだけでいいと思います。戦闘予定(CWE用)の所は実際予定表を組んでいるシートの名前に置き換えてください。
 いつも通りスプレッドシートのidは使用しているスプレッドシートのidをお願いします。

 コードを実行して、3話で貼った記事の画像みたいにメモ書きが挿入されていたとしたら成功です。

f:id:TS_hartmann:20201213072417p:plain
これみたいな感じ

 3話~5話までに書かれた3つのコードは連続して稼働するコードです。トリガーの設定は3話に紹介した最初のコードのみで大丈夫です。

手順2. シート側の記述

 「戦闘予定表」のシートをコピーして、名前を「対戦相手判別用」にしたシートを用意してください。書式とかはそのままで、何か書き換える必要とかはないです。

2020/12/19追記;P11:BC109の範囲のセル中身を消しておいてください。また、C11セルに=QUERY('戦闘予定(CWE用)'!C11:E109)・J11セルに='戦闘予定(CWE用)'!J11と入力してください(後者はJ11:O109の範囲にコピー)。

f:id:TS_hartmann:20201219110709p:plain
間違えて表の左側を消すようなことはしないでください

 何故このシートを用意するのかは……また今度の話にしましょうか……
 まあ、別の処理をする時の布石です。さらに言えば3話に言った「情報保存のための一工夫」がこれなのでした。
f:id:TS_hartmann:20201213082926p:plain
「対戦相手判別用」には相手クランの名前が挿入されている

ほんへ

 シートを管理しているGMがいます。GMはどこかワクワク楽しそうにしています。次に投げるマップはどんなマップでしょう。次に戦う敵はどんなクランでしょう、と期待に胸を膨らませているのです。
 そのGMは一体誰か?そう、私なのでした

ts-hartmann.hatenablog.com

続き