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
  • このアクセスルールを付けてから、重複を含むデータをインポートすると、重複分だけでなく全部エラーになってしまう。この辺りを何とかする方法はわからない。

API定義

  • ソースを自動生成しようとしたらエラーが出た。誰か修正してプルリクエスト投げてくれ。

参照リストの添付ファイルを表示

all_images = $table.Icon
return [image for images in all_images for image in images]

Choice列のインデックスをソートに使用

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ファイルの仕様

  • GristドキュメントはsqliteDBファイルそのもの
  • 通常のsqliteDBファイルをGristドキュメントに変更するツールもある

添付ファイル列の画像の一括アップロード

カンマ区切り文字列を分割して値にする

画像をHTMLウィジエットで大きく表示

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

ぼくが作ったサンプル集

https://reniris.getgrist.com/ws/35046/