Notionで在庫管理する
使いにくかったんだよ。
↓前回↓
辿り着いた経緯
一番悪戦苦闘したのがここなのでメモ。いらない人は目次から「使うもの」までどうぞ〜。
前回のは、作りながら「これ滅茶苦茶使いにくいだろうな……」と思ってました。試運転結果も使いにくかった。
んで、一番使いやすくて用途的に向いてるのがNotion。はい、いつもの。
ただ、Notionにすると確認して減らす動作の時にネット接続がない・iPhoneの電池がないと、数が減らない。
つまりはエラーを吐く。だいぶ困るタイプのエラーを吐く。
色々調べた結果、自動実行はサーバーレスがおすすめ、とのことだったので、そっちに舵を切りました。
元々はGoogleCloudとかMicrosftAzureとかAWSとか使おうとしてました。サーバーレスの有名どころですね。
が、しかし。
全部のサービスで利用者確認のためにカード情報登録を求められ、そして全部のサービスが銀行側から弾かれました。そんなことある??
仕方がないからレンタルサーバーで調べ。Xfreeに辿り着くも新規は出来ず。
完全に別件で調べて放置していたzapierで定期実行が出来ることがわかり、それを使って動かすことにしました。
python言語を使ってな!!!!
(ノーコードだと無料範囲外)
使うもの
Notionのページ
複製して使ってください。
プロパティは適当。以下に説明入れときますね。
*が付いたプロパティ以外は自由にしてどうぞ。
*サイクル(日数)
何日ごとになくなるか、のサイクル。*在庫
在庫データベースへのリレーション在庫数
リレーションでつながってる個数*期限
今の在庫でいつまでもつかボタン
押したらリレーションされたページが在庫に増える*一番古い在庫
検索用。サイクルを過ぎたら、使用されたとして削除する*最終確認日
検索用。削除のタイミングを出すため。*次回確認日
検索用。次削除する日。
コード
言語はぜーんぶpythonです。
選択肢の中でまだできるのがこれだった。
説明の手間の関係でバラしてますが、順番はそのままです。
コピペコピペで対応可。
変数設定
# 今日の日付取得
import datetime
today = datetime.datetime.now()
today = today.strftime('%Y-%m-%d')
# Notion基本
import requests
apiKey = "***"
databaseId = "***"
stockDatabaseId = "***"
header = {
"Notion-Version": "2022-06-28",
"Authorization": "Bearer " + apiKey,
"Content-Type": "application/json"
}
全体共通で使う変数たちを設定してるとこ。
「apiKey」:integration
「databaseId」:定期的に減らすもののデータベースのID
「stockDatabaseId」:在庫データベースのID
確認日が今日のものを検索
# 確認日が今日のものを検索
url = searchUrl = "https://api.notion.com/v1/databases/" + databaseId + "/query"
jsonData = {
"filter": {
"property": "次回確認日",
"formula": {
"date": {
"equals":today
}
}
}
}
response = requests.post(url,headers = header,json = jsonData)
result = response.json()
result = result["results"]
filterを使って、「次回確認日」が今日のものを取得。
このあと編集用に使います。
削除・確認日更新
# 結果から繰り返し
for i in range(len(result)):
# 変数設定
cheackedPageId = result[i]["id"]
oldItemID = int(result[i]["properties"]["一番古い在庫"]["formula"]["string"])
# 確認日更新
url = updateUrl = updateUrl = "https://api.notion.com/v1/pages/" + cheackedPageId
jsonData = {
"properties":{
"最終確認日":{
"date":{
"start":today
}
}
}
}
response = requests.patch(url,headers=header,json=jsonData)
print(response.json())
# 検索
jsonData = {
"filter":{
"property":"ID",
"unique_id":{
"equals":oldItemID
}}
}
url = "https://api.notion.com/v1/databases/" + stockDatabaseId + "/query"
response = requests.post(url,headers=header,json=jsonData)
oldItemId = response.json()["results"][0]["id"]
# 削除
url = "https://api.notion.com/v1/pages/" + oldItemId
jsonData = {"archived": True}
response = requests.patch(url,headers=header,json=jsonData)
検索結果が配列なので、for関数で対応。
関数でリレーション設定できるし、idとれるかなー
→タイトルテキストだけ
だったので、IDプロパティを使って検索とページ指定、「archived」でゴミ箱行きにしています。
参考
タイトル50音順
2024/09/07 追記
Notionページのリンク先がおかしくなっていたので修正しました。ご迷惑をお掛けしました。
多分コレで大丈夫、なはず。