Open5

書籍管理アプリをAppSheetで作る - バージョン1

aromariousaromarious

はじめてのAppSheet

AppSheet(Googleのノーコード開発)を使ってみたくなった。ただいま自室の書籍を絶賛整頓中なので、これを題材にする。

  • バージョン1…書籍情報のCRUD
  • バージョン2…メルカリに出すものをピックアップできるようにする
  • バージョン3…メルカリへの出品ワークフローを追えるようにする

要件

  • バーコードを読み取って書籍情報を自動取得したい
  • データをスプレッドシートで見たい
  • AppSheetで完結しない場合、GASで連携可能な範囲でおさめる
  • 自分ひとりで使えればよい
  • iPhoneで利用する

AppSheetで何ができるのかおおまかに調べる

  • データソースの種類
    • Googleスプレッドシート
    • Excel
    • ASDB(AppSheet DB) ※このDBは外部(GASなど)から操作できないとのこと
    • MySQL, SQLServerなどDBサーバ
  • 無料で利用可能な範囲
    • できること
      • アプリ作成とモバイルアプリケーション利用
      • 各種データソース、UI、イベント、プロセスなどの利用
      • GAS呼び出し、バーコードスキャンもOK
    • できないこと
      • デプロイ
      • サインイン
      • メール送信、通知など

DBスキーマを用意すれば、UIのあれこれはよきにはからってくれる雰囲気。業務ロジックを書くのはBotのProcess内になるようだ。もちろん直接コードを書くことはできない。WebhookまたはGASの関数呼び出しで処理する模様。

やりたいことはできそう。Processに直接GAS呼び出しを書けるし、UI要素にバーコードスキャンを設定できるのは便利だ。

次はGASで書誌情報の取得のスクリプトを書けるか調べる。

aromariousaromarious

書誌情報取得調査

これを調べようとしたところ、同じくAppSheetで似たアプリを作っている記事が引っかかった。

https://qiita.com/takatama/items/8c4f7f657d9925cde57f

助かる! バージョン1はできたようなものだ。

バージョン1開発手順

この開発は動かしたことのないものが多い(AppSheet、書誌API)。未確認の要素をひとつずつ動作確認しながら作っていく。

AppSheetを作成し、GASを呼び出す部分

まずAppSheetを新規作成し、作ったAppSheetからGASを呼び出す部分を実装。

【手順】

  1. GoogleSheetsに書籍DBに使用するスプレッドシートを作成する
    テーブルは1つ、スキーマはさきほどの記事を参考に作成
  2. そのシートからAppSheetを新規作成する
    作成したAppSheetのDataのスキーマをチェックし、修正する
  3. AppSheetのBot(EventやProcess)を作成する
    まずEvent→Processが動作する簡単なBotを作って動作確認する
  4. 書誌情報取得のGAS関数を呼び出して動作確認する

書誌情報を取得するGASスクリプトを書く

書誌APIも初めて使う。GASには慣れているのでいつもの手順を使う。

  • Google Books API を使う。取得できない書籍がけっこうあるという情報を見たが、別のAPIを追加できるようにだけしておき、どこまで実装するかは運用に入ってから考える
  • GASは普段、手元でasideを使い、TypeScriptで書いてトランスパイルしてからpushしている。今回もその方法で開発する

【手順】

  1. APIリクエストを送信するツールで Google Books API を呼び出し、想定した動作かどうか確認する
  2. GASの関数からAPIを呼び出して結果を返すコードを書き、動作確認する
aromariousaromarious

バージョン1実装ログ

AppSheetからGASを呼び出す

  1. GoogleSheetにスキーマを作り、そこからAppSheetを作成した
  2. Dataのスキーマを修正した

  3. AppSheetのBot(Event, Process)の動作確認をした
    わかりやすい動作をするTask(Taskを複数組み合わせてProcessを作る)がない。今までのGASプロジェクトで既に動作しているコードから、Discordにpostする部分を持ってきて使うことにした。手軽に確認できるデバッグ出力として使う。
    Event: 新しいレコードを作成した時
    Process: GASの関数を呼び出す
aromariousaromarious

書誌情報を取得するGASスクリプトを実装

  1. APIリクエストを送信するツールで Google Books API を呼び出し、想定した動作かどうか確認する
    VSCode の ThunderClient でAPIリクエストを発行し、レスポンスをチェックする
  2. asideでプロジェクトを作る
  3. ISBNを引数にして書誌情報APIを叩く関数を書く
    いつもやっていることは簡単。書いて動作確認できた

AppSheetからGASを呼び出す部分を実装

参考にした記事ではGASがスプレッドシートに直接書誌データを記入しているが、ここのロジックはAppSheet側の責務だと思うのでそう書くことにした。
【動作フロー】

  1. AppSheet: 新規書籍の登録をトリガーに、GASをコールする。引数はISBN
  2. GAS: 書誌情報取得APIを呼び出して、その情報をAppSheetに返す。
  3. AppSheet: GASの戻り値を受け取って、列を埋める

【実装手順】

  1. GASで簡単なオブジェクト(リテラルで書く)を返す関数を作る
  2. AppSheet側で呼び出して、戻り値を受け取るための設定を試す
  3. AppSheet側で列を埋める設定を試す
    "Run a data action" というステップで "Set row values" をすればよいらしい
  4. 書誌情報取得の関数で同じことをする

まで終わったところのスクショ。

イベントの設定。Data Change Type は実際は Adds のみに設定

GASの書誌情報の戻り値はオブジェクト。それを受け取る時の AppSheet での型を指定する

取得した書誌情報でカラムを埋める設定

これでバージョン0はできた。少し調整したいところがある。できるかどうか調べる。

aromariousaromarious

バージョン1 課題

入力項目を非表示にしたい

書誌情報をセットするために、各列を editable にしてある。しかしそうするとUIの新規作成や編集画面で各項目の入力欄が表示されてしまう。使えなくはないが、編集できないようにしたい。
→ 自動的に生成された Books_Form(新規作成と編集の入力フォーム)で、表示する/しないが選べた。

編集ボタンをなくしたい

書籍の情報はISBNを使って新規作成するだけで、編集することはない。削除はするかもしれないが、編集は不要。デフォルトでは編集画面に遷移するパーツや操作が各所に仕込まれている。これをなくしたい。
→ なくせた。

他の仕事と並行して、リアルタイムで記録しながら作っている。最初だから少し手こずったが、慣れればさっさと作れそう。

動く様子↓
https://youtube.com/shorts/aLGMmLA3bp4?si=XGJr7Q-bCPHXUCi_

次▶️ AppSheetのアーキテクチャを整頓した
https://zenn.dev/aromarious/scraps/c4cd697acb0a4b