リソースファイルの管理・運用に共同作業が可能で、操作もエクセルライクで扱い易いGoogleDriveのスプレッドシート。
このスプレッドシートを実際のリソースとして扱う際はJsonに変換するという方も少なくないはず。
そのような時は、ファイルをcsv書き出し -> jsonに変換するスクリプトを別途用意して、処理するという手順をとるかと思います。
しかし、できれば直接スプレッドシートの編集画面上からjsonをダウンロードできないものかと思い、 GASで作ってみました。
サンプルはこちらのGistに書いてありますので、重要な箇所だけを解説していきます。
JSONファイルをGoogle Drive上に作成
直接ファイルをダウンロードさせる方法が見つからなかったので、一度Json形式のテキストをGoogle Drive上にファイルとして作成します。
var folder = DriveApp.getFolderById(folderId);
body = renderToJson(data);
var blob = Utilities.newBlob("", contentType, fileName).setDataFromString(body, charSet);
ダウンロードダイアログを表示
作成したファイルのurl、およびプレビュー用のbodyをグローバル変数として用意しておきます。
そして、"donwload.html"という名前でテンプレートファイルを作成して
body = renderToJson(data); // プレビュー用
var blob = Utilities.newBlob("", contentType, fileName).setDataFromString(body, charSet);
var fileId = DriveApp.getFolderById(folderId).createFile(blob).getId();
url = "https://drive.google.com/uc?export=download&id=" + fileId; //ダウンロード用URL
var output = HtmlService.createTemplateFromFile('download');
var html = output.evaluate().setHeight(420).setWidth(600);
var ui = SpreadsheetApp.getUi();
ui.showModalDialog(html, fileName);
<style type="text/css">
# json {
height: 320px;
overflow: scroll;
border:1px solid #ddd;
padding:10px;
}
</style>
<pre align="left" id="json">
<?
output.append(body);
?>
</pre>
<div align="center">
<?
output.append("<a href='" + url + "' target='_blank'>ダウンロード</a>");
?>
</div>
スプレッドシートに書き出しメニューの追加
スプレッドシートにメニューを追加する方法は、以下のようになってます。
functionNameに呼び出す関数名を指定することで、ボタンを押した時に指定された関数が呼び出されます。
function onOpen() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var entries = [{
name : "シートをJSONで出力",
functionName : "showDialogDowloadJson"
}];
spreadsheet.addMenu("書き出し", entries);
};