NotionAPI×GASで自動でページ作成

## 概要

Notionのデータベース配下に定期的にページを作成したいときの方法を紹介します。
私はこの方法で習慣トラッカー用の空ページを毎日自動作成しています。


## 前提条件

- NotionAPIトークンを発行していること

https://developers.notion.com/docs/getting-started

→ 記事を書いたのでご参照ください(2021/11/15 追記)

https://qiita.com/g-iki/items/cc44fa7573dc3f6e39de

:::note warn
APIトークン発行後、ページを作成したいデータベースに対して、インテグレーションの招待を忘れないようにしてください
:::

## 使用API

https://developers.notion.com/reference/post-page


## ソース

下記のコードでは翌日日付(yyyy/mm/dd形式)の空ページを作成する例を記載しています。

main.gs

```js
/**
 * 習慣トラッカー用の日付ページを作成する
 * タイトルとしてyyyy/mm/dd形式の文字列
 * 曜日の算出に使用したいので、Dateというプロパティに日付型で
 */
function makeHabitTrackerDatePage() {
  let props = PropertiesService.getScriptProperties().getProperties();
  let d = new Date();
  let tomorrow = new Date(d.setDate(d.getDate() + 1));


  let payload = {
    "parent": {
      "database_id": props.DATABASE_ID_HABIT
    },
    "properties": {
      "Name": {
        "title": [
          {
            "text": {
              "content": Utilities.formatDate(tomorrow, "JST", "yyyy/MM/dd") // タイトルとして文字列型の日付
            }
          }
        ]
      },
      "Date": {
        "date": {
          "start": Utilities.formatDate(tomorrow, "JST", "yyyy-MM-dd") // 曜日の算出に使用したいので日付型の日付
        }
      }
    }
  }
  Logger.log(props.DATABASE_ID_HABIT)
  postPage(props, payload);
}

/**
 * 新規でページを作成する
 */
function postPage(props, payload) {
  let url = "https://api.notion.com/v1/pages";
  let options = {
    "method": "POST",
    "headers": {
      "Content-type": "application/json",
      "Authorization": "Bearer " + props.NOTION_TOKEN,
      "Notion-Version": props.NOTION_VERSION,
    },
    "payload": JSON.stringify(payload),
    "muteHttpExceptions": true
  };

  try {
    let res = UrlFetchApp.fetch(url, options);
    Logger.log(res)
    return JSON.parse(res);
  } catch (e) {
    Logger.log(e);
    return undefined;
  }
}

```

env.gs

```js
/**
 * 手動実行で設定する
 * (新しいGASエディタだとGUIでの設定ができないため・・・古いエディタに切り替えての設定でも可)
 */
function setScriptProps() {
  let scriptProperties = PropertiesService.getScriptProperties();
  
  scriptProperties.setProperties({
    'NOTION_VERSION': '2021-08-16',
    'NOTION_TOKEN': 'secret_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
    'DATABASE_ID_HABIT': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
  });
}
```

※ `NOTION_TOKEN`はNotionAPIで発行したトークン、`DATABASE_ID_HABIT`はデータベースのIDに書き換えてください

※ データベースのIDはデータベースを`ページとして開く`で開いたときのURL (例)`https://www.notion.so/{userID}/{databaseID}?v={vieID}`
から取得します

## 実行方法

### スクリプトの環境変数を設定する

上記env.gsの`setScriptProps()`関数を実行します(以前はGUIによる設定ができていましたが、現在はGASを古いエディタに切り替えないと設定できないのでスクリプトで設定します)

![2021-10-29_01h37_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/1acf2823-1909-8ea6-be74-7dc3e7cc5b12.png)

### 動作確認として実行

動作確認として手動で`makeHabitTrackerDatePage`関数を実行して、ページが作成されることを確認します

![2021-10-29_01h48_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/cdb34641-f401-bcd0-0574-e1ec12add730.png)

上記のコードの通り実行した場合、翌日日付の空ページが作成されていればOKです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/8eca5539-f773-8d25-3feb-f1fb4ec778fa.png)



### GASの定期実行設定

GASエディタページの左タブから`トリガー`を選択し、新しいトリガーを作成します。

![2021-10-29_01h41_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/2b002fa6-d7d8-f57d-9023-5ce5bb3a314c.png)

習慣トラッカーとして毎日実行したいときの例は下図のとおりです
(GASの時間実行は正確な時間(毎日ピッタリAM01時00分00秒に実行とか)ではないので、適当なものを選択しています)

![2021-10-29_01h42_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/fb5b31b6-21d2-af7b-a9f2-3fbf209395b7.png)

## その他メモ

- 習慣トラッカーであれば中に書いていくテンプレートは同じものを使用するので、テンプレートを指定してページを作ることができればいいなぁ。。。
    - →もしかしたらあるかもしれないので、今後調べようと思います。
- Notion側で日付から曜日を算出するには式 `formatDate(prop("Date"), "dddd")` で算出できます