やりたいこと
Notionに毎日日記を書いている。
従来は日記データベース以下にその日のページを手動で作成していたが、面倒なので空ページを毎朝自動作成したい。
日記は、以下の情報のみ保持する単純なページとする。
- タイトル(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())
}