LoginSignup
5
6

More than 1 year has passed since last update.

Notion APIとGASで日記ページを自動作成する

Last updated at Posted at 2021-07-03

やりたいこと

Notionに毎日日記を書いている。
従来は日記データベース以下にその日のページを手動で作成していたが、面倒なので空ページを毎朝自動作成したい。
スクリーンショット 2021-07-04 8.13.11.png

日記は、以下の情報のみ保持する単純なページとする。

  • タイトル(e.g. 2021/7/4(Sun)
  • 本文
  • 日付(Date型のプロパティ)

方針

(時間トリガー)→ Google Apps Script → (Notion API) → Notion

ページ作成
Notion APIのページ作成APIを利用

リクエスト送信
Google Apps Script(GAS)を利用し、時間トリガーで毎朝スクリプトを実行

実装 (GAS)

Notion API (※執筆時点ではPublic Beta) を呼び出すだけ。
Notion APIの使い方自体はググれば出てくる。事前にNotionの設定画面からIntegrationを作成してIntegration Tokenを取得しておく必要がある。

以下のコードでは、タイトル(e.g. 2021/7/4(Sun))と当日の日付をプロパティとして保持する空ページを、既存の日記データベース("**YOUR DATABASE ID**"でIDを指定)の下に作成している。

// Create a common header object for Notion API
const notionHeader = token => ({
  'Content-Type': 'application/json',
  'Authorization': 'Bearer ' + token,
  'Notion-Version': '2021-05-13'
})

// zero-fill month/day string
const zfill2 = str => {
  return str.length === 2 ? str : '0' + str
}

// Create a diary page for the given date
const createDiaryPage = (dbId, date, token) => {
  const url = `https://api.notion.com/v1/pages`
  const jaToday = date.toLocaleDateString("ja-JP", { timeZone: "Asia/Tokyo" }) // e.g. 2021/7/3
  const jaDate = jaToday.split('/')
  const dayOfWeek = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][date.getDay()]

  const body = {
    parent: {
      database_id: dbId,
    },
    properties: {
      Date: {
        date: {
          start: `${jaDate[0]}-${zfill2(jaDate[1])}-${zfill2(jaDate[2])}`, // YYYY-MM-DD
          end: null
        }
      },
      Name: {
        title: [{
          text: {
            // without zfill (e.g. 2021/7/3(Sat))
            content: `${jaToday}(${dayOfWeek})`
          }
        }]
      }
    }
  }
  const options = {
    method: 'post',
    headers: notionHeader(token),
    payload: JSON.stringify(body)
  }
  const resp = UrlFetchApp.fetch(url, options)
  return JSON.parse(resp.getContentText())
}


// 定時実行する関数
const createEmptyDiaryForToday = () => {
  const diaryDbId = "**YOUR DATABASE ID**"
  const token = "**YOUR TOKEN**"

  const now = new Date()
  console.log(now)
  const resp = createDiaryPage(diaryDbId, now, token)
  console.log(resp)
}

実装上の注意点

  • ページをPOSTする際に適切なプロパティを与えるため、ページのスキーマを知っておく必要がある。
    • → 事前に手動でページを作り、ページ取得APIのレスポンスを見ながら実装すれば良い。
    • (ページ取得のコード例は↓)
  • GASのUrlFetchApp.fetch()の返り値をconsole.log()すると{}と表示される
    • .getContentText()してJSON.parse()することでレスポンスを取り出す必要がある
    • 空のレスポンスしか返ってきてないと勘違いしてちょっと詰まった(ドキュメントを読めば済む話ではある)
const retrievePage = (pageId, token) => {
  const url = `https://api.notion.com/v1/pages/${pageId}`
  const options = {
    method: 'get',
    headers: notionHeader(token)
  }
  const resp = UrlFetchApp.fetch(url, options)
  return JSON.parse(resp.getContentText())
}
5
6
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
5
6