時代に翻弄されるエンジニアのブログ

ゲームプログラマをやっています。仕事やゲームや趣味に関してつらつら書きたいと思います。

スプレットシート のデータを Json として取得する

f:id:tkymx83:20200418005758p:plain

こんにちは

ゲーム開発を続けているとどこかでマスターデータの量産をしたくなりますよね? ぼくは、スプレットシートにデータを記載して、Jsonとして出力することでゲームにデータとして読み込ませています。

今日は、そのスプレットシートから Json を出力するところを記事にしてみました。

どんなデータ

今回はスプレットシートに以下のように記載したデータを

f:id:tkymx83:20200418001755p:plain

※ 1行目はJson の要素名を示しています。
※ 2行目は各要素の型を示しています。今回は string が入力されたら、Json として出力する際に 文字列としてダブルクォーテーションをつけて出力します。

以下のようなJsonとして出力したいと思います。

f:id:tkymx83:20200418002844p:plain

どうやって

Google App Script を使用します。

Google App Script は、スプレットシートやGoogle Drive 上の操作を javascript を用いて行うことができます。

今回はそれを利用して スプレットシート上のデータを Json として出力します。

出力する方法としては、データが記載されているシートでメニューから実行できるようにします。

以下実際にダウンロードするまでの流れの動画です。

f:id:tkymx83:20200418004030g:plain

コード

以下実際のコードです。

function onOpen() {
  SpreadsheetApp.getActiveSpreadsheet().addMenu('Menu', [
    {name:'ダウンロード', functionName: 'main'}
  ])
}

function main() {
  
  // dialog.html をもとにHTMLファイルを生成
  // evaluate() は dialog.html 内の GAS を実行するため( <?= => の箇所)
  var html = HtmlService.createTemplateFromFile("dialog").evaluate();
  
  // 上記HTMLファイルをダイアログ出力
  SpreadsheetApp.getUi().showModalDialog(html, "ファイルダウンロード");
}

function getData() {
  
  // スプレッドシート上の値を二次元配列の形で取得
  var sheet = SpreadsheetApp.getActiveSheet();
  var values = sheet.getDataRange().getValues();
  
  // ヘッダーの取得
  var headerIndex = 0
  var headers = []
  for(var i = 0; i< values[headerIndex].length; i++ ) {
    if (!values[headerIndex][i]) {
      break;
    }
    headers.push(values[headerIndex][i])
  }
  
  console.log(headers)
  
  // 型の取得
  var typeIndex = 1
  var types = []
  for(var i = 0; i< values[typeIndex].length; i++ ) {
    if (!values[typeIndex][i]) {
      break;
    }
    types.push(values[typeIndex][i])
  }
  
  console.log(types)  
  
  var dataStateIndex = 2
  var dataArray = [];
  for (var i = dataStateIndex; i < values.length; i++) {
    dataArray.push(values[i]);
  }
  
  var jsonStr = "";
  jsonStr += "{\"InnerArray\":"
  jsonStr += "["
  
  for (var i = 0; i< dataArray.length; i++)
  {
    jsonStr += "{"
    for (var j = 0; j < dataArray[i].length; j++ )
    {
      var jsonValue = dataArray[i][j]      
      if (types[j] === "string") {
        jsonValue = "\"" + jsonValue + "\"";
      }
        
      jsonStr += "\"" + headers[j] + "\":" + jsonValue
      if (j + 1 < dataArray[i].length) {
        jsonStr += ","
      }
    }
    jsonStr += "}"
    if (i +1 < dataArray.length) {
      jsonStr += ","
    }
  }
  jsonStr += "]"
  jsonStr += "}"
  
  return jsonStr
}

まとめ

内容は単純に、スプレットシートに記載されたデータをそのまま Json 文字列として出力して、ファイルとしてダウンロードするものになります。

スプレットシートは、連番機能や関数など、いろいろな機能がありデータの量産にはピッタリのツールになります。その恩恵を受けつつ、データとしてゲームに入れ込むためには今回のツールは必須だと思います。

ゲーム内で Json をマスターデータとして、読み込む方法などはまた後で解説したいと思います。