Google SpreadsheetによるRailsのSeed作成
RailsのProjectで初期データをLoadするためのToolとしてseed.rbというものがあります。架空のデータを入れる場合は100.timesなどでLoopを回して適当な数値や文字列を入れてしまえばいいのですが、外部サービスとの連携をテストしたい場合など、実際に存在するデータからseed.rbを作りたくなるケースがあります。今回はGoogle spreadsheetにまとめたデータをseed.rbの形式で吐き出す方法についてまとめます。
今回は地図上の場所(Place)について、場所の名前、国、州、都市、経度、緯度を格納していきます。Rails上も"Place"Modelが存在していると仮定します。まずGoogle Spreadsheetで下のような表を作成します。
ここからseed.rbの中身を作るためにMenu>Tools>Script Editorで下記の通りScriptを作成します。
function placesSeed() { //カラムのindexを設定 const COL_INDEX_NAME = 0; const COL_INDEX_COUNTRY = 1; const COL_INDEX_STATE = 2; const COL_INDEX_CITY = 3; const COL_INDEX_LATITUDE = 4; const COL_INDEX_LONGITUDE = 5; //Sheet上の範囲を指定してセルの中身を取得 var sheet = SpreadsheetApp.getActiveSheet(); var range = sheet.getRange('B2:G18'); var values = range.getValues(); //PlaceモデルのRecordを作成するようにLogging var output = "Place.create!("; output += "[\n" var output2 = "" var seeds = values.map(function(row) { output2 += "{\n" output2 += " name: '" + row[COL_INDEX_NAME] + "',\n"; output2 += " country: '" + row[COL_INDEX_COUNTRY] + "',\n"; output2 += " state: '" + row[COL_INDEX_STATE] + "',\n"; output2 += " city: '" + row[COL_INDEX_CITY] + "',\n"; output2 += " latitude: " + row[COL_INDEX_LATITUDE] + ",\n"; output2 += " longitude: " + row[COL_INDEX_LONGITUDE] + ",\n"; output2 += "},\n"; return output2; }); var output3 = "])"; var log = output.concat(output2).concat(output3) Logger.log(log) }
Scriptを実行するとコンソールに下記のようなlogが出力されるので、これをseed.rbにコピペすればOKです。最後のレコードの末尾の"},"のカンマは不要なのでseed.rbにコピペするときに削除します。また、セルの範囲指定はgetLastRow(),getLastColumn()などを使ってより柔軟にできるはずです。
Place.create!([ { name: 'Times Square', country: 'United States', state: 'New York', city: 'New York', latitude: 40.7583205820296, longitude: -73.985580871994, }, { name: 'Central Park', country: 'United States', state: 'New York', city: 'New York', latitude: 40.7811548875111, longitude: -73.9665245306522, }, (以下続く)
参考にした記事 Google Apps Script でスプレッドシートから Rails の Seed(seed-fu)を生成する - Qiita