Gristメモ
Gristはいいぞ
Airtableの無料制限がきつかったので、探したら見つかった。
長所
- 式がすごいPythonがそのまま使える。
- アクセスルールが細かく設定できる。
- 無料版でDB1つごとに5000レコード使える。(Airtable無料版はDB1つごとに1500レコード)
- セルフホストでなら、制限解除できる。
- 読み取り権限のみでフィルター、ソートができる。(Airtableではできなかったはず)
短所
- 参照列周りが弱い。テーブルのテキスト列を選択→新規テーブル作成して参照列作成ができない。(Airtableではできた)
- 絞り込みに複雑な条件を設定できない。絞り込みのための数式列をわざわざ作る必要がある。(Pythonで超複雑な条件式も作れるので、トレードオフかも)
- .NETのAPIクライアントが存在しない。(そのうち作りたい)
Tips
- アクセスルールを使って実現する。条件用のカラムが必要だが、しょうがないね。
- あらかじめ参照先テーブルを作成してからでないと参照列は作れない。リクエストは投げたが、実現はいつになるか・・・
#Name列の重複カウント len(table.lookupRecords(Name=$Name)) #Name列の重複チェック len(table.lookupRecords(Name=$Name)) > 1
- このアクセスルールを付けてから、重複を含むデータをインポートすると、重複分だけでなく全部エラーになってしまう。この辺りを何とかする方法はわからない。
- ソースを自動生成しようとしたらエラーが出た。誰か修正してプルリクエスト投げてくれ。
all_images = $table.Icon return [image for images in all_images for image in images]
import json t = TARGET_TABLE_NAME c = TARGET_CHOICES_COLUMN_NAME column = _grist_Tables_column.lookupOne(tableId=t, colId=c) json.loads(column.widgetOptions)["choices"].index($Type)
- 参照先として表示されるのは空文字以外
- フィルターしたい参照先テーブルに有効な文字列のみを返す関数カラムを追加する
#Name列をTypeが武器でフィルタリング $Name if $Type == "武器" else ""
- GristドキュメントはsqliteDBファイルそのもの
- 通常のsqliteDBファイルをGristドキュメントに変更するツールもある
setImageSrcScript = """ <script> grist.docApi.getAccessToken({readOnly: true}) .then(tokenInfo => { for (let img of document.querySelectorAll('img')) { if (img.dataset.att) { img.src = `${tokenInfo.baseUrl}/attachments/${img.dataset.att}/download?auth=${tokenInfo.token}`; } } }) </script> """ return """ <div style="padding: 24px; background-color: #F4F0FF"> {setImageSrcScript} <h1>{H1}</h1> {att} </div> """.format( setImageSrcScript=setImageSrcScript, H1=$Header, att='\n'.join('<p><img data-att="{}" width="100%">'.format(att.id) for att in $Attachments) )
Gristで作ったゲーム攻略DB
https://docs.getgrist.com/ndCGJ12xHYzn/LostWorld/m/fork