Pythonを使ってFilemakerを操作してみようってことでやってみました。
#環境
サーバー
windows server 2012 R2
Filemaker server 17
クライアント
windows 10 pro
office 2016
Python 3.8.1
Pycharm Community Edition 2020.2
#やりたいこと
Filemaker serverにアップロードした適当なデータベースに対して検索、更新を行います。想定している業務はマスターメンテナンスです。FilemakerはCRM的な使い方をされることが多いと思うのですが、会計システムなどからマスターを流し込めたら便利ではないかと思います。まあ手でやればいいのかもしれない。
#準備
Filemaker Serverに適当なデータベースがあるものとします。当データベースはWebAPIが公開されてWebAPIでアクセスできるユーザーが既にいるものとします。SSL通信のための証明書は導入していないものとします。
requestsを使います。importしてください。
アクセストークン取得
headers = {'Authorization': 'Basic XXXXXXXXXXXXXXXX', 'Content-Type': 'application/json'}
r_post = requests.post(https://[hostname]/fmi/data/v1/databases/[databasename]/sessions', headers=headers, verify=False)
Excelでゴリゴリ書いていたものがたったの2行で実現できる!素晴らしいぞPython。Basicの後ろはidpwをbase64でエンコードした文字列をコピペしてください。この辺りもっとうまいやり方があるのかもしれないですね。[hostname]と[databasename]はお使いの環境にあわせてください。
検索する
headers = {'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json'}
query = {'query': [{"検索対象フィールド名": keyword}]}
r_post = requests.post( https://[hostname]/fmi/data/v1/databases/[databasename]/layouts/[layoutname]/_find, json=query, headers=headers, verify=False)
非常に簡単ですね。requests.postにはjsonとdataの二つの指定の方法があるみたいですがFilemakerが相手の場合はjsonが楽です。検索のkeywordに対してはFilemakerの検索モード時の指定の仕方、*とか=とかが使えるようです。
更新する
headers = {'Authorization': 'Bearer ' + token, 'Content-Type': 'application/json'}
fieldData = {'fieldData': {'更新対象フィールド名' : value1, '更新ン対象フィールド名' : value2}}
r_post = requests.patch(https://[hostname]/fmi/data/v1/databases/[databasename]/layouts/[layoutname]/records/[recordId], json=fieldData, headers=headers, verify=False)
メソッドがpatchなんだとわかるまで2時間かかりました・・・。精進が足りない。
#おわりに
これで手元のCSVファイルを1行づつ読み取ってFilemaker上にあるマスター系データーベースを部分的に更新することができるようになりました。一括で全データを置換するのであればこんなめんどくさいことはしなくてもよさそうです。