ホーム / お役立ち記事 / Notion のカスタムエージェントで同じ行が2つできる理由|同時に入れた試験と起票の分け方

Knowledge

Notion の​カスタムエージェントで​同じ​行が​2つできる​理由|​同時に​入れた​試験と​起票の​分け方

Notion のカスタムエージェントに台帳の記帳を任せると、同じ内容のページを続けて入れたときに、同じ行が2つできることがあります。弊社の試験(2026年9月・1回)では、約13秒と約23秒の差で入れた同じ内容の2組から、2行ずつできました。弊社はカスタムエージェントを本番の業務では使っていません。原因の切り分け、見分け方、起票を決まった処理に分ける直し方、確かめ方を、弊社の試験と公開の文書でまとめます。

著者: 村山 悠太(ゴムマリ) 最終更新: 2026年11月

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回は、どちらも行を増やさず既存の行を更新したことです。

弊社の​試験: 同じ​内容を​同時に​入れると、​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行の題が違ったので、本文か要約で見比べます。

実行の記録でも確かめられます。公式のヘルプでは、アクティビティのタブに、何がトリガーで、何をしたかが実行ごとに残ります。

直し方​: 起票は​決まった​処理、​要約と​分類は​ AI に​分ける

行を作るかを決める仕事を、エージェントから外します。弊社は問い合わせの台帳の設計で、2026年9月からこの分け方を既定にしています。

仕事 担当 試験で見たこと
同じ件の行があるかの判定と、行の作成 決まった処理 同時に入ると2行できた
受け付けのページとの紐付け(出典) 決まった処理 続報で結ばれない回があった
処理済みの印 決まった処理 何もせず終わる実行があった
要確認の印 立てるのは決まった処理、外すのは人 AI が外した回があった
要約と分類 AI 製品の種類と症状の判定に誤りは無かった

手順は次のとおりです。2〜5は弊社の試験の道具で通した部分で、6は通していません。

  1. 受け付けのページに、同じ物なら同じになるキーを持たせる(弊社の試験では題)
  2. 決まった処理を1本だけ流し、台帳の現物からキーの一覧を読む
  3. キーの行が無ければ作り、受付番号を付けて、受け付けのページを出典に結ぶ
  4. キーの行があれば作らず、出典に足す
  5. 受け付けのページを処理済みにする
  6. 要約と分類の列だけを AI に埋めさせる(行は作らせない。弊社は通していない形)

次のコードは、弊社の試験の道具を縮めたものです。手順の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日に、弊社のワークスペースの試験用のデータベースで、起票を短いスクリプトに分けた形を流しました。本番の業務では使っていません。

  • 通したこと受付番号の発行、出典の紐付け、処理済みの印です。1件を受け付けから解決まで流し、続けて流し直しても行は増えませんでした。
  • 通していないこと分けた形で同じ内容を同時に入れる試験と、AI の要約と分類を同じ流れにつなぐことです。この試験の要約と分類の列は、用意した固定の文でした。

AI の担当のつなぎ方

つなぎ方は、使う AI の機能ごとに確かめます。弊社の試験では、カスタムエージェントは API で入れたページでも動きました。

AI 自動入力は、API で本文を編集した後、17分待っても動きませんでした。詳しくは Notion AI の自動入力が直した値を上書きする理由にまとめています。

公式のヘルプには、カスタムエージェントで列を埋める自動入力もあります。弊社は試していないので、動きは言えません。

落とし穴: 実際に​踏んだ​もの

  • 分けた後も、エージェントが行を作った起票をスクリプトに分けた試験で、エージェントを止めていませんでした。同じ受け付けのページから、スクリプトの行とエージェントの行の2つができました(2026年9月8日・1件)。
    • 分けたら、受け付けのデータベースのトリガーを外します。
  • 要確認の印を、AI が外した別の構成の続報の処理で、最初に立てた要確認が外れました(2026年9月4日・1回)。指示文に外す条件は無く、実行の記録に「要確認:OFF」と残り、誤った相手先はそのまま残りました。
  • 何もせず終わる実行があった本文から相手先を特定できないページで、実行が「アクションなし」で終わりました(2026年9月3日・1回)。ページは未処理のままで、エラーの表示は出ませんでした。
    • 公式のベストプラクティスは、何もしない実行(No action needed)を普通のことと書いています。同じ表示かは確かめていません。
    • 弊社は、未処理で絞ったビューを置く設計にしました。
  • 続報で出典が結ばれない回があった2つの構成の試験で続報を1回ずつ流し、片方は出典が結ばれ、片方は結ばれませんでした。どちらの指示文にも、続報で出典を足す指示は書いていません。
  • 指示文に挙げなかった列は、埋まる行と空の行があった新しい行で埋める列に挙げなかった列が、4行のうち1行だけ空でした。埋めたい列は指示文に挙げるか、決まった処理で入れます。
  • 反映まで5〜6分かかる入れたらすぐ台帳に載る前提で、業務の手順を組まないようにします。

確かめ方​: 受け付けと​台帳を​読み、​4つの​数を​見る

決まった処理を流した後、受け付けと台帳を API で読み、次の4つが0件かを数えます。弊社の試験の道具で見ていたものと同じです。

  • 同じ受け付けのページを出典に持つ行が、2つ以上ある
  • 処理済みなのに、どの行の出典にもなっていない受け付けのページがある
  • 受付番号が空か、重複している行がある
  • 未処理のまま残った受け付けのページがある

次の関数を、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つです。

  • キーの作り方: 人が貼る文には、同じ物を示す値がありません。入口ごとに決めます
  • 決まった処理を流す場所: 1本ずつ流す場所と、止まったときに気づく見張りが要ります
  • AI の担当のつなぎ方: 弊社の実測では、API で本文を編集した後、AI 自動入力は17分待っても動きませんでした

外注する​場合の​判断基準

外注の分かれ目は、台帳の行に重複や抜けが無いことが、業務で要るかです。要約の下書きが目的で人が毎回見直すなら、エージェントのまま使う判断もあります。

外注するなら、見積もりを比べる前に次の3点を確かめてください。

  • 行を作る担当が1つだけになっているか
  • 同じ物を示すキーを、入口ごとに決めているか
  • 受け付けと台帳の件数を、機械で照らす手順があるか

ゴムマリでは、受け付けから台帳までの 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週間〜)

Notion の構築と開発を見る

Related

関連

FAQ

よく​ある​質問

指示文に「同じ件なら追記する」と書けば、防げますか?

弊社の試験の指示文には、台帳を検索して同じ件の続報なら追記する、と書いていました。先に行がある続報では効きましたが、同じ内容を同時に入れた2組では2行ずつできました。ほかの書き方は試していません。

画面からページを入れても起きますか?

同じ内容を同時に入れた弊社の試験は、API で入れた1回だけです。画面から同じ内容を続けて入れる試験はしていません。エージェントが動くこと自体は、画面から入れたページでも API で入れたページでも確かめました。

ページを入れてから台帳に反映されるまで、どのくらいかかりますか?

弊社の2つの試験の構成では、5〜6分でした。4ページを同時に入れても同じでした。Notion の時刻が分単位なのでこれより細かくは測れず、待ちと実行の内訳も測っていません。

モデルを固定すれば、同じ行はできなくなりますか?

弊社は、モデルを「自動」にした構成でしか試していません。公式のヘルプは、動きをそろえたいなら特定のモデルを選ぶよう書いていますが、同じ行ができるかは、固定して確かめていません。

ご相談は​こちらから

相談は無料です。

相談する