見出し画像

Notionで在庫管理する

使いにくかったんだよ。

↓前回↓

辿り着いた経緯

一番悪戦苦闘したのがここなのでメモ。いらない人は目次から「使うもの」までどうぞ〜。


前回のは、作りながら「これ滅茶苦茶使いにくいだろうな……」と思ってました。試運転結果も使いにくかった。
んで、一番使いやすくて用途的に向いてるのがNotion。はい、いつもの。

ただ、Notionにすると確認して減らす動作の時にネット接続がない・iPhoneの電池がないと、数が減らない。
つまりはエラーを吐く。だいぶ困るタイプのエラーを吐く。

色々調べた結果、自動実行はサーバーレスがおすすめ、とのことだったので、そっちに舵を切りました。

元々はGoogleCloudとかMicrosftAzureとかAWSとか使おうとしてました。サーバーレスの有名どころですね。

が、しかし。
全部のサービスで利用者確認のためにカード情報登録を求められ、そして全部のサービスが銀行側から弾かれました。そんなことある??

仕方がないからレンタルサーバーで調べ。Xfreeに辿り着くも新規は出来ず。

完全に別件で調べて放置していたzapierで定期実行が出来ることがわかり、それを使って動かすことにしました。

python言語を使ってな!!!!
(ノーコードだと無料範囲外)


使うもの

  • Notion
    (管理するため)

  • 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音順

この記事が気に入ったらサポートをしてみませんか?