今回はGAS(Google Apps Script)に関して書いていきます。
以前もGASに関する記事を書いています(以下リンク)。
上記の記事で、GASでNotionからデータ取得してGmailで通知する対応について書いています。
プログラムも載せていますが、プログラムの具体的な説明はしませんでした。
今回の記事で、「GASでNotionからデータ取得する」部分を具体的に説明してみます。
※「Gmailで通知する」部分に関しては、また別記事にて書く予定です。
それでは本題へ。
今回説明するところ
上記リンクに全体のプログラムが載っていますが、この記事では部分的にピックアップして説明していきます。
フローチャートでいうと、以下(赤枠部分)に関して説明していきます。
※getNotionData
プログラム事前準備
GASでNotionからデータを取得するためには、事前準備が必要です。
事前準備の手順は別記事にて詳しく書いています。
以下あたりの記事を見てもらえればと思います。
プログラム
準備が整ったところで、プログラムです。
※事前準備が完了している前提です。
// Notionインテグレーションキー const NOTION_API_KEY = PropertiesService.getScriptProperties().getProperty('NOTION_API_KEY'); // ラジオ管理NotionのデータベースID const DATABASE_ID = PropertiesService.getScriptProperties().getProperty('DATABASE_ID'); /** * メイン処理 */ function main() { // Notion検索URL const url = 'https://api.notion.com/v1/databases/' + DATABASE_ID + '/query'; // Notion検索実行 const result = JSON.parse(UrlFetchApp.fetch(url, composeFetchParam())); for (const data of result.results) { // 各プロパティを取得 let weekday = data.properties['曜日'].multi_select.map((e) => e.name).join(''); let time = data.properties['時間'].rich_text[0].plain_text; let title = data.properties['番組名'].title[0].plain_text; let broadcaster = data.properties['放送局'].select.name; let programUrl = data.properties['番組URL'].url; // ログ出力 console.log(`${weekday} | ${time} | ${title} | ${broadcaster} | ${programUrl}`); } } /** * データ取得に必要なパラメータを組み立てる * ・フィルター * ・ソート */ function composeFetchParam() { const payload = { 'filter': { 'and': [ { 'property': '曜日', 'multi_select': { 'contains': '月' } }, { 'property': '番組終了', 'checkbox': { 'equals': false } } ] }, 'sorts': [ { 'property': '時間', 'direction': 'ascending' }, { 'property': '放送局', 'direction': 'ascending' } ] }; const params = { 'method': 'POST', 'headers': { 'Notion-Version': '2022-06-28', 'Authorization': 'Bearer ' + NOTION_API_KEY, 'Content-Type': 'application/json' }, 'payload': JSON.stringify(payload), }; return params; }
上記のプログラムを実行すると、Notionから取得したデータがログ出力されます。
取得したデータは、ラジオ管理Notionの以下の部分です(赤枠)。
「Notion API」の詳細
上記のプログラムから、「Notion API」に関する処理をピックアップして具体的に説明します。
Query a database(検索)
Notionデータベースを検索する「query」のリファレンスは以下です。
developers.notion.com
Notion-Version について
「query」に渡すパラメータとして”Notion-Version”があります。
”Notion-Version”に日付を渡していることに少し違和感があったのですが、以下リンクで詳しく説明されていました。
この記事を書いている時点では”2022-06-28”が最新バージョンのようです。
filter(フィルター)
「query」に渡すパラメータとして”filter”があります。
”filter”のリファレンスは以下です。
”filter”を指定することで、Notionから取得するデータを絞り込みます。
“filter”のポイントは、プロパティによって指定方法が異なることです。
上記リンクに、各プロパティの指定方法が詳しく書かれています。
せっかくなので自分も、Notionの画像を交えつつ、フィルターの指定例を何パターンか載せておきます。
曜日(マルチセレクト)
'filter': { 'property': '曜日', 'multi_select': { 'contains': '月' } }
番組名(タイトル)
'filter': { 'property': '番組名', 'title': { 'contains': 'オードリー' } }
放送局(セレクト)
'filter': { 'property': '放送局', 'select': { 'equals': 'ニッポン放送' } }
番組URL(URL)
'filter': { 'property': '番組URL', 'url': { 'contains': 'tbsradio' } }
AND条件【曜日(マルチセレクト)、番組終了(チェックボックス)】
'filter': { 'and': [ { 'property': '曜日', 'multi_select': { 'contains': '月' } }, { 'property': '番組終了', 'checkbox': { 'equals': false } } ] }
sorts(ソート)
「query」に渡すパラメータとして”sorts”があります。
”sorts”のリファレンスは以下です。
”sorts”を指定することで、Notionから取得するデータを並び替えます。
“sorts”は“filter”と比べるとシンプルかなと思います。
「プロパティ」と「昇順/降順」を指定していくだけです。
ソートの指定例を1つ載せておきます。
・第1ソートキー:時間(昇順)
・第2ソートキー:放送局(降順)
'sorts': [ { 'property': '時間', 'direction': 'ascending' }, { 'property': '放送局', 'direction': 'descending' } ]
各プロパティの取得について
プロパティは種類によってデータ構造がバラバラなようです。
以下のリファレンスに詳しく載っています。
全部ではないですが、プロパティの取得方法をいくつか載せておきます。
const url = 'https://api.notion.com/v1/databases/' + DATABASE_ID + '/query'; const result = JSON.parse(UrlFetchApp.fetch(url, composeFetchParam())); for (const data of result.results) { // 各プロパティを取得 let weekday = data.properties['曜日'].multi_select.map((e) => e.name).join(''); let time = data.properties['時間'].rich_text[0].plain_text; let title = data.properties['番組名'].title[0].plain_text; let broadcaster = data.properties['放送局'].select.name; let programUrl = data.properties['番組URL'].url; }
リファレンスを見つつ、ログ出力しながら取得したい値を辿るのが良いかなと思います。
「UrlFetchApp」の詳細
リファレンスをリンクしておきます。
developers.google.com
おわりに
ということで、「GASでNotionデータベースからデータ取得する(フィルター、ソートも指定)」に関してアレコレ書いてみました。
Notionからデータを取得するところまでは割とスンナリいけたのですが、フィルターの指定方法や各プロパティの取得方法は若干のクセがありました。
クセのあるところは具体的に説明してみました。
この記事が参考になれば幸いです。
関連記事
GAS(Google Apps Script)に関してはいくつか記事にしています。
気になる記事があればぜひ。
GASの活用事例
GASでのNotionデータベースCRUD操作(登録/参照/更新/削除)
GASでNotionからデータ取得してGmailで通知する - 派生記事