Edited at

GoogleAppsScriptでSQLっぽくDBを扱えるライブラリを作りました。


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ライフを!