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
それでは、スプレッドシートをチェックしてみます。
やった!ちゃんと家計簿が作成されてる!
まとめ
この記事で学べんだこと
- Pythonとスプレッドシートの連携方法
- Pythonからスプレッドシートの最終行を取得する方法
- Python上での質問の作成方法
最後まで、作成できましたでしょうか。
家計簿アプリと呼ぶにはかなり大袈裟かもしれませんが、
初心者レベルの僕にとっては、この程度でも機能を本当に達成感を感じます。
Python上達にはさまざまなプログラムを書いてみることが重要です。
ぜひ、参考にしていただけると嬉しいです。