ホーム / お役立ち記事 / Notion のカスタムエージェントで同じ行が2つできる理由|同時に入れた試験と起票の分け方
Knowledge
Notion のカスタムエージェントに台帳の記帳を任せると、同じ内容のページを続けて入れたときに、同じ行が2つできることがあります。弊社の試験(2026年9月・1回)では、約13秒と約23秒の差で入れた同じ内容の2組から、2行ずつできました。弊社はカスタムエージェントを本番の業務では使っていません。原因の切り分け、見分け方、起票を決まった処理に分ける直し方、確かめ方を、弊社の試験と公開の文書でまとめます。
Notion のカスタムエージェントに台帳の記帳を任せると、同じ行が2つできることがあります。弊社の試験では、同じ内容のページを約13秒と約23秒の差で入れたときに起きました。
弊社の試験のエージェントは、ページが入るたびに台帳を検索し、同じ件の行があるかを判断する指示で動きました。先のページの行がまだ無い間に次のページが入ると、どちらも新しい件として行を作る、と弊社は読んでいます。
弊社の分け方は、行を作るかの判断を決まった処理に移し、要約と分類を AI に任せる形です。決まった処理とは、同じ入力なら必ず同じ結果になる処理で、この記事では Notion API を呼ぶ短いスクリプトです。
試験で通したのは、起票の側(受付番号・出典・処理済みの印)までです。分けた形での同時の投入と、AI のつなぎは通していません。
弊社はカスタムエージェントを本番の業務では使っていません。ここに書くのは、弊社のワークスペースで2026年9月に行った試験の結果で、同じ内容を同時に入れた試験は1回です。
この記事は、Notion で問い合わせや案件の台帳を自動で記帳したい業務の担当者・情報システムの担当者に向けて書きます。
原因の切り分け、見分け方、直し方、落とし穴、確かめ方を、弊社の試験と2026年11月3日に読んだ Notion の公開の文書で整理します。
公式のヘルプでは、カスタムエージェントはトリガーや予定をもとに裏で自動で動くものです。トリガーの1つに、データベースにページが追加されたとき、があります。
弊社が読んだ公式のヘルプ2本(カスタムエージェントの説明と、作り方のベストプラクティス)には、同じ内容の行を断る仕組みの説明はありませんでした。同時に動いた実行どうしの扱いの説明もありませんでした。
データベースの ID の列(Unique ID)は、公式の説明では、行ごとに番号を自動で振る列です。同じ内容の行を断る機能としては書かれていません。
ここから先は、公開の文書に書かれていない動きで、弊社の試験の結果です。ページを入れてから台帳に反映されるまで、5〜6分かかりました。
エージェントの実行の画面には、編集の完了を待っている表示が出ました。別の構成のエージェントの記録では、トリガーの「編集が完了するまで待機する」は既定のオンのままでした。
5〜6分のうち待ちが何分かは測っていません。
この間、先に入れたページの行は台帳にまだありません。次に入れた同じ内容のページの実行も「該当なし」と判断して行を作った、と弊社は読んでいます。
実行の中の検索の結果までは確かめていないので、ここは弊社の読みです。裏付けになるのは、先に行がある状態で続報を入れた2回は、どちらも行を増やさず既存の行を更新したことです。
弊社のワークスペースに、試験用のデータベースとカスタムエージェントを作って試しました。お客様の Notion では試していません。
| 項目 | 内容 |
|---|---|
| 試験の日 | 2026年9月3日〜4日 |
| データベース | 受け付け・台帳・相手先の一覧の3つ |
| トリガー | 受け付けのデータベースにページが追加されたとき |
| モデル | 自動 |
| Web アクセス | オフ |
| 指示文の要点 | 台帳を検索し、同じ相手先・同じ件の続報なら既存の行へ追記する。該当が無ければ行を作る。迷ったら要確認を付けて登録する |
結果は次のとおりです。
| 試したこと | 入れ方 | 台帳の行 |
|---|---|---|
| 同じ内容を2組(計4ページ)、約13秒と約23秒の差で | API | 2行から6行へ。同じ内容から2行ずつ |
| 先に行がある件の続報を1ページ | 画面 | 増えない(既存の行へ日付つきで追記) |
4ページはどれも処理され、入れてから反映までは5〜6分でした。1ページずつ入れたときと同じ時間です。
この同時の投入は、狙って組んだものではありません。弊社の作業が重なって同じ投入を2回流したものです。
入れたページが実際に4つあったので、Notion の不具合ではありません。
同じ内容の2行は、2組とも題の字面が違いました。1組は、片方だけ相手先の紐付けが空で要確認が付き、もう片方は紐付けがあって要確認がありませんでした。
同じ内容を同時に入れたのはこの1回だけで、条件を変えて繰り返してはいません。
2026年9月4日に、別の試験用のデータベース4つとカスタムエージェントで、問い合わせの記帳を5ページ試しました。トリガーとモデルは同じです。
先に行がある件の続報は、ここでも行を増やしませんでした。内容の違う2ページを1秒の差で入れても、それぞれ別の行になりました。
製品の種類の判定は5ページとも、症状の判定は新しい行の4ページとも、誤りはありませんでした。相手先の判定は1件外れました。
試験用に用意した5ページなので、精度の数字としては読まないでください。
同じ内容の行を見つけたら、どのページから作られたかで原因を分けます。台帳に、元の受け付けのページを結ぶ列(弊社の試験では「出典」)を持たせておきます。
| 見え方 | 疑う所 |
|---|---|
| 別々の受け付けのページから1行ずつで、作成の時刻が近い | 同じ内容が同時に入った(この記事の原因) |
| 1つの受け付けのページから2行 | 行を作る担当が2つある(下の落とし穴の1つ目) |
題の一致では探せません。上の試験では同じ内容の2行の題が違ったので、本文か要約で見比べます。
実行の記録でも確かめられます。公式のヘルプでは、アクティビティのタブに、何がトリガーで、何をしたかが実行ごとに残ります。
行を作るかを決める仕事を、エージェントから外します。弊社は問い合わせの台帳の設計で、2026年9月からこの分け方を既定にしています。
| 仕事 | 担当 | 試験で見たこと |
|---|---|---|
| 同じ件の行があるかの判定と、行の作成 | 決まった処理 | 同時に入ると2行できた |
| 受け付けのページとの紐付け(出典) | 決まった処理 | 続報で結ばれない回があった |
| 処理済みの印 | 決まった処理 | 何もせず終わる実行があった |
| 要確認の印 | 立てるのは決まった処理、外すのは人 | AI が外した回があった |
| 要約と分類 | AI | 製品の種類と症状の判定に誤りは無かった |
手順は次のとおりです。2〜5は弊社の試験の道具で通した部分で、6は通していません。
次のコードは、弊社の試験の道具を縮めたものです。手順の2〜5にあたり、題をキーにします。
API の版と列の名前は、試験のものです。
# intake.py 1本だけ流す(同時に2本動かさない)
import json
import os
import urllib.request
API = "https://api.notion.com/v1"
HEADERS = {"Authorization": "Bearer " + os.environ["NOTION_TOKEN"],
"Notion-Version": "2022-06-28", "Content-Type": "application/json"}
INBOX = "<受け付けのデータベースの ID>"
LEDGER = "<台帳のデータベースの ID>"
YEAR = 2026
def api(method, path, body=None):
data = json.dumps(body, ensure_ascii=False).encode() if body is not None else None
req = urllib.request.Request(API + path, data=data, headers=HEADERS, method=method)
with urllib.request.urlopen(req, timeout=60) as r:
return json.load(r)
def rows(db):
out, cur = [], None
while True:
body = {"page_size": 100, **({"start_cursor": cur} if cur else {})}
res = api("POST", f"/databases/{db}/query", body)
out += res["results"]
if not res.get("has_more"):
return out
cur = res["next_cursor"]
def text(page, name):
p = page["properties"][name]
return "".join(x["plain_text"] for x in p.get("title") or p.get("rich_text") or [])
def status(page):
return (page["properties"]["処理状態"]["select"] or {}).get("name", "")
def rich(s):
return [{"type": "text", "text": {"content": s}}]
def next_number(used):
n = 1
while f"{YEAR}-{n:04d}" in used:
n += 1
return f"{YEAR}-{n:04d}"
def run_once():
current = rows(LEDGER) # 現物からキーと番号を読む
ledger = {text(p, "件名"): p for p in current}
used = {text(p, "受付番号") for p in current}
for inb in rows(INBOX):
key = text(inb, "タイトル").strip()
if status(inb) != "未処理" or not key:
continue # キーの無いページは作らず、未処理のまま人に回す
page = ledger.get(key)
if page is None:
number = next_number(used)
used.add(number)
page = api("POST", "/pages", {"parent": {"database_id": LEDGER}, "properties": {
"件名": {"title": rich(key)},
"受付番号": {"rich_text": rich(number)},
"ステータス": {"select": {"name": "新規"}},
"出典": {"relation": [{"id": inb["id"]}]}}})
else:
sources = page["properties"]["出典"]["relation"] + [{"id": inb["id"]}]
page = api("PATCH", f"/pages/{page['id']}", {"properties": {"出典": {"relation": sources}}})
ledger[key] = page
api("PATCH", f"/pages/{inb['id']}", {"properties": {"処理状態": {"select": {"name": "処理済み"}}}})
if __name__ == "__main__":
run_once()
縮めたコードは、手元の模擬の API で動きを確かめました(同じ題の2ページで1行になる・流し直しても増えない)。Notion で流したのは、縮める前の道具です。
縮める前の道具は、受け付けの題の頭に印を付けて台帳の件名と対応させ、既に行があるときは出典を今のページに置き換えていました。記事のコードは、題をそのままキーにし、出典に足す形にしました。
このコードは、キーが同じ物しか同じと判定しません。人が同じ内容を別々の題で貼ったページは2行になります。
決まった処理も、同時に2本動かせば同じことが起きうると弊社は見ています。読んでから作るまでの間に隙間があるためです。
弊社の別の投入は作りが違い、現物でなく手元の記録で判断する処理を3つ同時に流して、約3倍の行になりました。
その件とロックの作り方は、Notion API で一括登録すると重複行ができる理由にまとめています。
2026年9月8日に、弊社のワークスペースの試験用のデータベースで、起票を短いスクリプトに分けた形を流しました。本番の業務では使っていません。
つなぎ方は、使う AI の機能ごとに確かめます。弊社の試験では、カスタムエージェントは API で入れたページでも動きました。
AI 自動入力は、API で本文を編集した後、17分待っても動きませんでした。詳しくは Notion AI の自動入力が直した値を上書きする理由にまとめています。
公式のヘルプには、カスタムエージェントで列を埋める自動入力もあります。弊社は試していないので、動きは言えません。
決まった処理を流した後、受け付けと台帳を API で読み、次の4つが0件かを数えます。弊社の試験の道具で見ていたものと同じです。
次の関数を、intake.py の if __name__ の行の前に足し、run_once() の後に audit() を呼びます。
def audit():
ledger, inbox = rows(LEDGER), rows(INBOX)
by_source = {}
for p in ledger:
for r in p["properties"]["出典"]["relation"]:
by_source.setdefault(r["id"], []).append(text(p, "件名"))
numbers = [text(p, "受付番号") for p in ledger]
found = {
"同じ出典の行": [v for v in by_source.values() if len(v) > 1],
"出典の無い処理済み": [text(p, "タイトル") for p in inbox
if status(p) == "処理済み" and p["id"] not in by_source],
"番号の空か重複": len(numbers) - len(set(numbers)) + numbers.count(""),
"未処理": [text(p, "タイトル") for p in inbox if status(p) != "処理済み"],
}
print(found)
return not any(found.values())
直ったかは、同じ題の受け付けのページを2つ入れて流し、台帳の行が1つ、出典が2つになるかで見ます。流せばその場で判定できます。
エージェントのままの構成で試すなら、同じ内容のページを2つ続けて入れ、5〜6分待って行の数を見ます。弊社は1回しか試していないので、1回で起きなくても、起きないとは言えません。
同じ行ができているかを確かめ、上のコードで起票を分けるところまでは、Notion API を読める人なら自力でできます。
自力の壁は次の3つです。
外注の分かれ目は、台帳の行に重複や抜けが無いことが、業務で要るかです。要約の下書きが目的で人が毎回見直すなら、エージェントのまま使う判断もあります。
外注するなら、見積もりを比べる前に次の3点を確かめてください。
ゴムマリでは、受け付けから台帳までの Notion のデータベースの設計と構築を、業務データベースの開発・構築(Notion 対応)として承ります。
料金は初期30万円から、保守は月3万円から、期間は2週間からです。
1つの業務を回す仕組みとして作る場合は、AIエージェント導入で承ります。料金は初期50万円から、月5万円からです。
進め方は相談からご連絡ください。
まず、今の台帳で、同じ内容の行がどの受け付けのページから作られたかを見てください。別々のページからなら同時の投入を、1つのページからなら行を作る担当が2つあることを疑います。
API で一括で行を作っていて重複したなら、Notion API で一括登録すると重複行ができる理由の直し方が近いです。
同じデータベースへ複数の処理がアクセスして止まるなら、Notion API が 429 で止まる理由を見てください。
関連記事: Notion AI で書類を作り、照合する進め方/Notion AI の自動入力が直した値を上書きする理由/Notion API で一括登録すると重複行ができる理由
ワークスアプリケーションズで大手企業向けERPの営業と導入を担当し、外資系SaaS企業と国内大手放送局で販路と新規事業の立ち上げ、AI学習用データを扱うAIスタートアップ2社でマーケティングと営業を担った。2024年10月から生成AIの実装に入り、いまは大手企業の現場で、AIエージェントを要件定義から運用まで手がけている。
Ask
Notion をお使いの会社
Notion の構築と開発
データベースの設計と移行、ほかのシステムとの同期、Notion AI で書類を作り照合する仕組み、Notion Workers の開発、保守まで、まとめてお引き受けします。
初期 30万円〜(2週間〜)
Related
Excel の台帳を Notion へ移すには、表の形とキーを決め、型を決めてリレーションと一緒に取り込み、数式と集計を作り直してから、件数・キー・値・先頭のゼロ・空の値・リレーション・計算の結果の7つで照合します。Notion の公式ヘルプと API の文書の決まりと、弊社が管理表の約2千明細を移し、Notion で計算した残が移したすべてのロットで元の表と一致した照合の手順でまとめます。
活用ガイドNotion AI に書類を作らせて照合するときは、手順を Notion AI への指示書、読めば決まる処理を添付のコード、1回ごとの結果を記録のデータベースに分けます。弊社の導入の事例の試作では、同じ題材で、文章の指示は発注番号を3回のうち2回誤り、添付のコードは2回とも誤りませんでした。分け方の問い、進める手順、誤りを仕込む照合の進め方を、弊社の記録でまとめます。
FAQ
弊社の試験の指示文には、台帳を検索して同じ件の続報なら追記する、と書いていました。先に行がある続報では効きましたが、同じ内容を同時に入れた2組では2行ずつできました。ほかの書き方は試していません。
同じ内容を同時に入れた弊社の試験は、API で入れた1回だけです。画面から同じ内容を続けて入れる試験はしていません。エージェントが動くこと自体は、画面から入れたページでも API で入れたページでも確かめました。
弊社の2つの試験の構成では、5〜6分でした。4ページを同時に入れても同じでした。Notion の時刻が分単位なのでこれより細かくは測れず、待ちと実行の内訳も測っていません。
弊社は、モデルを「自動」にした構成でしか試していません。公式のヘルプは、動きをそろえたいなら特定のモデルを選ぶよう書いていますが、同じ行ができるかは、固定して確かめていません。