Claude共有リンクを送る前のCSV棚卸しをPythonで自動化する
共有URLの管理を「送る人の記憶」に任せるのは、もう無理があります。7月27日には、Claudeの共有チャットやArtifactsがGoogleに載った可能性を指摘する記事も出ました。事実関係の続報は追いつつ、営業資料や取引先メールにURLを貼る前に、公開範囲と期限を機械的に見る運用へ寄せたほうがいいです。 記事
僕なら、共有リンクが10本を超えた時点で手作業の確認をやめます。URLを開いて見直す方法は、一見ていねいです。でも「誰が持っているか」「いつまで必要か」「顧客情報が入るか」が別の場所に散るので、最後に一つ漏れます。
ここでは、スプレッドシートの共有台帳をCSVで出し、Claudeの共有リンクに期限があるか、公開範囲が妥当かをPythonで止めます。外部APIは使いません。URLそのものをどこかへ送らないのが、このやり方のよいところです。
先に決める列は6つだけ
シートの1行を共有リンク1本にします。列は次の6つです。
| 列 | 入れる値 |
|---|---|
project |
案件名や用途 |
url |
共有URL |
owner |
削除・見直しをする担当者 |
expires_on |
見直す日。YYYY-MM-DD
|
audience |
社内限定、取引先限定、公開 のどれか |
contains_client_data |
はい または いいえ
|
期限は、リンク自体を自動で無効化できる日付ではありません。「この日に所有者が必要性を見直す」という業務上の約束です。ここを混同すると、台帳だけ立派でリンクは残りっぱなしになります。
台帳から送付判断までの流れは、次の図です。
CSVを検査するPythonスクリプト
スプレッドシートからCSVをダウンロードし、check_shared_links.py と同じフォルダに置きます。Python 3.9以降で動かしました。
project,url,owner,expires_on,audience,contains_client_data
案件A,https://claude.ai/share/abc123,eiri,2026-08-01,取引先限定,はい
採用候補,https://claude.ai/share/def456,eiri,,公開,はい
社内QA,https://example.net/note,eiri,2026/08/01,社内限定,いいえ
#!/usr/bin/env python3
import argparse
import csv
import sys
from datetime import date
from pathlib import Path
from urllib.parse import urlparse
REQUIRED = {"project", "url", "owner", "audience", "contains_client_data"}
AUDIENCES = {"社内限定", "取引先限定", "公開"}
def is_claude_share_url(url: str) -> bool:
parsed = urlparse(url)
host = (parsed.hostname or "").lower()
return host == "claude.ai" and parsed.path.startswith("/share/")
def check_row(row: dict[str, str], row_number: int, today: date) -> list[str]:
issues = []
for field in REQUIRED:
if not row.get(field, "").strip():
issues.append(f"{field} が空です")
url = row.get("url", "").strip()
parsed = urlparse(url)
if url and (parsed.scheme not in {"http", "https"} or not parsed.netloc):
issues.append("URL が http(s) 形式ではありません")
audience = row.get("audience", "").strip()
if audience and audience not in AUDIENCES:
issues.append("audience は 社内限定 / 取引先限定 / 公開 のいずれかにします")
expires_on = row.get("expires_on", "").strip()
if is_claude_share_url(url) and not expires_on:
issues.append("Claude 共有リンクなのに expires_on が空です")
if expires_on:
try:
expires = date.fromisoformat(expires_on)
if expires < today:
issues.append(f"有効期限切れです: {expires_on}")
except ValueError:
issues.append("expires_on は YYYY-MM-DD 形式にします")
if row.get("contains_client_data", "").strip() == "はい" and audience == "公開":
issues.append("顧客情報ありの公開リンクです")
return [f"{row_number}行目({row.get('project', '案件名なし')}): {issue}" for issue in issues]
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("csv_file", type=Path)
parser.add_argument("--today", default=date.today().isoformat())
args = parser.parse_args()
today = date.fromisoformat(args.today)
with args.csv_file.open(encoding="utf-8-sig", newline="") as f:
reader = csv.DictReader(f)
headers = set(reader.fieldnames or [])
missing = REQUIRED - headers
if missing:
print("必要な列がありません: " + ", ".join(sorted(missing)))
return 2
issues = [issue for n, row in enumerate(reader, start=2)
for issue in check_row(row, n, today)]
if not issues:
print("判定: 問題なし")
return 0
print(f"判定: 要確認({len(issues)}件)")
print(*issues, sep="\n")
return 1
if __name__ == "__main__":
sys.exit(main())
実行結果と、ここで止める理由
実行はこれだけです。--today を付けると、テスト時の日付を固定できます。本番では外してかまいません。
python3 check_shared_links.py shared_links.csv --today 2026-07-28
手元で上の3行を実行すると、こう出ました。
判定: 要確認(3件)
3行目(採用候補): Claude 共有リンクなのに expires_on が空です
3行目(採用候補): 顧客情報ありの公開リンクです
4行目(社内QA): expires_on は YYYY-MM-DD 形式にします
終了コードは、問題なしなら 0、要確認なら 1、CSVの必須列が欠けていれば 2 です。毎週の棚卸しをするなら、この終了コードを定期実行のジョブで拾い、1 のときだけ担当者へ知らせれば足ります。
大事なのは、このスクリプトがリンク先の公開設定を判定しているわけではない点です。URLを実際に無効化できたか、閲覧権限が正しいかは、各サービスの画面で確認が必要です。このCSV検査は、その前に「期限なし」「顧客情報ありで公開」のような明らかな見落としを弾くものです。
で、現場でどう使うか
共有URLを安全に扱うコツは、URLを配る前に台帳へ1行足すことです。送付直前の数十秒なら守れますし、後から全部探す作業よりずっと安いです。特に営業や企画では、資料の更新とURLの削除が別担当になりがちです。所有者と見直し日をCSVに残しておくと、やるべき人が曖昧になりません。ここ、地味に効きます。