技術ブログ

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

/ 初心者向け

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

NotionデータベースとGASの連携で自動化の世界へ!

Notionは、ドキュメント作成、タスク管理、データベースなど、多機能なワークスペースとして多くの人に利用されています。一方、Google Apps Script (GAS) は、Google Workspaceの各サービスを連携させたり、外部サービスと連携させたりできる強力な自動化ツールです。

この二つを組み合わせることで、Notionデータベースの情報をGASで取得・更新したり、GASで処理した結果をNotionに書き込んだりといった、様々な自動化が実現可能になります。本記事では、GASを使ってNotionデータベースを操作するための基本的な手順と、具体的なコード例を解説していきます。

1. Notion APIの準備

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

1. Notion Integrationsページへのアクセス: https://www.notion.so/my-integrations にアクセスします。

2. 「New integration」ボタンのクリック: 新しい連携を作成します。

3. 連携情報の入力: 「Name」に任意の名前(例: GAS Notion Connector)を入力し、「Associated workspace」で連携したいワークスペースを選択します。

4. 「Submit」ボタンのクリック: 連携が作成され、「Internal Integration Token」が表示されます。このトークンは後ほどGASで利用するため、必ずコピーして安全な場所に保管してください。

5. Notionデータベースへの連携: 操作したいNotionデータベースを開き、右上の「Share」ボタンをクリックします。「Invite」セクションで、先ほど作成した連携名(例: GAS Notion Connector)を検索し、「Invite」をクリックします。これで、GASからこのデータベースにアクセスできるようになります。

2. GASプロジェクトの作成とAPIキーの設定

次に、GASプロジェクトを作成し、先ほど取得したAPIキーを設定します。

1. GASプロジェクトの作成: Googleドライブの任意の場所で右クリックし、「新規」>「その他」>「Google Apps Script」を選択して新しいプロジェクトを作成します。プロジェクト名も分かりやすいものに変更しましょう。

2. APIキーの定数化: GASエディタを開き、以下のコードのように、APIキーとデータベースIDを定数として定義しておくと便利です。

// .envファイルがあればそこから読み込むのがベストですが、ここでは直接記述します
const NOTION_API_KEY = 'YOUR_INTERNAL_INTEGRATION_TOKEN'; // ここにNotionのAPIキーを貼り付け
const DATABASE_ID = 'YOUR_DATABASE_ID'; // ここに操作したいNotionデータベースのIDを貼り付け

// データベースIDは、NotionデータベースのURLに含まれています。
// 例: https://www.notion.so/your-workspace/DATABASE_ID?v=... の DATABASE_ID 部分です。

注意: .env ファイルのように機密情報を直接コードに書かない方法もありますが、ここでは簡易的に直接記述します。実際の運用では、よりセキュアな方法を検討してください。

3. Notionデータベースからデータを取得する

Notion APIの databases.query エンドポイントを利用して、データベースの情報を取得できます。GASでは UrlFetchApp サービスを使用します。

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

function getNotionDatabase() {
  const url = `https://api.notion.com/v1/databases/${DATABASE_ID}/query`;
  const options = {
    'method': 'post',
    'headers': {
      'Authorization': `Bearer ${NOTION_API_KEY}`,
      '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());
    Logger.log(data);
    return data;
  } catch (e) {
    Logger.log('Error fetching Notion database: ' + e);
    return null;
  }
}

この関数を実行すると、Notionデータベースの全ページ(レコード)の情報が data.results に配列として返ってきます。各要素はNotionのページオブジェクトです。

3.2 特定の条件でデータを絞り込む (Filter)

databases.query エンドポイントでは、filter パラメータを使ってデータを絞り込むことができます。例えば、「ステータス」プロパティが「完了」のページのみを取得する場合:

function getFilteredDatabase() {
  const url = `https://api.notion.com/v1/databases/${DATABASE_ID}/query`;
  const options = {
    'method': 'post',
    'headers': {
      'Authorization': `Bearer ${NOTION_API_KEY}`,
      'Content-Type': 'application/json',
      'Notion-Version': '2022-06-28'
    },
    'payload': JSON.stringify({
      'filter': {
        'property': 'Status', // ここに絞り込みたいプロパティ名を入力
        'select': {
          'equals': 'Completed' // ここに指定したい値(選択肢)を入力
        }
      }
    })
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const data = JSON.parse(response.getContentText());
    Logger.log(data.results);
    return data.results;
  } catch (e) {
    Logger.log('Error fetching filtered Notion database: ' + e);
    return null;
  }
}

Notionのプロパティタイプ(text, number, date など)によって、filter の書き方が異なります。詳しくはNotion APIのドキュメントを参照してください。

4. Notionデータベースに新しいページを追加する

pages エンドポイントの post メソッドを使用します。新しいページを作成するには、親となるデータベースIDと、追加したいプロパティの情報を指定します。

function addPageToDatabase() {
  const url = 'https://api.notion.com/v1/pages';
  const options = {
    'method': 'post',
    'headers': {
      'Authorization': `Bearer ${NOTION_API_KEY}`,
      'Content-Type': 'application/json',
      'Notion-Version': '2022-06-28'
    },
    'payload': JSON.stringify({
      'parent': {
        'database_id': DATABASE_ID
      },
      'properties': {
        'Name': {
          'title': [
            {
              'type': 'text',
              'text': {
                'content': '新しいタスク'
              }
            }
          ]
        },
        'Status': {
          'select': {
            'name': 'To Do' // 初期ステータスを設定
          }
        }
        // 他のプロパティもここに追加できます
        // 例: 'Due Date': { 'date': { 'start': '2024-08-01' } }
      }
    })
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const data = JSON.parse(response.getContentText());
    Logger.log('Page added successfully: ' + JSON.stringify(data));
    return data;
  } catch (e) {
    Logger.log('Error adding page to Notion database: ' + e);
    return null;
  }
}

properties の部分には、Notionデータベースで定義されているプロパティ名と、その値(型に合わせた形式)を指定します。タイトルプロパティは title タイプ、セレクトプロパティは select タイプといった具合です。

5. 既存のページを更新する

pages/{page_id} エンドポイントの patch メソッドを使用します。更新したいページのIDを指定し、変更したいプロパティを送信します。

function updateNotionPage(pageId) {
  const url = `https://api.notion.com/v1/pages/${pageId}`;
  const options = {
    'method': 'patch',
    'headers': {
      'Authorization': `Bearer ${NOTION_API_KEY}`,
      'Content-Type': 'application/json',
      'Notion-Version': '2022-06-28'
    },
    'payload': JSON.stringify({
      'properties': {
        'Status': {
          'select': {
            'name': 'In Progress'
          }
        }
      }
    })
  };

  try {
    const response = UrlFetchApp.fetch(url, options);
    const data = JSON.parse(response.getContentText());
    Logger.log('Page updated successfully: ' + JSON.stringify(data));
    return data;
  } catch (e) {
    Logger.log('Error updating Notion page: ' + e);
    return null;
  }
}

// 例: 最初のページを更新する場合
// function testUpdate() {
//   const pages = getNotionDatabase();
//   if (pages && pages.results.length > 0) {
//     const pageIdToUpdate = pages.results[0].id;
//     updateNotionPage(pageIdToUpdate);
//   } else {
//     Logger.log('No pages found to update.');
//   }
// }

更新したいページのIDは、getNotionDatabase() 関数などで取得した結果から page.id で取得できます。

まとめ

GASとNotion APIを連携させることで、Notionデータベースをより強力に活用できます。今回ご紹介した「データの取得」「追加」「更新」は、自動化の基本となる機能です。これらの機能を応用すれば、以下のような自動化も可能になります。

  • Googleフォームから送信されたデータをNotionデータベースに追加する
  • Googleスプレッドシートのデータを基にNotionデータベースを更新する
  • Notionデータベースの特定の条件を満たすページをGASで処理し、結果をSlackに通知する

まずは、今回紹介したコードを参考に、ご自身のNotionデータベースで試してみてください。APIの仕様は変更される可能性があるため、常にNotion Developersの公式ドキュメントを参照することをおすすめします。

Notion APIのドキュメント: https://developers.notion.com/reference/intro

GASとNotionの連携で、あなたのワークフローをさらに効率化しましょう!

GAS自動化の導入相談

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

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