gasを使ってjsonファイルを作成し、ダウンロード

Pocket
LINEで送る

お久しぶりです。川原です。

ここ3ヶ月でエンジニアが2人増え、来月には1人増えることとなり、6人→9人になります。

ベテランの方ばかりなので、話す内容や経験等聞いていると新鮮なものばかりで面白いなあと感じるこの頃です。

 

さて、タイトル通り業務で初めてgoogle app script (gas)を触る機会があり、やってみて気づいたことや知ったgasの概念等を書いていきたいと思います。

 

この記事の対象者

・gasを初めて触る人

・スプレットシートのデータをjsonファイルに変換したい人

・シートから出力したファイルをその場でダウンロードしたい人

 

最終ゴール

スプレットシートのjsonファイルをスプレットシート上からダウンロードできるようにする。

 

参考

基本的にはこちらの記事を参考に自分のやりたかったことを少し足した感じになっております。
https://qiita.com/kei-p/items/5251396bec84b2b14e34

スクリーンショット 2018-11-12 20.21.24

スクリーンショット 2018-11-12 20.21.40

 

実際のコード

実際に記述したコードはこちら(コメントアウトで解説しています。)

download_json.gs


function fetchData(){

var sheet = SpreadsheetApp.getActive().getSheetByName('シート1'); //スプレットシートの情報を取得
targetRow = sheet.getRange(1,1,1).getValue(); // どの行のデータを取得するか取得する。
//targetの行からデータを抽出
var data = sheet.getRange(targetRow,1,2,3).getValues(); //data化するデータを指定する。
var json_data = {"id":data[0][0],"name":data[0][1],"sex":data[0][2]}; //必要な形に加工。
return json_data;
}
function renderToJson(data) {
return JSON.stringify(data, null , 2); //json形式に加工。
}
function showDialogDowloadJson() {
var contentType = "text/plain";
var charSet = "UTF-8";
var lineDelimiter = ",";
var newLineChar = "\n";
var fileName = 'setting.json'; //任意のjsonのファイル名を記入
var folderId = '任意のフォルダーIDを記入';
var folder = DriveApp.getFolderById(folderId); //保存するフォルダーのオブジェクトを取得する。
var data = fetchData();

// 既存のjsonを削除する
deleteFileId = DriveApp.getFolderById(folderId).getFilesByName(fileName).next().getId(); //削除するファイルのIDを取得
DriveApp.getFolderById(folderId).removeFile(DriveApp.getFileById(deleteFileId)); //IDからファイル情報を取得し、ファイルを削除。

body = renderToJson(data);

// fileを作成し、ダウンロードするためのurlを作成する。
var blob = Utilities.newBlob("", contentType, fileName).setDataFromString(body, charSet); //blobに変換して、データをsetする。
var fileId = DriveApp.getFolderById(folderId).createFile(blob).getId(); //ファイルを作成・保存し、IDを取得。
url = "https://drive.google.com/u/0/uc?export=download&id=" + fileId; //ダウンロードする為のURLを生成
// ダウンロード用のダイアログを出す
var output = HtmlService.createTemplateFromFile('download'); //ダイアログ用のテンプレート。
var html = output.evaluate().setHeight(420).setWidth(600); //ダイアログのスタイル
var ui = SpreadsheetApp.getUi(); //uiクラスを取得。

ui.showModalDialog(html, fileName); // ダイアログを出す。
}
function onOpen() {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); //現在開いているスプレットシートを取得
//
var entries = [{
name : "setting.jsonを生成", // タブの名前
functionName : "showDialogDowloadJson" //生成する内容
}];
spreadsheet.addMenu("書き出し", entries); // メニューにタブを追加
};

download.html

<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>

 

 

さて解説は大体コードに書いてしまったので、詰まった概念の説明を。

 

Path指定の仕方が少し違う

例えば、自分のPCなどでDownloadディレクトリ以下のファイルを指定する場合は
“`

/Users/******/Downloads/指定のファイル名

“`

のように指定すれば、いろんな操作が可能かと思います。

つまり、ディレクトリやファイルの場所は名前で指定すれば操作可能です。

ですが、グーグルドライブの場合は、ファイルの操作やディレクトリの指定をするのには名前だけではダメで、IDが必要となります。

仮にファイル名やディレクトリ名がわかっていても、そこからIDを取り出す過程が必要です。

 

実際の例で見ていきましょう。今回の場合、既存のsetting.jsonを削除し、新しくsetting.jsonを生成するコードを書いています。

削除の対象であるファイル名はsetting.jsonであることはわかっていますが、そこからIDを取得しています。

この概念がよくわかってなかったので、getIdメソッドを使わずにやろうとしてだいぶハマってました。


fileName = "setting.json"

// 既存のjsonを削除する
deleteFileId = DriveApp.getFolderById(folderId).getFilesByName(fileName).next().getId(); //削除するファイルのIDを取得
DriveApp.getFolderById(folderId).removeFile(DriveApp.getFileById(deleteFileId)); //IDからファイル情報を取得し、ファイルを削除。

 

GASを言語と呼んでいいのかわからんですが、言語によってこういう細かいところが違って面白いですね。

Vue.jsの勉強のためにjavascriptの歴史とかを辿っているのですが、色々とハマっているのでその辺りも記事にできればと思います。

Pocket
LINEで送る