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通知、スプレッドシート連携などを業務に合わせて実装できます。