一人もくもく会 α verでサービス開始しました。
請求書作成システム α verでサービス開始しました。

cocos2d-js用のデータをgoogleスプレッドシートで管理する

別にエクセルで管理してcocos studioで出力したjsonでも良いのだが、
cocos2dx-jsはhtml5用としても作成できるため、
その場合jsonファイルが個々のファイルとしてリソースになってしまい、
メインの圧縮されたjsに組み込まれず
jsonファイルの分だけサーバーにリクエストが行ってしまう。

しょぼいサーバーで運用したい場合などはあまりリクエストも来てほしくないため、
なるべく全てのデータをjsファイルとしてまとめて欲しい。

そのためデータをgoogleスプレッドシートで管理し、
jsファイルとして出力できるスクリプトを作成した。

最初にindexというシートを作成し、
A1に変数名のプレフィックス
(例えばDataというクラスにデータを保存したいのであれば「Data.」)
A2は「名前」というテーブルタイトルにしたので
A3からデータ名を縦に羅列していく。
(簡単にするためデータ名=シート名=変数名として扱う)

itemsというデータを作成したい場合、itemsというシートを作成。
1行目は項目名にし、2行目からデータを並べていく。

あとはメニューに「まくろ」というメニューが追加されているので
そちらで実行すればjsonが画面上に表示される。
それをプロジェクトのjsを直接開いて更新する。

ファイルとして保存することも考えたがローカルじゃないので
ダウンロード時もファイル名が変わったりする場合があって面倒だし
これが一番早いかなと思った。

var SHEET_NAME = 'index';
var jsonString = '';

function onOpen(event){
  var menuitems = [
    {name:'jsエクスポート', functionName:'main'}
  ];
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  sheet.addMenu('まくろ', menuitems);
}

function main() {
  var book = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = book.getSheetByName(SHEET_NAME);
  var tableName = 'start';
  var tables = {};
  var prefix = sheet.getRange('A1').getValue();
  var line = 3;
  while (tableName != '') {
    var range = sheet.getRange('A' + line++);
    tableName = range.getValue();
    if (tableName != '') {
      tables[tableName] = [];
    }
  }

  var js = '';
  for (var tableName in tables) {
    var sheet = book.getSheetByName(tableName);
    var json = convertSheet2JsonText(sheet);
    js += prefix + tableName + ' = ' + JSON.stringify(json) + ";\n";
  }
  jsonString = js;
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var tag = '<textarea rows="20" style="width:90%;">' + js + '</textarea>';
  sheet.show(HtmlService.createHtmlOutput(tag));
}

function getResult() {
  return jsonString;
}

function convertSheet2JsonText(sheet) {
  var data = sheet.getDataRange().getValues();
  var lastRow = sheet.getLastRow();
  var lastColumn = sheet.getLastColumn();
  
  var fields = [];
  for (var i = 0; i < lastColumn; i++) {
    fields.push(data[0][i]);
  }
  
  var json = [];
  for (var i = 1; i < lastRow; i++) {
    var row = {};
    for (var j = 0; j < lastColumn; j++) {
      row[fields[j]] = data[i][j];
    }
    json.push(row);
  }
  return json;
}