テーブルのエクスポート
概要¶
APIを使用して指定したテーブルのエクスポートを行うことができます。
事前準備¶
APIの操作を行う前にAPIキーの作成を実施してください。
リクエスト¶
下記のリクエスト形式で、JSONデータを送信します。
| 設定項目 | 値 |
|---|---|
| HTTPメソッド | POST |
| Content-Type | application/json |
| 文字コード | UTF-8 |
| URL | http://{サーバ名}/api/items/{サイトID}/export (※1) |
| Body | 以下のJSONデータを参考のこと。詳細は「JSONデータレイアウト:共通」を参照してください。 |
(※1){サーバ名}、{サイトID}の部分は、適宜、環境に合わせて編集してください。
pleasanter.netの場合は以下の形式になります。
https://pleasanter.net/fs/api/items/{サイトID}/export
(a) 標準のエクスポート設定でテーブルをエクスポートする¶
JSON¶
(b) Pleasanterで作成済みのエクスポート設定を使用してテーブルをエクスポートする¶
テーブルの管理の「エクスポート」タブにて作成したエクスポート設定を使用してエクスポートを行うことができます。
設定ファイルのJSONにて、APIキーの他に作成したエクスポート設定のIDを指定します。
JSON¶
© エクスポートの設定を設定ファイルに直接記述してテーブルをエクスポートする¶
JSON¶
{
"ApiVersion": 1.1,
"ApiKey": "60gds37dF4fds2D...",
"SsCache": true,
"Export": {
"Name": "テストA-1",
"Columns": [
{
"ColumnName": "Title"
},
{
"ColumnName": "Body"
}
],
"Header": false,
"Type": "csv"
}
}
- Name: エクスポート設定の名前
- Columns: 出力対象となる項目の項目名
- Header: 出力するCSVにヘッダ行を追加するか否かの設定です
- Type: 出力するファイルの種類を指定します。指定できるのは「csv」と「json」の2種類です。
(d) 取得するレコードの絞り込みや並び順を指定してエクスポートする¶
JSON¶
{
"ApiVersion": 1.1,
"ApiKey": "61dsf0D8D4g2DE4df23...",
"SsCache": true,
"ExportId": 1,
"View": {
"ColumnSorterHash": {
"Title": "desc"
},
"ColumnFilterHash": {
"Owner": "[1]"
}
}
}
レスポンス¶
下記の形式のjsonデータが返却されます。
JSON¶
{
"StatusCode": 200,
"LimitPerDate": 10000,
"LimitRemaining": 9990,
"Response": {
"Name": "期限付きテーブル_20xx_xx_xx xx_xx_xx.Csv",
"Content": "\"ID\",\"タイトル\",\"内容\",\"タイトル/内容\",\"コメント\".........."
}
}
サンプルコード¶
Note
コード内の【 ... 】は適宜修正してください。
1. 決めておいたテーブルを、毎日CSVに保存する
決めておいた複数のテーブルを、テーブルのエクスポートAPIでCSVに出力し、実行日(yyyymmdd)のフォルダに保存します。出力する項目と絞り込みはスクリプトに書いておくため、画面のエクスポート設定を変えられても、毎日同じ形のCSVが残ります。タスクスケジューラやcronで毎日実行する想定です。
実務での使いどころ¶
BIツールやExcelでの集計にその日の時点のデータを渡したり、月末の締めや監査のために日付ごとの控えを残したりするのに使えます。画面のエクスポートはテーブルごとに人が操作するもので、決まった時刻に複数のテーブルをまとめてファイルに保存する機能はありません。エクスポートAPIは、画面と同じく表示名の見出しと表示用の値(ユーザー名・状況名など)で、全件を1回で返します。
事前準備¶
1:サンプルコードの【 】を書き替えてください。
2:TABLESに、出力するテーブルを書きます。
| キー | 内容 |
|---|---|
| name | 保存するファイルの名前(拡張子なし) |
| site_id | テーブルのサイトID |
| columns | 出力する項目名(IssueId・ClassAなど)。この順で出力します |
| view | 省略可。レコードを絞り込む条件(JSONデータレイアウト:Viewの形) |
Python¶
# ==========================================================
# 毎日のCSVの控え:決めておいたテーブルを、テーブルのエクスポートAPIでCSVに出力し、
# 実行日のフォルダに保存します。出力する項目と絞り込みはスクリプトに書いておくため、
# 画面のエクスポート設定を変えられても、毎日同じ形のCSVが残ります。
# タスクスケジューラやcronで毎日実行する想定です。
# ==========================================================
import csv
import datetime
import io
import sys
from pathlib import Path
import requests
# ===== 設定 =====
BASE_URL = "【URL】"
API_KEY = "【APIキー】"
OUTPUT_DIR = Path("./exports") # この下に「実行日(yyyymmdd)」のフォルダを作る
# 出力するテーブル。name はファイル名、columns は出力する項目(この順で出力する)。
# view を書くと、そのテーブルのレコードを絞り込んでから出力する
TABLES = [
{
"name": "案件管理",
"site_id": "【案件管理のサイトID】",
"columns": ["IssueId", "Title", "ClassA", "Status", "CompletionTime", "Owner"],
},
{
"name": "作業実績_未完了",
"site_id": "【作業実績のサイトID】",
"columns": ["ResultId", "Title", "ClassA", "NumA", "Status"],
"view": {"ColumnFilterHash": {"Status": '["100","200"]'}},
},
]
def export_table(table):
"""テーブルをエクスポートし、CSVの文字列と件数を返す。失敗したら RuntimeError"""
payload = {
"ApiVersion": 1.1,
"ApiKey": API_KEY,
"Export": {
"Name": table["name"],
"Columns": [{"ColumnName": name} for name in table["columns"]],
"Header": True,
"Type": "csv",
},
}
if "view" in table:
payload["View"] = table["view"]
response = requests.post(
f"{BASE_URL}/api/items/{int(table['site_id'])}/export",
json=payload,
headers={"Content-Type": "application/json"},
timeout=300,
)
body = response.json()
if response.status_code != 200 or body.get("StatusCode") != 200:
raise RuntimeError(body.get("Message", f"HTTP {response.status_code}"))
content = body["Response"]["Content"]
rows = list(csv.reader(io.StringIO(content)))
# 項目名を間違えると、エラーにならず、その列が出力されないため、見出しの列数で確かめる
header = rows[0] if rows else []
if len(header) != len(table["columns"]):
raise RuntimeError(f"出力された列が {len(header)} 列で、指定({len(table['columns'])} 列)と違います。columns の項目名を確かめてください")
return content, len(rows) - 1
def main():
folder = OUTPUT_DIR / datetime.date.today().strftime("%Y%m%d")
folder.mkdir(parents=True, exist_ok=True)
failed = 0
for table in TABLES:
try:
content, count = export_table(table)
except (RuntimeError, requests.RequestException, ValueError) as e:
# 1つのテーブルで失敗しても、ほかのテーブルは出力する
print(f"[NG] {table['name']}: {e}")
failed += 1
continue
path = folder / f"{table['name']}.csv"
# Excel で開けるよう、BOM付きのUTF-8で保存する
with open(path, "w", encoding="utf-8-sig", newline="") as f:
f.write(content)
print(f"[OK] {table['name']}: {count} 件 → {path}")
# 失敗があれば終了コード 1 にして、スケジューラの実行結果で気付けるようにする
if failed:
sys.exit(1)
if __name__ == "__main__":
main()
出力の例(exports/20261027/案件管理.csv)¶
注記¶
- エクスポートAPIは、200件を超えるテーブルでも1回で全件を返します。
columnsに無効な項目名を書くと、エラーにならず、その列が出力されません。このサンプルでは、見出しの列数がcolumnsの数と違えば、そのテーブルを失敗として知らせます。- 画面で作ったエクスポート設定を使う場合は、
Exportの代わりにExportIdを指定します。存在しないExportIdを指定してもエラーにならず、標準の設定(全項目)で出力されます。 - 存在しないサイトIDやレコードのIDを指定すると、「要求が不正です。」で失敗します。1つのテーブルで失敗しても残りは出力し、最後に終了コード1で終わります。
- 古い日付のフォルダは削除しません。必要に応じて、別に削除してください。
エラー時の確認事項¶
・API使用時の注意点やエラーが発生する場合の確認事項
・FAQ:変更後の設定ファイルやAPIリクエスト(JSON形式)が正しく認識されない場合の確認事項
