Help us understand the problem. What is going on with this article?

GoogleAppsScriptでSQLライクにスプレッドシートを扱えるライブラリを作りました。

SpreadSheetSQL

GoogleAppsScriptGoogleSpreadSheets をDBとして扱う際に
取得、変更、削除に手間がかかっていたので、SQLっぽく記述できるライブラリを作りました。

Github: https://github.com/roana0229/spreadsheets-sql
Document: https://script.google.com/macros/library/d/17p1ghyOkbWOhdE4bdBFhOXL079I-yt5xd0LAi00Zs5N-bUzpQtN7iT1a/6

インストール方法

Project ID: MAoZrMsylZMiNUMljU4QtRHEMpGMKinCk

GoogleAppsScript上でリソース > ライブラリ > ProjectIDを入力 > 選択 > 最新バージョンを選択

できること

普段見るDBのViewのように1行目にカラム名を記述し、そのカラム名に対応する形でSQLを叩くことができます。

スクリーンショット 2016-03-25 00.05.15.png

コード例

インスタンスの生成

var id = 'SpreadSheets ID';
var name = 'SpreadSheets SheetName';

SpreadSheetsSQL.open(id, name)

行の取得

SpreadSheetsSQL.open(id, name).select(['name', 'age', 'married', 'company']).result();

クエリ結果 (json array)

[{
  name: 'Gail',
  age: 20,
  married: true,
  company: 'Google'
},{
  name: 'Plato',
  age: 18,
  married: false,
  company: 'Yahoo'
}]

オプション(filter,orderBy)

SpreadSheetsSQL.open(id, name).select(xxx).filter('age < 20').result();
SpreadSheetsSQL.open(id, name).select(xxx).orderBy(['name', 'age']).result();
SpreadSheetsSQL.open(id, name).select(xxx).filter(xxx).orderBy(xxx).result();

行の追加

SpreadSheetsSQL.open(id, name).insertRows([
  {name: 'Colt', age: 30, married: false, company: 'Microsoft'},
  {name: 'Smith', age: 24, married: true, company: 'Adobe'}
]);

行の更新

SpreadSheetsSQL.open(id, name).updateRows({
  company: 'Adobe'
}, 'name = Colt');

行の削除

SpreadSheetsSQL.open(id, name).deleteRows('name = Colt AND company = Adobe');

主なメソッド

  • open(): シートの取得
  • select(): 取得するカラム名の選択
  • filter(): 取得するデータのフィルタリング
  • orderBy(): 取得するデータのソート
  • result(): クエリ結果の取得
  • insertRows(): データの追加
  • updateRows(): データの変更
  • deleteRows(): データの削除

フィルタリングに利用可能な記号

Symbol Example
= age = 20
< age < 20
<= age <= 20
> age > 20
>= age >= 20
IN company IN Apple,Google
OR company = Apple OR company = Google
AND company = Apple AND age > 20

備考

SlackのBotを作成する際にGoogleAppsScriptを利用して、GoogleSpreadSheetsをDBとして扱っています。
Qiitaのfeedの同じ投稿の被りや記事更新による連続投稿を対処するために
SpreadSheetsに溜め込み一定時間毎に投稿させるようにしています。

ただ、生のSpreadSheetsをDBとして扱うのはコードが分かり辛くなるため
一度、FusionTablesを利用してみたのですが制限が厳しすぎて
じゃあ、SpreadSheetでSQLを叩ける用にしたらいいじゃないかと思い作成しました。

このライブラリを使えば、SpreadSheetsをDBとして扱う際の手間がかなり楽になると思います!
機能追加、バグのissueやプルリクはいつでも歓迎しています。
良いGoogleAppsScriptライフを!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away