【GAS×Notion API】Googleフォームの回答を自動でNotionデータベースへ同期する連携連携術

【GAS×Notion API】Googleフォームの回答を自動でNotionデータベースへ同期する連携連携術

2026/08/14

「Googleフォームで受け取った問い合わせを、Notionのタスクボードに手動でコピペしている……」

社内の依頼フォームやイベント参加申し込み、ブログへの問い合わせなど、Googleフォームは非常に便利ですが、回答が送信されたあとの「転記作業」に時間を奪われていませんか?

今回は、完全無料で利用できる Google Apps Script (GAS)Notion API を組み合わせ、フォームに送信があった瞬間にNotionのデータベースへ新しいカード(ページ)を自動作成する連携スクリプトの構築手順を徹底解説します。

なぜスプレッドシートではなく「Notion同期」なのか?

Googleフォームの回答は自動的にGoogleスプレッドシートへ記録されます。しかし、スプレッドシート上では「担当者の割り当て」「対応ステータス(未対応/対応中/完了)の管理」「詳細なやり取りのメモ書き」といったタスク管理がやりづらいのが現実です。

Notionのカンバンボード(Board View)へリアルタイムに同期させることで、チーム全員が問い合わせの対応状況を一目瞭然で把握できるようになります。

全体アーキテクチャ

フォーム送信イベント(onFormSubmit)をトリガーにしてGASを起動し、Notion API経由で指定のデータベースヘリクエストを発行します。

graph TD
    A["ユーザーがGoogleフォームを入力・送信"] --> B["フォーム送信イベント発火 (onFormSubmit)"]
    B --> C["GAS (Google Apps Script) 起動"]
    C --> D["回答データ (氏名/メール/本文) を抽出"]
    D --> E["Notion API (REST) へPOSTリクエスト"]
    E --> F["Notionデータベースに新タスクカード作成"]
    F --> G["担当者へ通知 (Notion内通知)"]

実戦GASコード:GoogleフォームからNotionへの自動同期

Googleフォームに紐づくスプレッドシートのスクリプトエディタ(拡張機能 > Apps Script)を開き、以下のコードを記述します。

// プロパティサービスから認証情報を取得
const NOTION_API_KEY = PropertiesService.getScriptProperties().getProperty("NOTION_API_KEY");
const NOTION_DATABASE_ID = PropertiesService.getScriptProperties().getProperty("NOTION_DATABASE_ID");

/**
 * フォーム送信時に実行されるメイン関数
 */
function onFormSubmit(e) {
  if (!e || !e.values) {
    Logger.log("イベントデータが存在しません。手動実行の場合はテストデータを指定してください。");
    return;
  }

  // フォームの回答値を取得 (列の順番に応じてインデックスを調整)
  const timestamp = e.values[0];
  const name = e.values[1];
  const email = e.values[2];
  const category = e.values[3];
  const message = e.values[4];

  // Notion APIのリクエストボディを構築
  const payload = {
    parent: { database_id: NOTION_DATABASE_ID },
    properties: {
      "タイトル": {
        title: [
          { text: { content: `【問い合わせ】${name} 様` } }
        ]
      },
      "送信者メール": {
        email: email
      },
      "カテゴリ": {
        select: { name: category || "未分類" }
      },
      "ステータス": {
        status: { name: "未対応" }
      }
    },
    children: [
      {
        object: "block",
        type: "paragraph",
        paragraph: {
          rich_text: [
            { text: { content: `送信日時: ${timestamp}\n\n【お問い合わせ内容】\n${message}` } }
          ]
        }
      }
    ]
  };

  const options = {
    method: "post",
    headers: {
      "Authorization": `Bearer ${NOTION_API_KEY}`,
      "Content-Type": "application/json",
      "Notion-Version": "2022-06-28"
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true
  };

  try {
    const response = UrlFetchApp.fetch("https://api.notion.com/v1/pages", options);
    const statusCode = response.getResponseCode();
    if (statusCode === 200) {
      Logger.log("Notionへの作成が成功しました。");
    } else {
      Logger.log(`エラー発生 (Status: ${statusCode}): ${response.getContentText()}`);
    }
  } catch (err) {
    Logger.log(`通信エラー: ${err.message}`);
  }
}

セットアップにおける重要なポイント

  1. スクリプトプロパティの安全な活用 APIキーやデータベースIDをコード中に直書き(ハードコーディング)しないよう、プロジェクトの設定 > スクリプト プロパティ に保存して読み込んでいます。
  2. トリガーの手動設定 Apps Script画面の左メニュー「トリガー(時計アイコン)」から、onFormSubmit 関数に対して 「イベントの種類を選択:フォーム送信時」 のトリガーを追加します。
  3. Notionインテグレーションの権限付与 Notion側で作成した Integration(APIキー)を、対象のNotionデータベースの Connections から追加・許可しておく必要があります。

導入によって得られた業務改善メリット

  1. 転記作業ゼロ&対応漏れゼロ 手動での転記作業が一切無くなり、月に約3〜5時間かかっていた事務作業が完全に自動化されました。
  2. Notionのカンバン機能による進捗の可視化 「未対応」「対応中」「完了」のステータス変更がチーム内でスムーズになり、未対応タスクの放置が発生しなくなりました。
  3. コストパフォーマンスが最強(完全無料) MakeやZapierなどの有料iPaaSツールを使わず、GASと標準APIだけで完結するため、月額コストが0円で運用可能です。

まとめ:日常の「ちょっとしたコピペ」を仕組みで消し去る

1回の転記作業は数分程度かもしれませんが、年間に換算すると馬鹿にできない時間と集中力が削られています。

GASとNotion APIの連携は、一度構築してしまえばメンテナンスフリーで動き続けてくれます。社内フォームやブログのお問い合わせ管理に悩んでいる方は、ぜひ試してみてください!