NotionボタンからNotion Workersを呼び出して、APIで複雑なテンプレート処理を実行する
Notionボタンを押したときにWebhookを送り、Notion Workers上のTypeScriptを実行する仕組みを作ったので紹介します。
この仕組みを使うと、Notionの標準テンプレートだけでは表現しにくい「別のデータベースを条件で検索し、見つかったページごとに複数のページを作成する」といった処理を、Notion APIで実装できます。
今回作ったのは、ステータスが「検証中」の仮説を検索し、それぞれに今週分のPlanningとReviewを作成するボタンです。

Notion Workersとは
Notion Workersは、Node.jsとTypeScriptで書いた小さなプログラムをNotion上で動かす仕組みです。Notionが実行環境を提供するため、Webhookを受け取るためのサーバーを別に用意する必要はありません。
Workerには、外部データを同期するSync、Custom Agentから呼び出すTool、HTTPリクエストを受け取るWebhookという機能があります。この記事ではWebhookを使います。2026年7月31日時点ではベータ版です。提供状況はNotionのリリース情報で確認できます。
処理の流れは次のようになります。
- Notionボタンを押す
- ボタンがNotion WorkerのWebhook URLへPOSTリクエストを送る
- Notion WorkerがTypeScriptの処理を実行する
- WorkerがNotion APIで対象ページを検索する
- 条件を満たすページごとにPlanningとReviewを作成する
NotionのWebhookアクションは、通常のボタン、データベースボタン、データベースオートメーションから利用できます。そのため、手動のボタンだけではなく、データベースの更新をきっかけに同じWorkerを呼び出す構成にもできます。
仮説検証のPlanningとReviewをまとめて作る
Massivでは、仮説を管理するデータベースと、仮説ごとの検証を管理するデータベースを分けています。
週の始めには、ステータスが「検証中」の仮説ごとにPlanningを作り、週の終わりに振り返るためのReviewも用意します。作成するページには、元の仮説へのRelation、1週間の期間、PlanningまたはReviewというステータスを設定します。
この処理で必要なのは、次のような操作です。
- 別のデータベースから「検証中」の仮説をすべて検索する
- 検索結果の件数に合わせて繰り返す
- 1つの仮説につきPlanningとReviewの2ページを作る
- 作成したページと元の仮説をRelationで結ぶ
Notionの標準ボタンやテンプレートは、決まったページを作る処理には向いています。一方で、検索結果の件数が毎回変わる処理は、1つのボタン設定だけでは表現しにくくなります。
そこで、ボタンは処理の開始だけを担当し、検索や作成のロジックはWorkerへ移しました。

Webhookを登録する
Workerでは、worker.webhook()でWebhookを登録します。次のコードは、実際の実装から主要部分を抜き出したものです。
import { Worker } from "@notionhq/workers";
const worker = new Worker();
export default worker;
worker.webhook("createWeeklyHypothesisValidations", {
title: "Create Weekly Hypothesis Validations",
description:
"Creates this week's Planning and Review records for hypotheses under validation",
execute: async (events, { notion }) => {
for (const event of events) {
const week = getTokyoWeek(new Date());
const store = new NotionHypothesisValidationStore(notion, config);
const result = await createWeeklyHypothesisValidations(store, week);
console.log(
JSON.stringify({
deliveryId: event.deliveryId,
week,
...result,
}),
);
}
},
});
デプロイすると、Workerに対するWebhook URLが発行されます。ntn workers webhooks listでWebhook URLを確認し、Notionボタンの「Webhookを送信する」に設定します。
ntn login
ntn workers deploy --name weekly-hypothesis-validations
ntn workers webhooks list
Notion WorkersのWebhookはリクエストを受け取ると202 Acceptedを返し、Workerを非同期で実行します。そのため、ボタンを押した画面で処理結果を同期的に返す用途ではなく、ページ作成などの後続処理を開始する用途に向いています。
検索結果ごとにページを作成する
検索した仮説ごとに、PlanningとReviewを作成します。ページ作成時にRelation、ステータス、週の期間をまとめて設定できるのは、Notion APIへ処理を移す利点です。
await notion.pages.create({
parent: {
type: "data_source_id",
data_source_id: validationsDataSourceId,
},
properties: {
検証: {
title: [
{
mention: {
type: "date",
date: { start: titleDate },
},
},
{ text: { content: ` ${hypothesis.title}` } },
],
},
仮説: {
relation: [{ id: hypothesis.id }],
},
ステータス: {
select: { name: stage },
},
週: {
date: {
start: week.start,
end: week.end,
},
},
},
});
Planningの日付は週の開始日、Reviewの日付はその4日後にしています。Planningには元の仮説に書かれた「検証方法」もコピーします。Reviewは週末に結果を書く場所なので、作成時点では空欄です。
Notion APIの認証を設定する
Webhookのexecuteでnotionを使う場合、Notion APIの認証情報は自動では設定されません。WorkerからNotion APIを使う方法に従い、Personal Access TokenまたはInternal Integration TokenをNOTION_API_TOKENとして設定します。
Internal Integration Tokenを使う場合は、読み取るデータベースと書き込むデータベースの両方へIntegrationを接続します。必要な範囲だけを許可できるため、Workerの用途が限定されている場合はこちらが扱いやすいです。
まとめ
NotionボタンとNotion WorkersのWebhookを組み合わせると、ボタンをTypeScriptで書いた処理の起点にできます。
- ボタンからNotion WorkerへPOSTリクエストを送れる
- WorkerからNotion APIを使い、検索、繰り返し、Relationの設定、複数ページを作成できる
- ボタンの入力は開始の合図だけにして、最新状態はNotion APIから取得できる
今回はボタンからリクエストを送り、週次の仮説検証を作成しました。Notionのデータベースオートメーションでも「Webhookを送信する」アクションを利用できるため、特定の条件を満たしたときにWorkerを起動する構成にもできます。
承認フローの初期化、条件に応じた関連ページの作成、複数データベースをまたぐ更新などにも同じ構成を使えます。Notionの標準アクションでは表現しにくい処理を、別のサーバーを運用せずに補う方法として、Notion Workersは利用できます。