hartmannのゲームあれこれ

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

WoT CWE管理シート自動化の旅々 8.『シート壊し魔』

ts-hartmann.hatenablog.com

 これの続き

 GASでシート自動化楽しいですね。もう止まらなくなりそうです。元々「GASとか全く分からないのでシート自動化はちょっと……」だったのが、関数ゴリゴリに書くのが好きだったこともあってはまってしまいました。最近は家にいる間ずっとゲーム感覚でシートの自動化をやってます。

 前回の続きです。あらかじめ「名声獲得倍率」シートの追加をしておいてください。

はじめに

 灰桜色の書式を背景に靡かせ、関数でシートに書かれている記号があります。このお人形のように綺麗で可愛らしく、夏の太陽だってもっと熱く燃えてしまいそうな記号は一体何でしょう。そう、「?」です。

やりたいこと

 投げるプロヴィンスを決めて書くとこまでは終わったけど、何戦あるか判断して?とか書いていくのめんどい……自動化しよ……
 こんな感じです。

f:id:TS_hartmann:20201217142621p:plain

予定表(右側の表)記入自動化の手順

手順1. GAS側の記述

 いつも通り先にコードを書きます。

function memo1() {


  //タイムスケジュール情報取り込み     
       
  var id = "スプレッドシートのid";  
  var spreadSheet = SpreadsheetApp.openById(id);  
  var sheetName = "戦闘予定(CWE用)";
  var sheetName2 = "対戦相手判別用";
  var sheetName3 = "名声獲得倍率";
  var sh = spreadSheet.getSheetByName(sheetName); //記入セルを判断するため
  
  var data1 = sh.getRange("F11:F109").getValues(); //縦軸
  var result1 = data1.filter(function(value){return (value[0].length > 0)}); //空白要素の配列を削除
  var Arr = Array.prototype.concat.apply([],result1); //2次元配列を1次元配列にする
  var count = Arr.length;
  
  
  var sh2 = spreadSheet.getSheetByName(sheetName2); //
  var count2 = sh.getDataRange().getLastColumn()-15;//最終列-15
  
  var data2 = sh.getRange("P9:BC9").getValues(); //横軸
  var result2 = data2.filter(function(value){return (value[0].length > 0)}); //空白要素の配列を削除
  var Arr2 = Array.prototype.concat.apply([],result2); //2次元配列を1次元配列にする
  var count3 = Arr2.length;
  
  var data3 = spreadSheet.getSheetByName(sheetName3).getRange("N11:N109").getValues(); //最大参加可能クラン数
  var Arr3 = Array.prototype.concat.apply([],data3); //2次元配列を1次元配列にする
  
  var data4 = sh.getRange("G11:G109").getValues(); //戦線名
  var result4 = data4.filter(function(value){return (value[0].length > 0)}); //空白要素の配列を削除
  var Arr4 = Array.prototype.concat.apply([],result4); //2次元配列を1次元配列にする
  
  var data4 = sh.getRange("L11:L109").getValues(); //戦闘方式
  var result4 = data4.filter(function(value){return (value[0].length > 0)}); //空白要素の配列を削除
  var Arr4 = Array.prototype.concat.apply([],result4); //2次元配列を1次元配列にする
  
  

  
  //予定表に@を書き込む
  
  var lang1 = "@"
  var lang2 = "?"
  
  var colnum = [];//列記入用空白定義
  var debug = []; //デバッグ用空白定義
  for(var i = 0; i < count; i++){
  
     if(4 < Arr3[i] && Arr3[i] <= 8){
       var count4 = 3;
       }
     if(8 < Arr3[i] && Arr3[i] <= 16){
       var count4 = 4;
       }
     if(16 < Arr3[i] && Arr3[i] <= 32){
       var count4 = 5;
       }
     if(32 < Arr3[i] && Arr3[i] <= 64){
       var count4 = 6;      
       }
     debug.push(count4)
  
     for(var j = 0; j < count3; j++){  
         if(Arr2[j] === Arr[i]){ //列番号検索※HLOOKUP関数みたいな働き
            var col2 = (j+16);           
            colnum.push(col2);
            spreadSheet.getSheetByName(sheetName3).getRange(i+11,15).setValue(col2 + (count4-1)*2); //領地戦列を記入
            
            for(var k = 0; k < count4; k++){
               if(k < 1 ){
                 sh.getRange(i+11,col2 + k*2).setValue(lang1); //該当セルより同じ列で右側にあるセルに@と入力する
               }else{
                    sh.getRange(i+11,col2 + k*2).setValue(lang2); //該当セルより同じ列で右側にあるセルに?と入力する
                    }
            }   
         }
      }
  }
 
   Logger.log(Arr4);
}

 これを実行するだけです。ボタンを押したらこれが実行されるようにしておきましょう。

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

 ありません。追加するシートもないです。
 これで下の画像のようになると思います。

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

いつもの(見ない方がいいかも……)

はんどさん「じゃああんたを引き渡して報酬をもらうとするよ」
46猫「報酬がもらえて嬉しい?嬉しい?その喜んでいる顔もっと見せて!!ハァ…ハァ...ハァ…」
はんどさん「うえぇ……(ドン引き)」
私「メイン指揮官じゃないですかぁ!」
はんどさん「なんだお前いたのか」
私「今来たばっかりですよ。ちょっと戦闘管理に困りまして、はんどさんを頼ろうかと……」
46猫「ハァ…ハァ…ハァ…」
私「この人、何をしたんですか?妙に目を輝かせて私を見てますけど……」
46猫「かわいい……怒った顔はもっとかわいいに違いないわ!!」
はんどさん「こいつかぁ?あーえっとなぁ……おっ!(ニヤリ)」
はんどさん「実はなあ……シートを壊して回っているシート壊し魔なんだよ。勝手にいじるくらい凶悪なやつでなあ」
私「はえ、勝手にいじる……ですか……」
はんどさん「CWEの時に使うシートで色んな関数が書いてあるシートだったなあ!」
私「!!」
46猫「(目を輝かせる)」
私「CWE……色んな関数……」
46猫「あなたが誰だか、何だか良くわからないけど、怒っていることだけは分かるわ」
私「……詳しく聞かせてもらえますか(手を握る)」
46猫「んんああっ!(興奮)その怒った顔良いわぁ!最高……んああっ!(絶頂)」


※半分実話です

ts-hartmann.hatenablog.com