2015-01-11に投稿

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を直接開いて更新する。

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

|javascript|
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;
}
||

ツイッターでシェア
みんなに共有、忘れないようにメモ

だら@Crieit開発者

Crieitの開発者です。 Webエンジニアです(在宅)。大体10年ちょい。 記事でわかりにくいところがあればDMで質問していただくか、案件発注してください。 業務依頼、同業種の方からのコンタクトなどお気軽にご連絡ください。 業務経験有:PHP, MySQL, Laravel, Vue.js, React, Node, RoR 趣味:Elixir, Phoenix, Nuxt, Express, GCP, AWS等色々

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!
ボードとは?

関連記事

コメント