BLOG

はじめに

こんにちは。ととがんまです。 最近はこんな感じのゲームを作り始めました。

このゲームを作るに当たり、こんな感じでアイテムや設置物等の情報をスプレッドシートで練っていました。

スプレッドシートでのプロット

で、いざこれをjsonにしてゲーム内に持ち込みたいなーと思ってもアイテム数が多すぎてちょっと手打ちは大変です。しかも今後微調整したくなること間違いなしですから自動で書き出せると良いですね。

今回は、これをGoogle Apps Script(GAS)を用いて実現します。 GASはGoogleの様々なサービスと連携して使えるスクリプトで、実態はほぼほぼjavascriptです。


今回解説する問題

このようなスプレッドシート

問題設定

を、このjsonに射影します。

{
    "items": [
        {
            "item1": "スペード",
            "item2": "ダイア",
            "item3": "クラブ",
            "item4": "ハート"
        },
        {
            "item1": "葉",
            "item2": "鈴",
            "item3": "ドングリ",
            "item4": "ハート"
        },
        {
            "item1": "盾",
            "item2": "鈴",
            "item3": "ドングリ",
            "item4": "バラ"
        },
        {
            "item1": "剣",
            "item2": "貨幣",
            "item3": "棍棒",
            "item4": "カップ"
        }
    ]
}

手順

まず、スクリプトを紐付けたいスプレッドシートを開き、「ツール>スクリプトエディタ」を選択します。

ツール>スクリプトエディタ

すると、新しいタブでApps Scriptの編集画面が開きます。

Apps Scriptの起動画面

ここに自由にコーディングします。

使いそうな機能をまとめたサンプルコードを以下に示します。

function jsonOutput() {

	// 読み込み元のシートを名前で参照する
	var sheet = SpreadsheetApp.getActive().getSheetByName('シート1');

	var items = [];

	//A列の要素を2行目から順に見ていき、空要素までたどり着いたらやめる。
	for (var itr = 2; true; ++itr) {
		// getRange(row, col, numrows, numcols)
		// (row, col)番目のセルから、下方向にnumrows、右方向にnumcolsだけデータを取って.getValues()で二次元配列として返す。
		// このサンプルではnumrows=1としているので[0]でスライスして行だけの1次元配列を返している。
		var row = sheet.getRange(itr, 1, 1, 4).getValues()[0];
		if (row[0] == "") break;

		// 好きな形に射影する
		items.push({
			"item1": (row[0]) ? row[0] : "N/A",
			"item2": (row[1]) ? row[1] : "N/A",
			"item3": (row[2]) ? row[2] : "N/A",
			"item4": (row[3]) ? row[3] : "N/A"
		});
	}

	// 出力先のシート
	var newSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("ScriptOutput");
	if (!newSheet) { // シートがなければ新しく作る
		newSheet = SpreadsheetApp.getActiveSpreadsheet();
		newSheet.insertSheet("ScriptOutput");
	}
	newSheet.getRange("A1").setValue({"items": JSON.stringify(items)});
}

適宜コメントを入れたのでだいたいの処理はわかると思います。 一番カスタムしたくなる部分はgetRangegetValuesなどでしょうか。これも「GAS getRange」とかで検索すると無限に記事が出てくるので適当に調べてカスタムすると良いと思います(投げやり)。

ハイライトした部分を実行したい関数名(この例だとjsonOutput)に設定します(自動で設定されることもあります)。

実行する関数の設定

この時点で、「実行」ボタンを押せば、スプレッドシート側で新しいシートが作成され、jsonが書き出されているのが確認できると思います。
(このとき、「承認が必要です」とスクリプトへ権限の付与が求められることがあります。ダイアログの「権限を確認」を押すだけでOKです。)

実行結果の確認

これで目的自体は達成できるのですが、毎回実行するためにスクリプト編集画面を立ち上げるのは面倒なのでもうひと手間加えます。

スプレッドシートで「挿入>図形描画」で適当な図形を作ります。

挿入>図形描画で適当な図形を作る

図形を作ったら、右クリックして︙から「スクリプトを割り当て」を選びます。

スクリプトを割り当てる

出てきたダイアログに実行したい関数名を入力します。(このとき、特にサジェスト等がないので入力間違いに注意です)。

スクリプト名を入力

これで、この図形が関数実行のボタンとして機能します。

ぶっちゃけボタンじゃなくてコンテキストメニューや上のメニューから実行できればそれで良いのですが、簡単に調べたところスプレッドシート側からスクリプトを呼び出す方法はこれだけのようです。

以上です。