LANG SELRCT

コードを書く場所についてはこちら

2018年1月8日月曜日

スプレッドシートからJSONファイルを作ってGoogleドライブに保存する(keyはA列)


こういうスプレッドシートを


JSONファイルにしてGoogleドライブに保存する
(保存したファイルを開いた画面↓)


コード.gsの

SS_URL:保存したいシートがあるスプレッドシートのURL
FOLDER_ID:保存先のフォルダのID
FILE_NAME:保存したいファイル名

は任意で設定して下さい



コード.gs
function save_to_drive_json() {
  var data = get_values();
  var keys = data[0];
  var values = data[1];
  var jobj = create_jobj(keys, values);
  create_file(jobj);
}

function get_values() {
  var ss_url = "SS_URL";
  var ss = SpreadsheetApp.openByUrl(ss_url);
  var sheet = ss.getSheets()[0];
  var last_row = sheet.getLastRow();
  var keys = sheet.getRange("A1:A" + last_row).getValues();
  var values = sheet.getRange("B1:B" + last_row).getValues();
  var data = [keys, values];
  return data;
}

function create_jobj(keys, values) {
  var obj = new Object();
  for (var i = 0; i < keys.length; i++) {
    obj[keys[i]] = values[i][0];
  }
  var jobj = JSON.stringify(obj);
  return jobj;
}

function create_file(jobj) {
  var content_type = "application/json";
  var file_name = "FILE_NAME";
  var blob = Utilities.newBlob("", content_type, file_name);
  var file = blob.setDataFromString(jobj, "utf-8");
  var drive = DriveApp.getFolderById("FOLDER_ID");
  drive.createFile(file);
}
意訳
この機能がやること
get_values()を実行して
返ってきた値の0番目のデータを取得し
返ってきた値の1番目のデータを取得し
create_jobjに渡して
返ってきた値をcreate_fileに渡す


この機能がやること
スプレッドシートのURLを指定して
開いて
先頭のシートを取得して
データが入っている最終行を取得して
A列のデータを取得し
B列のデータを取得し
配列に入れて
返す


この機能がやること
オブジェクトを作成して
受け取ったkeysの数だけ以下を繰り返す
keysとvaluesの値をセットにして一つずつオブジェクトに入れて

最終的にできたオブジェクトをJSONに変換して
返す


この機能がやること
content_typeを設定する
ファイル名を設定する
Blob objectを作成して
jobjと文字コードを渡し
指定したフォルダに
ファイルを作成する



A列をkeyにしてB列以降を配列に入れるVersion


コード.gs
var FILE_NAME = "ファイル名";
var FOLDER_ID = "フォルダID";

function save_to_drive_json() {
  var values = get_values();
  var jobj = create_jobj(values);
  create_file(jobj);
}

function get_values() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var last_row = sheet.getLastRow();
  var last_col = sheet.getLastColumn();
  var start_row = 1;
  var start_col = 1;
  var numRows = last_row - start_row + 1; 
  var numColumns = last_col - start_col + 1;
  var range = sheet.getRange(start_row, start_col, numRows, numColumns);
  var values = range.getValues();
  return values;
}

function create_jobj(values) {
  var obj = new Object();
  for (var i = 0; i < values.length; i++) {
    var key = values[i].shift();
    var value = values[i];
    obj[key] = value;
  }
  var jobj = JSON.stringify(obj);
  return jobj;
}

function create_file(jobj) {
  var content_type = "application/json";
  var file_name = FILE_NAME;
  var blob = Utilities.newBlob("", content_type, file_name);
  var file = blob.setDataFromString(jobj, "utf-8");
  var drive = DriveApp.getFolderById(FOLDER_ID);
  drive.createFile(file);
}
意訳
ファイル名を決める
フォルダ名を決める

この機能がやること
get_values()を実行して
返ってきたvaluesをcreate_jobjに渡して
返ってきた値をcreate_fileに渡す


この機能がやること
対象のシートを取得して
データの入っている最終行を取得して
データの入っている最終列を取得して
対象範囲の先頭の行を指定して
対象範囲の先頭の列を指定して
対象の行数を取得して(最終行 - 先頭行だと先頭行の分が含まれないので+1する)
対象の列数を取得して(最終列 - 先頭列だと先頭列の分が含まれないので+1する)
範囲を指定して
値を取得して
返す


この機能がやること
オブジェクトを作成して
受け取ったvaluesの数だけ以下を繰り返す
values[i]の先頭の要素を抜き出してkeyにして
残りをvalueにして
オブジェクトを作る

最終的にできたオブジェクトをJSONに変換して
返す


この機能がやること
ファイルの種類をapplication/jsonにして
ファイル名を指定して
Blobを作成して
渡されたjsonと文字コードを渡して
指定したフォルダに
ファイルを作成する







参考

Class Utilities
https://developers.google.com/apps-script/reference/utilities/utilities