【AppSheet】請求書を作ろう~シンプルver.~

はじめに

今回は請求書作成システムの開発を行ないます。

ひとくちに請求書といっても、様々な形式がありますが、今回作るのは『シンプルバージョン』です。

もちろん、シンプルバージョンと言っても、請求書として必要な項目はすべて揃っているのでご安心ください。

では、さっそく解説していきます!

完成イメージ

以下が完成した請求書作成システムのイメージです。

動画

また、作成された請求書は以下です。

テーブルの設定

テーブルは以下の4つです。

①請求ヘッダ
②請求明細
③入金データ
④顧客データ
⑤検索用

以下、ひとつずつ説明していきます。

①請求ヘッダ

請求書の様な合計と明細が必要な書類は、ヘッダと明細の2つに分割します。

見積書や納品書なども同様ですので、これは1つ覚えておきましょう。

青文字はすべてバーチャルカラムです。

・ID
・請求日(Date)
・支払期限(Date)
・ステータス(Enum)
・顧客名(Ref)
・請求書発行回数(Number)
・PDF(File)
・Related 請求明細s(自動生成)
・Related 入金データs(自動生成)

・10%対象金額(Price)

SUM([Related 請求明細s][10%対象])

・8%対象金額(Price)

SUM([Related 請求明細s][8%対象])

・0%対象金額(Price)

SUM([Related 請求明細s][0%対象])

・請求金額(税込)(Price)

[10%対象金額] * 1.1 + [8%対象金額] * 1.08 + [0%対象金額]

・請求金額(税抜)(Price)

SUM([Related 請求明細s][金額])

・入金金額合計(Price)

SUM([Related 入金データs][入金金額])

・請求残高(Price)

[請求金額(税込)]-[入金金額合計]

・10%消費税(Price)

[10%対象金額]*0.1

・8%消費税(Price)

[8%対象金額]*0.08

・消費税合計(Price)

[10%消費税]+[8%消費税]

このテーブルのポイントは「消費税」です。

通常であれば、「消費税」というバーチャルカラムを1つ準備し、SELECTなどを使って計算結果を入れるのですが、ここでは各税区分ごとにカラムを作ってます。

理由は、SELECTを使ったバーチャルカラムは、将来的にデータが増えると重くなるためです。

特に、請求書のような数年にわたり保管義務のあるものはデータ量が莫大になるので、今回のような形式にした方が良いでしょう。

②請求明細

ヘッダを作成したら、次に請求明細を作ります。

それぞれの請求明細に請求ヘッダのIDを持たせることで、それぞれの明細を特定の請求ヘッダにまとめることができます。

カラムは以下の通りです。

・ID(Text)
・請求ヘッダ(Number)
・仕様(Text)
・個数(Number)
・単価(Price)
・税率(Enum)
・10%対象(Price)

IF([税率]="10%",[金額],0)

・8%対象(Price)

IF([税率]="8%",[金額],0)

・0%対象(Price)

IF([税率]="0%",[金額],0)

・備考(Text)
・金額(Price)

[個数]*[単価]

10%対象、8%対象、0%対象はFOMULAに関数を入力してください。

また、「税率」からむのEnumは「10%、8%、0%」の三つが選択肢です。

ここでとても重要なこととして、

「%」は必ず全角にしてください。

今回、「税率」カラムはテキストとして読み取らせますが、半角の%だと、勝手に百分率に変換されてしまいます。

そのため、%は必ず全角で表記するようにしてください。

③入金データ

・ID(Text)
・請求ヘッダ(Ref)
・入金日(Date)
・入金金額(Price)
・備考(Text)

③顧客データ

・ID(Text)
・顧客名(Text)
・住所(Text)
・担当者(Text)
・Related 請求ヘッダs(自動生成)
・Related 検索用s(自動生成)

④検索用

・ID(Text)
・開始日(Date)
・終了日(Date)
・顧客名(Ref)

「検索用」テーブルの使いどころは、次のUIのViewの設定で詳しく解説していきます。

Viewの設定

テーブルの設定が終わったら、次はビューの設定に入ります。

ビューの全体像は以下です(わかりやすくAppSheetの画像を添付します)

REFERENCE VIEWSにある3つのビューは、「ダッシュボード」ビューの構成要素になります。

「ダッシュボード」ビューの全体像と動きは以下です。

「検索」ビューで指定された条件で「請求ヘッダ」ビューがフィルターされ、「請求ヘッダ」ビューをクリックすると、その詳細が「請求ヘッダ詳細」ビューに表示されます。

それでは、REFERENCE VIEWSのビューから解説します。

「検索」ビュー

・View name:検索

・For this data:検索用

・View type:detail

View Optionsの「Quick edit columns」で「Add」をクリックし、開始日、終了日、顧客名を追加します。

この「Quick edit columns」、今回の検索機能で重要になります。

ここで選択した項目が、検索時に任意で値を変更できる箇所です。

「請求ヘッダ」ビュー

・View name:請求ヘッダ

・For this data:ダッシュボード請求ヘッダ
※スライスで新規につくります

・View type:deck

View Optionsの「Group by」は「請求日」の「Descending」とします。

スライスの作成

請求ヘッダビューでは、先で作成した「検索」ビューに応じて、表示内容をフィルターさせる必要があります。

このフィルターは、スライスによって制御していきます。

・スライス名:ダッシュボード請求ヘッダ

・Row filter condition

AND(
  IF(ISBLANK(検索用[検索用[開始日]]), TRUE, [請求日] >= INDEX(検索用[開始日], 1)),
  IF(ISBLANK(検索用[検索用[終了日]]), TRUE, [請求日] <= INDEX(検索用[終了日], 1)),
  IF(ISBLANK(検索用[顧客名]), TRUE, IN([顧客名], 検索用[顧客名]))
)

まず、ISBLANK()に関しては、未選択の状態を制御しています。

IFを使って、ISBLANK()の場合をTRUEとすることで、選択欄が未選択(空欄)の場合に、すべてのレコードを表示するようにしています。

次に、[請求日] >= INDEX(検索用[開始日], 1)は、開始日より後の請求日の請求ヘッダを表示します。

INDEXを使っている理由は、LIST形式からDate形式に変換するためです。

検索用[開始日]だけだと、List形式となってしまい、Date形式である[請求日]と型が一致しません。

そのため、INDEXを使うことで、List内にある任意の値(今回は[開始日])を抽出し、Date型である[請求日]と比較することができます。

IN()関数については、請求ヘッダの「顧客名」カラムから、検索用の「顧客名」と一致したものにTRUEを返す、という形です。

以上のようなスライスをつくることで、検索による動的な値変換が可能になります。

「請求ヘッダ詳細」ビュー

・View name:請求ヘッダ詳細

・For this data:ダッシュボード請求ヘッダ

・View type:detail

「ダッシュボード」ビュー

・View name:ダッシュボード

・View type:dashboard

View Optionの「View entries」は以下です。

・検索:Tall
・請求ヘッダ:Tall
・請求ヘッダ詳細:Large

また、Interactive modeは必ずONにしてください。

これをONにしておかないと、特定の請求ヘッダをクリックしても、「請求ヘッダ詳細」ビューが動的に動きません。

「顧客データ」

・View name:顧客データ

・For this data:顧客データ

・View type:table

これは顧客データを登録するためのViewなので、自由に設定してください。

以上で、Viewの設定は完了です。

アクションの設定