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


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

## 日付でソート 

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

> ![スクリーンショット 2023-12-23 16.02.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/de320c51-bf21-e4ad-789c-7bf39d286edd.png "スクリーンショット 2023-12-23 16.02.44.png")

```js
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\\"`


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

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

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

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

`descending`or`ascending`で全部小文字じゃないとダメみたいです。

## 日付で検索

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

> 12/23から29までをNotion上でFilterするとこんな感じ
> ![スクリーンショット 2023-12-23 16.54.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/42defef2-10b6-52a9-3dcd-24d8a0efebb3.png "スクリーンショット 2023-12-23 16.54.01.png")

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

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

### dayjsで実装


```
npm i dayjs
```

```js
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)
        }
    }
}

```

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