Python日記

【Python練習帳】超簡単な家計簿アプリをつくってみよう|スプレッドシートAPIで開発

2021年10月15日

Python×スプレッドシート 世界一簡易的な、かつ簡単な家計簿アプリの作成

Pythonの上達のコツは、何をおいても実際にプログラムを作成していくことです。

実践的でもなく、役にも立たない、

そんな機能開発だって、全く問題ありません。

でも、つくったことがないと、一体何をつくったらいいのやら迷ってしまいますよね。

そんなわけで、今回は、

超簡易的な家計簿アプリの作成

に挑戦してみようと思います。

完成形はこんな感じです。

Python上で質問に答えると、スプレッドシートが入力されていく家計簿です。

家計簿 スプレッドシート 実行結果 

Pythonとスプレッドシートを使うだけなので、

Google Sheet APIの設定さえできれば、すぐに完成できます。

Pythonを上達させたい初心者の方が、ちょっとした達成感を得るためには程よい内容かと思います。

ぜひ楽しんで読んでみてください。

Google Sheet APIの設定

Pythonとスプレッドシートの連携には、

Googleが提供しているGoogle Sheets APIを使用します。

そちらは過去に解説をしているので、以下の記事を参照しください。

>>>【GAS】Pythonでスプレッドシートに権限を付与する方法【Google Sheets APIの始め方】

家計簿の設計と、スプレッドシートの準備

今回は、Pythonからスプレッドシートに自動入力する機能を開発していきます。

下記のスプレッドシートを準備しました。

家計簿 スプレッドシート 日付 科目 金額

見ての通り項目は3つだけです。

ポイント

  • 日付
  • 科目
  • 金額

スプレッドシート名:housekeeping

シート名:sheet1

3つの質問を設定

Python上で、3つの質問に答える仕様にしていきます。

ポイント

質問①:いつ購入しましたか? → 答えをスプレッドシートのA列に記入

質問②:科目を選択してください → 答えをスプレッドシートのB列に記入

┗科目選択は次の3つを用意しました:食費、投資、交通費

質問③:いくらでしたか? → 答えをスプレッドシートのC列に記入

Pythonのスクリプト【Gspreadの連携】

inquirerのインストール

今回は、質問②でinquirerの機能を使います。

以下のコマンドでインストールしましょう。

pip install inquirer

Poetryを使っている場合は、こちらです。

poetry run pip install inquirer

スプレッドシートの連携

ここまでは通常通りなので、特に問題ないかと思います。

補足が必要な方は、以下のページの「Pythonのスクリプト作成」の項目で解説をしています。

>>>【GAS】Pythonでスプレッドシートに権限を付与する方法【Google Sheets APIの始め方】

import inquirer

# Google Spreadsheet
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import os
import re
import json
import httplib2
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'client_secret.json'

scope = ["https://spreadsheets.google.com/feeds","https://www.googleapis.com/auth/spreadsheets","https://www.googleapis.com/auth/drive"]
creds = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json',scope)
client = gspread.authorize(creds)

sh = client.open_by_key('xxxxxxxxxxxxxxxxxxxxxxxx')
sheet1 = sh.sheet1

Pythonのスクリプト【家計簿の作成】

Pythonでスプレッドシートの最終行を取得

Pythonでスプレッドシートの最終行を取得するための設定を行います。

家計簿アプリなので、書き込むたびに下の行にデータが積み上がらないといけませんよね。

こんなふうにならないための作業です。笑

#A列のデータを配列として取得
A_COL_ARRAY = sheet1.col_values(1)

#最下行インデックスを取得
LAST_ROW_IDX = len(A_COL_ARRAY)

# 最下行に一行追加 Numberは最大値+1とする。
NEW_NUMBER = int(LAST_ROW_IDX) + 1
print(NEW_NUMBER)

sheet1.col_values(1)の意味は?

sheet1.col_values(1)は、シートの1列目にあるすべての値を意味しています。

つまり、A_COL_ARRAYの変数には、1列目のすべての値をリスト形式で持っているのです。

NEW_NUMBER = int(LAST_ROW_IDX) + 1の意味は?

NEW_NUMBERの変数には、1列目の数+1、つまり最終行の次の行の値です。

家計簿の質問とスプレッドシートへの転記

def purchase_record():
    date = input('いつ購入しましたか?:')
    sheet1.update_cell(NEW_NUMBER,1,date)

    category = [
    inquirer.List('category_select',
                    message="科目を選択してください:",
                    choices=['食費', '投資', '交通費'],
                ),
    ]
    answers = inquirer.prompt(category)
    print (answers["category_select"])
    sheet1.update_cell(NEW_NUMBER,2,answers["category_select"])

    price = input('いくらでしたか?:')
    print(price)
    sheet1.update_cell(NEW_NUMBER,3,price)

if __name__ == '__main__':
    purchase_record()

sheet1.update_cell(NEW_NUMBER,1,date) の意味は?

update_cellはスプレッドシートを上書きする機能です。

引数には、行(数)、列(数)、バリュー(セルに入れたい値)の順番で入力します。

inquirer.List

Pythonで複数の選択肢をつくるには、inquireを使うのが便利です。

choicesの中身を変更すれば、自由に選択肢を変更できます。

Pythonスクリプトのまとめ

import inquirer


# Google Spreadsheet
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import os
import re
import json
import httplib2
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'client_secret.json'

scope = ["https://spreadsheets.google.com/feeds","https://www.googleapis.com/auth/spreadsheets","https://www.googleapis.com/auth/drive"]
creds = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json',scope)
client = gspread.authorize(creds)

sh = client.open_by_key('xxxxxxxxxxxxxxxxxxxxxxxx')
sheet1 = sh.sheet1


#A列のデータを配列として取得
A_COL_ARRAY = sheet1.col_values(1)

#最下行インデックスを取得
LAST_ROW_IDX = len(A_COL_ARRAY)

# 最下行に一行追加 Numberは最大値+1とする。
NEW_NUMBER = int(LAST_ROW_IDX) + 1
print(NEW_NUMBER)

def purchase_record():
    date = input('いつ購入しましたか?:')
    sheet1.update_cell(NEW_NUMBER,1,date)

    category = [
    inquirer.List('category_select',
                    message="科目を選択してください:",
                    choices=['食費', '投資', '交通費'],
                ),
    ]
    answers = inquirer.prompt(category)
    print (answers["category_select"])
    sheet1.update_cell(NEW_NUMBER,2,answers["category_select"])

    price = input('いくらでしたか?:')
    print(price)
    sheet1.update_cell(NEW_NUMBER,3,price)

if __name__ == '__main__':
    purchase_record()

実行結果

Pythonを実行するとこんな質問をされました。

(質問への回答もそのまま記載しています。)

いつ購入しましたか?:10/15
10/15
[?] 科目を選択してください?: 交通費
   食費
   投資
 > 交通費

交通費
いくらでしたか?:680
680

それでは、スプレッドシートをチェックしてみます。

家計簿 スプレッドシート 実行結果 
解決さん

やった!ちゃんと家計簿が作成されてる!

まとめ

この記事で学べんだこと

  1. Pythonとスプレッドシートの連携方法
  2. Pythonからスプレッドシートの最終行を取得する方法
  3. Python上での質問の作成方法

最後まで、作成できましたでしょうか。

家計簿アプリと呼ぶにはかなり大袈裟かもしれませんが、

初心者レベルの僕にとっては、この程度でも機能を本当に達成感を感じます。

Python上達にはさまざまなプログラムを書いてみることが重要です。

ぜひ、参考にしていただけると嬉しいです。

-Python日記