【GAS】googleスプレッドシートでガチャプログラム書いてみた(スクリプトあり)

ソシャゲ

記述日 2020/10/10
更新 2022/8/3 ソースコード見られなかったので貼り付け

GAS Google Apps Script
googleスプレッドシート

GAS&グーグルスプレッドシートでガチャプログラム書いてみた(スクリプトあり)

GAS(Google Apps Script)でプログラムを書いた事がなかったので(js javascriptも書いたことない)
学習&検証がてらガチャのプログラムを書いてみました。

 

GAS(JS)が初めてなので、いまいちなソースコードなんだろうけど、それにしても実行速度が遅い。

最適化はできるんだろうけど、GASでシミュレータ作るのは向いていないかな。
APP使用回数制限もあるし。

嫌いなVBAで書いてみるかな…

 

ソースコード

//
//グローバル変数
//
//メモ:getRange(row=行,column=列)
const spread = SpreadsheetApp.getActiveSpreadsheet();
//
//データ
//
const dataStartRow = 2 //データ開始行
const datasheet = spread.getSheetByName(“ガチャ01Data”) //データシート
const DataWeightColumn = 4 //重み列
let DataRangeProbability //確率Range取得用
var DataWeightRange;
var DataWeightValues;
let dataNum
//———-
//ガチャメイン
//———-
function FunctionGacya01() {
  //ガチャ引く前の準備
  GacyaDataProcessing()
  //ガチャ引く
  for(let i = 0;i < 100;i++){
    GacyaOne(i)
  }
}
//———————————
//データ処理
//———————————
function GacyaDataProcessing() {
 var msgtmp
  //データの数を取得 ※dataStartRow行目からデータ
  //列1(A)の先頭行から下方向に取得する
  var dataEndRow = datasheet.getRange(dataStartRow, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow();
  Logger.log(`データ最終行 ${dataEndRow}`)
  dataNum = (dataEndRow – dataStartRow + 1)
  Logger.log(`データ数 ${dataNum}`)
  //確率の行Range取得
  DataRangeProbability = datasheet.getRange(dataStartRow,3,dataNum,1)
  let values = DataRangeProbability.getValues() // returns string[][];
  Logger.log(`values.length: ${values.length}`)
  let goukei = 0; //確率合計
  for(let i = 0;i < values.length;i++){
    goukei += values[i] * 100
    //Logger.log(`GASによるメッセージ: ${values}`);
  }
  Logger.log(`確率合計: ${goukei}`);
  //重み計算用の一時データをセルに書き込み
  var Probability = 0
  for(let i = 0;i < values.length;i++){
     Probability += (values[i] * 100)
     datasheet.getRange(dataStartRow + i,DataWeightColumn).setValue(Probability)
  }
  //重みデータレンジを取得
  DataWeightRange = datasheet.getRange( dataStartRow,DataWeightColumn,dataNum,1)
  DataWeightValues = DataWeightRange.getValues() // returns string[][];
  for(let i = 0;i < DataWeightValues.length;i++){
    Logger.log(`DataWeightValues i:${i} values:${DataWeightValues[i]}`);
  }
}
//———————————
//ガチャ引く
//———————————
function GacyaOne( no ) {
  var rand = Math.floor(Math.random() * 100) + 1;
  //Logger.log(`ランダム値: ${rand}`);
  //Logger.log(`DataWeightRange: ${values.length}`);
  datasheet.getRange( no+2,8 ).setValue(`ランダム値 ${rand}`)
  for(let i = 0;i < DataWeightValues.length;i++){
    //Logger.log(`範囲1: ${values[i]} 範囲2:${values[i+1]} `);
    if( rand <= DataWeightValues[0] ){
      GacyaDisp( no,0 )
    }
    else if( rand > DataWeightValues[i-1] && rand <= DataWeightValues[i] ){
      //Logger.log(`範囲: ${i}`);
      GacyaDisp( no,i )
    }
  }
  //
  //結果表示(シートに反映)
  // rangeNo:重み範囲番号
  function GacyaDisp( gacyano,rangeNo ){
    //範囲からカードを取得
    datasheet.getRange( gacyano+2,9 ).setValue(`範囲 ${rangeNo}`)
    var name = datasheet.getRange( rangeNo+2,1 ).getValues()  //カード名取得
    //シートに出力
    datasheet.getRange( gacyano+2,7 ).setValue(name)
  }
}

 

検索用

ガチャ 重み スクリプト GAS js javascript javaスクリプト

 

コメント

タイトルとURLをコピーしました