技術ブログ

GASでNotionデータベースを自在に操作!基本から応用まで

/ 初心者向け

GASでNotionデータベースを自在に操作!基本から応用まで

GASでNotionデータベースを自在に操作!基本から応用まで

こんにちは!GAS専門ブロガーの〇〇です。

皆さんは日々の業務や情報管理にNotionを活用されていますか? Notionはその柔軟性の高さから、多くのユーザーに支持されています。しかし、NotionのデータをGAS(Google Apps Script)と連携させることで、さらに業務効率を劇的に向上させることが可能です。

今回は、GASを使ってNotionデータベースを操作する方法について、初心者の方でも理解できるように、基本から具体的なコード例まで丁寧に解説していきます。Notionのデータを自動で集計したり、Googleカレンダーに登録したり、様々な自動化の扉を開きましょう!

1. NotionデータベースをGASから操作するための準備

GASからNotionデータベースを操作するには、まずNotion APIを利用するための準備が必要です。

1.1 Notionインテグレーションの作成

1. Notion Integrations にアクセスし、「+ New integration」ボタンをクリックします。

2. インテグレーションの名前(例: GAS_Notion_Integration)を入力し、関連するワークスペースを選択します。

3. 「Submit」ボタンをクリックして作成します。

4. 作成されたインテグレーションの詳細画面で、「Internal Integration Token」をコピーしておきます。このトークンは、GASからNotion APIを呼び出す際に認証情報として使用します。

1.2 Notionデータベースへのアクセス権限を付与

作成したインテグレーションを、操作したいNotionデータベースに共有する必要があります。

1. 対象のNotionデータベースを開きます。

2. 画面右上の「Share」ボタンをクリックします。

3. 「Invite」セクションで、作成したインテグレーションの名前(例: GAS_Notion_Integration)を検索し、「Invite」をクリックします。

4. 「Can edit」などの権限を適切に設定してください。

2. GASでのNotionデータベース操作の基本

準備が整ったら、いよいよGASでNotionデータベースを操作してみましょう。

2.1 データベースのIDを取得する

GASから特定のデータベースを操作するには、そのデータベースのIDを知る必要があります。データベースのURLからIDを取得できます。

例えば、データベースのURLが https://www.notion.so/myworkspace/My-Database-a1b2c3d4e5f67890abcdef1234567890 の場合、IDは a1b2c3d4e5f67890abcdef1234567890 です。

2.2 Notion APIへのリクエストを送信する

GASでは、UrlFetchApp サービスを使用して外部APIにHTTPリクエストを送信します。Notion APIもこのサービスを利用して操作します。

2.2.1 データベースの全件取得

以下のスクリプトは、指定したNotionデータベースの全ページを取得する例です。

function getNotionDatabaseItems() {
  const integrationToken = 'YOUR_INTEGRATION_TOKEN'; // 作成したインテグレーションのトークン
  const databaseId = 'YOUR_DATABASE_ID'; // 操作したいデータベースのID

  const url = `https://api.notion.com/v1/databases/${databaseId}/query`;

  const options = {
    'method': 'post',
    'headers': {
      'Authorization': `Bearer ${integrationToken}`,
      'Content-Type': 'application/json',
      'Notion-Version': '2022-06-28' // Notion APIのバージョン
    },
    'payload': JSON.stringify({})
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const data = JSON.parse(response.getContentText());
    Logger.log(data);
    return data;
  } catch (e) {
    Logger.log(e);
  }
}

コードの説明:

  • integrationToken: 作成したインテグレーションのトークンをここに貼り付けます。
  • databaseId: 操作したいデータベースのIDを貼り付けます。
  • url: Notion APIのエンドポイントを指定します。/v1/databases/{databaseId}/query はデータベースのページをクエリするためのエンドポイントです。
  • options: HTTPリクエストの詳細を設定します。
  • method: POSTメソッドを使用します。
  • headers: 認証情報(Authorization)とAPIバージョン(Notion-Version)を指定します。
  • payload: リクエストボディです。ここでは空のオブジェクト {} を指定していますが、後述するフィルタリングなどで使用します。

この関数を実行すると、Notionデータベース内の全ページのデータがログに出力されます。

2.2.2 特定の条件でページを取得する(フィルタリング)

query エンドポイントでは、様々な条件でページをフィルタリングできます。例えば、「ステータスが「完了」のタスクのみを取得したい」といった場合に便利です。

function getFilteredNotionDatabaseItems() {
  const integrationToken = 'YOUR_INTEGRATION_TOKEN';
  const databaseId = 'YOUR_DATABASE_ID';

  const url = `https://api.notion.com/v1/databases/${databaseId}/query`;

  const filter = {
    'and': [
      {
        'property': 'Status', // プロパティ名(Notionデータベースの列名)
        'select': {
          'equals': '完了' // フィルタリングしたい値
        }
      }
    ]
  };

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

  try {
    const response = UrlFetchApp.fetch(url, options);
    const data = JSON.parse(response.getContentText());
    Logger.log(data);
    return data;
  } catch (e) {
    Logger.log(e);
  }
}

ポイント:

  • filter オブジェクトで条件を指定します。
  • 'property' にはNotionデータベースのプロパティ名(列名)を指定します。
  • 'select''title' など、プロパティのタイプに応じた条件を指定できます。

2.2.3 新しいページを追加する(作成)

新しいページを追加するには、/v1/pages エンドポイントを使用します。

function createNotionPage() {
  const integrationToken = 'YOUR_INTEGRATION_TOKEN';
  const parentPageId = 'YOUR_PARENT_PAGE_ID'; // ページを追加したい親ページのID
  const databaseId = 'YOUR_DATABASE_ID'; // データベースID(直接データベースに追加する場合)

  const url = 'https://api.notion.com/v1/pages';

  // データベースに追加する場合のpayload
  const payloadDatabase = {
    'parent': { 'database_id': databaseId },
    'properties': {
      'Name': { // プロパティ名(Notionデータベースの列名)
        'title': [
          {
            'text': {
              'content': 'GASから作成した新しいタスク'
            }
          }
        ]
      },
      'Status': { // プロパティ名
        'select': {
          'name': '未着手'
        }
      }
      // 他のプロパティもここに追加できます
    }
  };

  // 特定の親ページ下に作成する場合のpayload (データベースではない)
  // const payloadParentPage = {
  //   'parent': { 'page_id': parentPageId },
  //   'properties': {
  //     'title': {
  //       'title': [
  //         {
  //           'text': {
  //             'content': 'GASから作成した新しいノート'
  //           }
  //         }
  //       ]
  //     }
  //   }
  // };

  const options = {
    'method': 'post',
    'headers': {
      'Authorization': `Bearer ${integrationToken}`,
      'Content-Type': 'application/json',
      'Notion-Version': '2022-06-28'
    },
    'payload': JSON.stringify(payloadDatabase) // payloadDatabase または payloadParentPage を指定
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const data = JSON.parse(response.getContentText());
    Logger.log(data);
    return data;
  } catch (e) {
    Logger.log(e);
  }
}

注意点:

  • 'parent' には、データベースに追加する場合は 'database_id'、特定のページ下に作成する場合は 'page_id' を指定します。
  • 'properties' の部分は、Notionデータベースの構造に合わせて正確に記述する必要があります。プロパティのタイプ(Text, Select, Dateなど)によって記述方法が異なります。

2.2.4 既存のページを更新する

既存のページを更新するには、/v1/pages/{pageId} エンドポイントを使用します。

function updateNotionPage() {
  const integrationToken = 'YOUR_INTEGRATION_TOKEN';
  const pageId = 'TARGET_PAGE_ID'; // 更新したいページのID

  const url = `https://api.notion.com/v1/pages/${pageId}`;

  const payload = {
    'properties': {
      'Status': { // 更新したいプロパティ名
        'select': {
          'name': '完了'
        }
      }
      // 他のプロパティも更新できます
    }
  };

  const options = {
    'method': 'patch',
    'headers': {
      'Authorization': `Bearer ${integrationToken}`,
      'Content-Type': 'application/json',
      'Notion-Version': '2022-06-28'
    },
    'payload': JSON.stringify(payload)
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const data = JSON.parse(response.getContentText());
    Logger.log(data);
    return data;
  } catch (e) {
    Logger.log(e);
  }
}

ポイント:

  • メソッドは patch を使用します。
  • 'properties' の中に更新したいプロパティとその新しい値を指定します。

2.2.5 ページを削除する

ページを削除するには、/v1/pages/{pageId} エンドポイントに DELETE リクエストを送信します。

function deleteNotionPage() {
  const integrationToken = 'YOUR_INTEGRATION_TOKEN';
  const pageId = 'TARGET_PAGE_ID'; // 削除したいページのID

  const url = `https://api.notion.com/v1/pages/${pageId}`;

  const options = {
    'method': 'delete',
    'headers': {
      'Authorization': `Bearer ${integrationToken}`,
      'Notion-Version': '2022-06-28'
    }
  };

  try {
    UrlFetchApp.fetch(url, options);
    Logger.log(`Page ${pageId} deleted successfully.`);
  } catch (e) {
    Logger.log(e);
  }
}

注意: 削除操作は元に戻せませんので、実行には十分注意してください。

3. 応用例:NotionデータをGoogleスプレッドシートに同期する

GASの強力な部分の一つは、異なるサービス間でのデータ連携です。ここでは、NotionデータベースのデータをGoogleスプレッドシートに定期的に同期する例を紹介します。

function syncNotionToGoogleSheet() {
  const integrationToken = 'YOUR_INTEGRATION_TOKEN';
  const databaseId = 'YOUR_DATABASE_ID';
  const spreadsheetId = 'YOUR_SPREADSHEET_ID'; // 同期先のスプレッドシートID
  const sheetName = 'NotionData'; // 同期先のシート名

  const url = `https://api.notion.com/v1/databases/${databaseId}/query`;

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

  try {
    const response = UrlFetchApp.fetch(url, options);
    const data = JSON.parse(response.getContentText());

    const ss = SpreadsheetApp.openById(spreadsheetId);
    const sheet = ss.getSheetByName(sheetName) || ss.insertSheet(sheetName);

    // シートをクリア
    sheet.clearContents();

    // ヘッダー行の作成(Notionのプロパティ名を取得)
    const headers = ['ID']; // ページIDも取得しておくと便利
    if (data.results.length > 0) {
      const firstPageProperties = data.results[0].properties;
      for (const propName in firstPageProperties) {
        headers.push(propName);
      }
    }
    sheet.appendRow(headers);

    // データをシートに書き込み
    data.results.forEach(item => {
      const row = [item.id]; // ページID
      const properties = item.properties;
      headers.slice(1).forEach(header => { // ID列以外を処理
        const prop = properties[header];
        if (prop) {
          switch (prop.type) {
            case 'title':
              row.push(prop.title[0]?.plain_text || '');
              break;
            case 'rich_text':
              row.push(prop.rich_text[0]?.plain_text || '');
              break;
            case 'select':
              row.push(prop.select?.name || '');
              break;
            case 'date':
              row.push(prop.date?.start || '');
              break;
            case 'checkbox':
              row.push(prop.checkbox);
              break;
            // 必要に応じて他のプロパティタイプを追加
            default:
              row.push('');
          }
        } else {
          row.push('');
        }
      });
      sheet.appendRow(row);
    });

    Logger.log('Notion data synced to Google Sheet successfully.');

  } catch (e) {
    Logger.log(e);
  }
}

このスクリプトのポイント:

  • Notion APIから取得したデータをパースし、スプレッドシートの各行・各列に書き込んでいます。
  • プロパティのタイプに応じて、表示形式を調整しています(例: title, rich_text, select, date, checkbox)。
  • SpreadsheetApp.openById()getSheetByName() を使って、対象のスプレッドシートとシートを取得します。
  • sheet.clearContents() で、同期前にシートの内容をクリアしています。

このスクリプトをトリ वेळीシューター(例: 1時間ごと、1日ごと)で実行するように設定すれば、Notionデータベースの変更が自動的にスプレッドシートに反映されるようになります。

4. まとめ

今回は、Google Apps Script (GAS) を使ってNotionデータベースを操作する基本的な方法について解説しました。Notion APIを活用することで、データの取得、追加、更新、削除を自動化できることがお分かりいただけたかと思います。

  • インテグレーションの作成とトークン取得
  • データベースIDの確認
  • UrlFetchApp を使ったAPIリクエスト(GET, POST, PATCH, DELETE)
  • フィルタリングによるデータ絞り込み
  • Notionからスプレッドシートへのデータ同期例

これらの知識を応用すれば、NotionとGoogleカレンダーの連携、Notionのデータに基づいたメール送信、Googleフォームからのデータ登録など、さらに高度な自動化も実現可能です。

ぜひ、ご自身の業務に合わせてNotionとGASの連携を試してみてください。もし「こんな自動化がしたい」「このプロパティの書き方がわからない」といった疑問があれば、コメント欄で教えてくださいね!

それでは、次回のブログでお会いしましょう!

GAS自動化の導入相談

請求書PDF作成、Gmail自動送信、Slack通知、スプレッドシート連携などを業務に合わせて実装できます。

請求書自動生成ツールを見る / SNS自動投稿ツールを見る