3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

NotionAdvent Calendar 2023

Day 3

Notion APIでNode.jsから日付情報から検索やソート

Posted at

NotionのAPIを触ってみてます。締め切りが今週中の何か... といった情報を抜き出したいときがあるのですが、その辺のメモです。

日付でソート

提出期限などでソートします。

スクリーンショット 2023-12-23 16.02.44.png

const response = await notion.databases.query({
    database_id: dbId,
    sorts:[
        {
            "property": "提出期限",
            "direction": "descending"
        }
    ]
});

console.log(response);

エラー: body failed validation. Fix one:\\nbody.sorts[0].direction should be \"ascending\"or\"descending\"`

なかなか融通が効かないパターンで

sorts:[
        {
            "property": "提出期限",
            "direction": "descending"
        }
    ]

これはOKですが。以下だとエラーになります。

sorts:[
        {
            "property": "提出期限",
            "direction": "Descending"
        }
    ]

descendingorascendingで全部小文字じゃないとダメみたいです。

日付で検索

こんな感じの指定で、今日(today)から6日後(in6days)の間に提出期限があるものを検索できます。

12/23から29までをNotion上でFilterするとこんな感じ
スクリーンショット 2023-12-23 16.54.01.png

これをAPIで触るとこんな感じ

filter: {
    and: [
      {
        property: '提出期限',
        date: {
          on_or_after: today
        }
      },
      {
        property: '提出期限',
        date: {
          on_or_before: in6days
        }
      }
    ],
},

dayjsで実装

npm i dayjs
const { Client, APIErrorCode } = require("@notionhq/client")

const dayjs = require('dayjs');
const utc = require('dayjs/plugin/utc');
const timezone = require('dayjs/plugin/timezone');
// dayjsにプラグインを適用
dayjs.extend(utc);
dayjs.extend(timezone);

const dbId = process.env.NOTION_KADAI_DBID;

const getKadaiInfo = async () => {
    try {
        // 日本のタイムゾーンで現在の日時を取得し、ISO 8601形式に変換
        const today = dayjs().tz('Asia/Tokyo').format();
        // const tomorrow = dayjs().tz('Asia/Tokyo').add(1, 'day').format();
        // const in2days = dayjs().tz('Asia/Tokyo').add(2, 'day').format();
        // const in3days = dayjs().tz('Asia/Tokyo').add(3, 'day').format();
        // const in4days = dayjs().tz('Asia/Tokyo').add(4, 'day').format();
        // const in5days = dayjs().tz('Asia/Tokyo').add(5, 'day').format();
        const in6days = dayjs().tz('Asia/Tokyo').add(6, 'day').format();

        const notion = new Client({auth: process.env.NOTION_TOKEN});
        const response = await notion.databases.query({
            database_id: dbId,
            sorts:[
                {
                    "property": "提出期限",
                    "direction": "descending"
                }
            ],

            filter: {
                and: [
                  {
                    property: '提出期限',
                    date: {
                      on_or_after: today
                    }
                  },
                  {
                    property: '提出期限',
                    date: {
                      on_or_before: in6days
                    }
                  }
                ],
            },
        });
        console.log(response.results);
        
    } catch (error) {
        if (error.code === APIErrorCode.ObjectNotFound) {
            //
            // For example: handle by asking the user to select a different database
            //
            } else {
            // Other error handling code
            console.error(error)
        }
    }
}

期間内に締め切りが来るデータが取得できました。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?