I don't know

Product Development

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で下のような表を作成します。

f:id:eastworld:20210228153900p:plain
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