NotionボタンからNotion Workersを呼び出して、APIで複雑なテンプレート処理を実行する

Notionボタンを押したときにWebhookを送り、Notion Workers上のTypeScriptを実行する仕組みを作ったので紹介します。

この仕組みを使うと、Notionの標準テンプレートだけでは表現しにくい「別のデータベースを条件で検索し、見つかったページごとに複数のページを作成する」といった処理を、Notion APIで実装できます。

今回作ったのは、ステータスが「検証中」の仮説を検索し、それぞれに今週分のPlanningとReviewを作成するボタンです。

NotionボタンからWebhookを送信する設定。Webhook URLは非表示にしている

Notion Workersとは

Notion Workersは、Node.jsとTypeScriptで書いた小さなプログラムをNotion上で動かす仕組みです。Notionが実行環境を提供するため、Webhookを受け取るためのサーバーを別に用意する必要はありません。

Workerには、外部データを同期するSync、Custom Agentから呼び出すTool、HTTPリクエストを受け取るWebhookという機能があります。この記事ではWebhookを使います。2026年7月31日時点ではベータ版です。提供状況はNotionのリリース情報で確認できます。

処理の流れは次のようになります。

  1. Notionボタンを押す
  2. ボタンがNotion WorkerのWebhook URLへPOSTリクエストを送る
  3. Notion WorkerがTypeScriptの処理を実行する
  4. WorkerがNotion APIで対象ページを検索する
  5. 条件を満たすページごとにPlanningとReviewを作成する

NotionのWebhookアクションは、通常のボタン、データベースボタン、データベースオートメーションから利用できます。そのため、手動のボタンだけではなく、データベースの更新をきっかけに同じWorkerを呼び出す構成にもできます。

仮説検証のPlanningとReviewをまとめて作る

Massivでは、仮説を管理するデータベースと、仮説ごとの検証を管理するデータベースを分けています。

週の始めには、ステータスが「検証中」の仮説ごとにPlanningを作り、週の終わりに振り返るためのReviewも用意します。作成するページには、元の仮説へのRelation、1週間の期間、PlanningまたはReviewというステータスを設定します。

この処理で必要なのは、次のような操作です。

  • 別のデータベースから「検証中」の仮説をすべて検索する
  • 検索結果の件数に合わせて繰り返す
  • 1つの仮説につきPlanningとReviewの2ページを作る
  • 作成したページと元の仮説をRelationで結ぶ

Notionの標準ボタンやテンプレートは、決まったページを作る処理には向いています。一方で、検索結果の件数が毎回変わる処理は、1つのボタン設定だけでは表現しにくくなります。

そこで、ボタンは処理の開始だけを担当し、検索や作成のロジックはWorkerへ移しました。

仮説データベースから仮説検証データベースへPlanningとReviewを作成する流れ。社内情報は非表示にしている

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のexecutenotionを使う場合、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は利用できます。

← 記事一覧へ戻る