Site cover image

ふつうのITエンジニアの独り言

本業はAndroidとiPhoneのアプリ開発のエンジニアです。将来はフリーランスで海の近くで妻とのんびり暮らすことを夢見て、幅広くIT技術に触れていきたいと思います。このブログはその備忘録と私のポートフォリオとして活動記録を記すものです。

astro-notion-blogをローカルコピーしてカスタマイズしたい

ローカル環境にソースコードをコピー


ブログのデザインをカスタムするためには、github上のソースコードをローカル環境で編集する必要があるらしい。ローカル環境を構築し、修正が必要なソースコードの確認は、ま〜ちさんのブログが参考になった。

https://rakuraku-engineer.com/posts/anb-custom/

Githubのアクセストークンの作成


Githubの使い方からわからず、アクセストークンの作成に悩んだのでメモ。

右上のアイコンからSettingsを選択。
左側に表示されるメニューから、Developer Settingsを選択する。
メニューにPersonal access tokensが表示されるので、Tokens(classic)を選択

Notionデータベースにカラム追加と表示への反映を確認


ブログの構成を変更するにあたって、notionからどのように情報を取り出してブログに反映しているのか?を知るために、データベースに情報を追加してブログの表示を修正してみる。

Notionのプロパティ型と値の構造について

Notionの情報を取り出すにあたって、Notionのプロパティを知っておく必要があった。プロパティの構造は以下のようになっている。

type 説明 値の構造(例)
title ページのタイトル title: [{ text: { content: "タイトル名" } }]
rich_text リッチテキスト rich_text: [{ text: { content: "テキスト内容" } }]
number 数値 number: 42
select 単一選択 select: { name: "選択肢名", color: "blue" }
multi_select 複数選択 multi_select: [{ name: "選択肢1" }, { name: "選択肢2" }]
date 日付 date: { start: "2025-08-26", end: null }
checkbox チェックボックス checkbox: true
url URLリンク url: "https://example.com"
email メールアドレス email: "user@example.com"
phone_number 電話番号 phone_number: "+81-90-1234-5678"
people ユーザー people: [{ object: "user", id: "xxxx", name: "名前" }]
files ファイル files: [{ name: "ファイル名", type: "file", file: { url: "..." } }]
relation 他DBとの関連 relation: [{ id: "関連ページID" }]
rollup 集計 rollup: { type: "number", number: 3 }(型により構造が異なる)
formula 計算式 formula: { type: "string", string: "結果" }(型により構造が異なる)
created_time 作成日時 created_time: "2025-08-01T12:00:00.000Z"
created_by 作成者 created_by: { object: "user", id: "xxxx" }
last_edited_time 最終編集日時 last_edited_time: "2025-08-25T14:30:00.000Z"
last_edited_by 編集者 last_edited_by: { object: "user", id: "xxxx" }
status ステータス(テンプレート用) status: { name: "進行中", color: "blue" }

ブログ表示を編集してみる

その1 : データベースにカラム追加

今回は、ブログのページの最終更新日を公開日の横に表示してみたい・・・ということで、Updateのカラムを追加した。また、Updateのtypeは”last_edited_time”で、ページ更新のたびに自動で値が更新されるようにした。次にこのカラムの値を取得して、ブログの表示に反映させていく。

その2 : client.tsを編集してpropertyを取得

src/lib/notion にあるclient.tsを以下のように編集した。Update変数を追加し、last_edited_timeの値を取得してUpdate変数に格納するようにした。

  const post: Post = {
    PageId: pageObject.id,
    Title: prop.Page.title
      ? prop.Page.title.map((richText) => richText.plain_text).join('')
      : '',
    Icon: icon,
    Cover: cover,
    Slug: prop.Slug.rich_text
      ? prop.Slug.rich_text.map((richText) => richText.plain_text).join('')
      : '',
    Date: prop.Date.date ? prop.Date.date.start : '',
    Update: prop.Update.last_edited_time ? prop.Update.last_edited_time : '',
    Tags: prop.Tags.multi_select ? prop.Tags.multi_select : [],
    Excerpt:
      prop.Excerpt.rich_text && prop.Excerpt.rich_text.length > 0
        ? prop.Excerpt.rich_text.map((richText) => richText.plain_text).join('')
        : '',
    FeaturedImage: featuredImage,
    Rank: prop.Rank.number ? prop.Rank.number : 0,
  }

  return post
}
その3 : interface.tsにUpdate追加

その2でUpdate変数に値を格納したが、Update変数はPostのinterfeceに追加しておく必要があった。UpdateはDateと同じく文字列として宣言した。

export interface Post {
  PageId: string
  Title: string
  Icon: FileObject | Emoji | null
  Cover: FileObject | null
  Slug: string
  Date: string
  Update: string
  Tags: SelectProperty[]
  Excerpt: string
  FeaturedImage: FileObject | null
  Rank: number
}
その4 : 日付表示を編集

ブログに表示される日付は、src/components/PostData.astroでhtmlのタグが生成されている。今回、日付と最終更新日は必ずセットで表示させるようにしたいので、このファイルを以下のように編集。

<div class="post-date">
  {post.Date ? getDateStr(post.Date) : ''} (最終更新 {post.Update ? getDateStr(post.Update) : ''})
</div>
その5 : 表示確認

修正をコミットして表示を確認したところ、ちゃんと表示されていることが確認できた。

まとめ

Notionプロパティへのアクセス方法に悩んだが、型と構造を確認したことで問題なく値の取得ができるようになった。

最終更新日が表示できるようになったのは良かったが、記事の内容の更新だけでなく公開フラグのチェックなどで日付が更新されてしまう。任意のカラムが更新された場合だけ自動で更新日時が変更されるような仕組みがないか、今後調査していきたい。