WoT CWE管理シート自動化の旅々 11.『2人の指揮官』
これの続き
お約束1
ねろさん「【報酬車両の獲得枠が足りない?あのベトナム業者が2年ぶりに帰ってきたのか】って……」
ねろさん「あれだけ現地で社会問題になった業者がっ!中国に対抗するのでしょうか?それとも模倣犯?」
一般兵A「……それよりあなた、あの話ご存知?」
一般兵B「やだわぁ……ベトナム業者らしきクランが復活したそうね」
一般兵C「とっくに消滅したもんだと思っていたのに。うちの車両大丈夫かしら……」
一般兵A「またGMが荒らされるのかしらねえ……」
一般兵B「怖いわぁ……」
ねろさん「嘆いている場合じゃなさそうですね。面倒は避けたいですし……うん!」
ねろさん「よし!どこからどう見てもBANされているようにしか見えません!ただのもぬけの殻です!」
ねろさん「さぁー車両を選ぶことにしましょー(BAN)」
やりたいこと
前回の続きです。前回の記事では、戦闘ログを取得するところまでは終わっているので今回はそのログを戦闘予定表に反映させるところをやります。
+αで後のために、その時の指揮官も記録にとってセル内メモの上書きもしたいなと思っています。
結果ログの表反映自動化
手順1. GAS側の記述
いつものごとく先にコードから。前回のコードの続きに書いてください。
多重にfor文を使っている上、それぞれにgetRangeとか使っているせいで重い処理になっておりますがご勘弁を。軽くする方法が分からなかったんです。
function logData1() { //戦闘ログをマークとして表に反映 var id = "スプレッドシートのid"; var spreadSheet = SpreadsheetApp.openById(id); var sheetName = "data_log2"; var cell = spreadSheet.getSheetByName(sheetName).getRange("B2:E100").getValues(); //province,map,enemy clan,win or lose var result = cell.filter(function(value){return (value[0].length > 0)}); //空白要素の配列を削除 var count = result.length; //配列変数resultの配列数を調べる var col = 8; //H列 var sheetName2 = "対戦相手判別用"; var sh = spreadSheet.getSheetByName(sheetName2); //記入セルを判断するため var sheetName3 = "戦闘予定(CWE用)"; var sh2 = spreadSheet.getSheetByName(sheetName3); //防衛かどうか判断するため&メモの上書きに使用 var key = []; //検索名を配列として入れるための空白定義(Province name) var int = []; //プロヴィンス名が一致するセルの行を配列として入れるための空白定義 var key2 = []; //検索名を配列として入れるための空白定義(enemy clan name) var count2 = sh.getDataRange().getLastColumn()-15;//最終列-15 var debug = []; //デバッグ用空白定義 for(var i = 0; i < count; i++){ var keyi = result[i][0]; key.push(keyi); var key2i = result[i][2]; key2.push(key2i); var result2 = result[i][3]; for(var j = 0; j < count; j++){ if(sh.getRange(j+11,col).getValue() === keyi){ //行番号検索※VLOOKUP関数みたいな働き var row2 = (j+11); for(var k = 0; k < count2; k++){ if(sh.getRange(row2,k+16).getValue() === key2i){ //列番号検索※HLOOKUP関数みたいな働き var col2 = (k+16); if(result2 === "勝利"){ var result3 = "○"; var mat = sh.getRange(row2,12).getValue(); if(mat.match(/防衛/)){ sh2.getRange(row2,15).setValue("防衛"); for (var a = 0; a < count2 + 15 - col2; a++) { sh2.getRange(row2,a + 1 + col2).setValue("-"); //該当セルより同じ列で右側にあるセルに-と入力する } }else{ if(sh2.getRange(row2,col2 + 2 ).getValue() === "-") sh2.getRange(row2,15).setValue("獲得"); } } if(result2 === "敗北"){ var result3 = "×"; sh2.getRange(row2,15).setValue("敗退"); } if(result2 === "引き分け"){ if(mat.match(/防衛/)){ var result3 = "△"; sh2.getRange(row2,15).setValue("防衛"); } for (var b = 0; b < count2 + 15 - col2; b++) { sh2.getRange(row2,b + 1 + col2).setValue("-"); //該当セルより同じ列で右側にあるセルに-と入力する } var result3 = "▲" sh2.getRange(row2,15).setValue("敗退"); } int.push([row2,col2,result3]); } } } } } var count3 = int.length; //配列変数intの配列数を調べる for (var x = 0; x < count3; x++) { if(!(sh2.getRange(int[x][0],int[x][1]).getValue() == int[x][2])){ sh2.getRange(int[x][0],int[x][1]).setValue(int[x][2]); //該当するセルに試合結果のマークを入力 if (int[x][2] === "×" || int[x][2] === "▲"){ var memo = sh2.getRange(int[x][0],int[x][1]).getNote(); //該当するセルのメモを参照 var commander = sh2.getRange(int[x][0],10).getValue(); //メモが埋め込まれている行の指揮官名を取得 sh2.getRange(int[x][0],int[x][1]).clearNote(); //該当するセルのメモを消去 sh2.getRange(int[x][0],int[x][1]).setNote( memo + String.fromCharCode(10) + String.fromCharCode(10) + "Commander: " + commander + String.fromCharCode(10) + "Result: " + "敗北"); //該当するセルのメモを記入 for (var y = 0; y < count2 + 15 - int[x][1]; y++) { sh2.getRange(int[x][0],y + 1 + int[x][1] ).setValue("-"); //該当セルより同じ列で右側にあるセルに-と入力する } } if (int[x][2] === "○" || int[x][2] === "△"){ var memo = sh2.getRange(int[x][0],int[x][1]).getNote(); //該当するセルのメモを参照 var commander = sh2.getRange(int[x][0],10).getValue(); //メモが埋め込まれている行の指揮官名を取得 sh2.getRange(int[x][0],int[x][1]).clearNote(); //該当するセルのメモを消去 sh2.getRange(int[x][0],int[x][1]).setNote( memo + String.fromCharCode(10) + String.fromCharCode(10) + "Commander: " + commander + String.fromCharCode(10) + "Result: " + "勝利"); //該当するセルのメモを記入 } } } Logger.log(int); }
いつも通り、スプレッドシートのidには使用しているスプレッドシートのidを入れてください。シートの名前(SheetName3の所)も使っている予定表のシート名に変えてください。
上半分ではマークを付けるセル位置の判定を、下半分では実際にマークを付ける工程をやっています。
第5話で「対戦相手判別用」のシートを用意したのは、この処理のために必要だからでした。
手順2. スプレッドシート側の記述
今までの回で作ったシートが全部あるなら、新規のシートは必要ありません。追記も必要ありません。
コード実行後、画像のように○とかのマークがついていれば成功です。
ちなみに第3話からのマッチング情報取得→敵クラン名取得→表反映→戦闘ログ取得→表反映の一連の動作を稼働すると、戦闘予定の領土数にもよりますが私の環境だと20領土で3分くらいの稼働時間がかかります。
まだ、高速化とか全く学んでないので許して…許して……
リファクタリングの概念とかCWE中に初めて知ったのじゃ……
お約束2
はんどさん「うわぁぁ嫌です嫌だ指揮したくないです。僕は楽して車両取りたいんですー」
ねろさん「(苦笑い)」
私「わがまま言ってんな。戦闘あんだから次やるぞ」
はんどさん「じゃあ指揮官辞めます」
私「だったらどうやって稼いでくんだよ」
はんどさん「コネで車両取らせてもらいますー」
ねろ「あ、無理です」
私「だってよ」
りょうさん「はんどさん、諦めて(にらみつける)」
ねろさん「敵視されてる……ものすごい敵視されてる……」
私「じゃあな」
つるさん「ええ。また半年後に」
はんどさん「やーだぁー……いやーだぁー……ねろさーん……(助けて)」