みやもとメモ

「Notion」「Google Apps Script」「ブログカスタマイズ」などについて書いていきます。

目次
目次

【GAS】Notionデータベースからデータ取得する(フィルター、ソートも指定)(Query a database)

この記事をシェアする

今回はGAS(Google Apps Script)に関して書いていきます。

以前もGASに関する記事を書いています(以下リンク)。

miya-moto-memo.hatenablog.com

上記の記事で、GASでNotionからデータ取得してGmailで通知する対応について書いています。
プログラムも載せていますが、プログラムの具体的な説明はしませんでした。

今回の記事で、「GASでNotionからデータ取得する」部分を具体的に説明してみます。
※「Gmailで通知する」部分に関しては、また別記事にて書く予定です。

それでは本題へ。

今回説明するところ

miya-moto-memo.hatenablog.com

上記リンクに全体のプログラムが載っていますが、この記事では部分的にピックアップして説明していきます。

フローチャートでいうと、以下(赤枠部分)に関して説明していきます。
※getNotionData

フローチャート(今回説明するところ)

プログラム事前準備

GASでNotionからデータを取得するためには、事前準備が必要です。
事前準備の手順は別記事にて詳しく書いています。
以下あたりの記事を見てもらえればと思います。

miya-moto-memo.hatenablog.commiya-moto-memo.hatenablog.com

プログラム

準備が整ったところで、プログラムです。
※事前準備が完了している前提です。

// 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”に日付を渡していることに少し違和感があったのですが、以下リンクで詳しく説明されていました。

developers.notion.com

この記事を書いている時点では”2022-06-28”が最新バージョンのようです。

filter(フィルター)

「query」に渡すパラメータとして”filter”があります。
”filter”のリファレンスは以下です。
”filter”を指定することで、Notionから取得するデータを絞り込みます。

developers.notion.com

“filter”のポイントは、プロパティによって指定方法が異なることです。
上記リンクに、各プロパティの指定方法が詳しく書かれています。

せっかくなので自分も、Notionの画像を交えつつ、フィルターの指定例を何パターンか載せておきます。


曜日(マルチセレクト)

'filter': {
  'property': '曜日',
  'multi_select': {
    'contains': '月'
  }        
}
曜日(マルチセレクト)


番組名(タイトル)

'filter': {
  'property': '番組名',
  'title': {
    'contains': 'オードリー'
  }        
}
番組名(タイトル)


放送局(セレクト)

'filter': {
  'property': '放送局',
  'select': {
    'equals': 'ニッポン放送'
  }        
}
放送局(セレクト)


番組URL(URL)

'filter': {
  'property': '番組URL',
  'url': {
    'contains': 'tbsradio'
  }        
}
番組URL(URL)


AND条件【曜日(マルチセレクト)、番組終了(チェックボックス)】

'filter': {
  'and': [
    {
      'property': '曜日',
      'multi_select': {
        'contains': '月'
      }        
    },
    {
      'property': '番組終了',
      'checkbox': {
        'equals': false
      }        
    }
  ]
}
AND条件【曜日(マルチセレクト)、番組終了(チェックボックス)】

sorts(ソート)

「query」に渡すパラメータとして”sorts”があります。
”sorts”のリファレンスは以下です。
”sorts”を指定することで、Notionから取得するデータを並び替えます。

developers.notion.com

“sorts”は“filter”と比べるとシンプルかなと思います。
「プロパティ」と「昇順/降順」を指定していくだけです。

ソートの指定例を1つ載せておきます。

・第1ソートキー:時間(昇順)
・第2ソートキー:放送局(降順)

'sorts': [
  {
    'property': '時間',
    'direction': 'ascending'
  },
  {
    'property': '放送局',
    'direction': 'descending'
  }
]
第1ソートキー:時間(昇順)、第2ソートキー:放送局(降順)

各プロパティの取得について

プロパティは種類によってデータ構造がバラバラなようです。
以下のリファレンスに詳しく載っています。

developers.notion.com

全部ではないですが、プロパティの取得方法をいくつか載せておきます。

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で通知する - 派生記事

TOPへ戻る HOMEへ