Shortcutsを使ってNotionにページを作ろう【サンプルあり】

はじめてのNotion API

Notionへ手軽にページを追加したい

日本で人気が急上昇し始めた、情報を整理するための高機能なメモアプリがNotionです。タスク管理やメモ同士のリンクなど、アイデア次第でいろいろなことができる非常に強力なアプリです。特に他のアプリと連携することで真価を発揮します。Notionはどちらかといえばじっくりと整理する用途に向いています。そのため、実は思いついたことをサッとメモを取るという用途にはあまり向いていないように思います。入力するためのアプリはもっと軽いものを使用したくなります。

iPhoneを使っていれば、Shortcutsというアプリを標準で使えます。ShortcutsとはAppleが提供しているアプリです。1つまたは複数の作業を素早く完了させることができます。iOS・macであれば無料で使うことができます。

このShortcutsを使ってNotionのデータベースにページを追加するための手順を記載します。このページに書いてあることを基本として、Notionに追加したい、あるいはNotionから検索したい情報を変更することで自由にNotionを扱うことができるようになります。作り方を覚えてみましょう。

Shortcutのサンプルをダウンロードする(一番下にもあります)

ShortcutsでAPIを使うための方法

Shortcutsに用意されているアクションURLの内容を取得を使います。

Notionに作ったデータベースにページを追加するためのアクションを書いたものがこちらです。

各部の説明

  • …APIのエンドポイント方法です。Notionに対してどんな方法で操作を行うのかを指定します。(詳細)
  • リクエストヘッダです。Notion APIにアクセスするための詳細情報を記載します。どの方法を使う場合もすべて同じことを書きます。(詳細)
  • リクエストボディです。方法でGETを選んだ場合は表示されません。具体的にNotionに送るデータの中身を記載します。ここに書いてある情報をもとにページが作られます。(詳細)

APIのエンドポイントと方法

URLと方法の組み合わせで、Notionにどんなことをしたいのかを表します。

Notion APIを使えばページの追加や検索など様々なことができますが、やりたいことごとに入り口が準備されていると考えてください。この入り口のことをAPIのエンドポイントと呼びます。ページを作る時のエンドポイントはこのとおりです。

https://api.notion.com/v1/pages

APIのエンドポイントごとにNotionから指定されています。Notion APIでは GETPOSTPATCHDELETEの4種類を使うことができます。同じエンドポイントでも方法が違うと別の操作になってしまうので注意が必要です。ページを作る時の方法はPOSTを選択してください。

リクエストヘッダ

Notion APIにアクセスするための詳細情報を記入します。作るときにはすべて共通のものを使用します。

世の中には様々なAPIがあり、APIごとに記入する内容が異なります。Notion APIを使う限りはすべて共通の内容を書けばよいです。

キー
AuthorizationBearer [インテグレーションのシークレット]
Content-Typeapplication/json
Notion-Version2022-06-28
Authorizationの Bearer と インテグレーションのシークレットの間にはスペースが入ります。

Authorization

Authorizationにはあらかじめ作成しておいたインテグレーションのシークレットを指定します。

シークレットは直接書いても良いですが、変数として扱うほうが間違いに気づきやすいので、あらかじめテキストに書いてから変数を設定しています。

こうすることで、変数名secretを記入すればテキストに書いた文字が呼び出されます。

URLの内容を取得 に書くときには、Bearerという文字をあたまに書き、スペースを開けることを忘れないでください。これは「このように書いてください」というルールとして決まっているものです。

Bearer [インテグレーションのシークレット]

Content-Type

Content-Typeには情報のやり取りの形式を指定します。

NotionAPIを使う限りは「このように書いてください」というルールとして決まっているものと考えて良いです。

application/json

Notion-Version

Notionは日々進化しています。新しい機能が追加された時や今ある機能が更新された時に、APIが対応しきれない場合があります。そういった場合には新しいバージョンを作ってリリースすることになります。しかし新しいバージョンが作られた時、APIを使っているすべてのアプリケーション全てがすぐに新しいバージョンを適用できるわけではありません。そのため、アプリケーション側から今使っているNotion APIのバージョンを指定することで、乗り換えるタイミングをコントロールすることができるようになります。

Notion APIのバージョンは 年月日で表されます。2024/1/4時点での最新バージョンは 2022-06-28 ですので、これを指定します。

2022-06-28

なお、ヘッダは折りたたむことができます。開いたままだと見づらいので、ジャマだと思ったら折りたたんでしまいましょう。

ヘッダ横のシンボルをおすことで開閉できます。

リクエストボディ

Notionに送信するページの情報です。ページの情報は辞書形式で値を扱います。

キー
parentページを作るデータベースのデータベースID
properties作るページのプロパティ。今はタイトルを指定します。

parent

parentには、「どこにページを作るのか?」という情報を書きます。Notionのページはデータベースに作るか、すでにあるページの子ページに作る2つ選択肢があります。今回のサンプルではデータベースにページを作ります。

データベースにページを追加するときには database_id というキーを指定します。

すでにあるページに子ページを追加するときには page_id というキーを指定します。

インテグレーションのシークレットと同じように、database_id変数を設定しています。

データベースIDの調べ方はこちらの記事を参照してください

URLの内容を取得の本文を要求を「JSON」にしてから一行追加します。

左下の「+」を押すと一行追加されます
追加された行にキーと値を入れて、種類を選択します
一行目のキーをparentにしてください。辞書に変更すると折りたたまれているので、一番左の「>」を押すとparentの下にさらに追加できます

parentの種類は辞書に変更してください。そうするとその下にデータを入れ子に追加できます。

入れ子にdatabase_idを記入します。

properties

propertiesの中には、Notionのデータベースに設定しているプロパティをひとつずつ記入します。

囲った部分が「Name」という名前のプロパティを表しています。ページのタイトルです。

propertiesの下には、データベースのプロパティを一つずつ書きます。今回はページのタイトルのみを投稿することにしましょう。タイトルという変数に入れた文字がそのままNotionに追加されることになります。

このAPIを実行すると、タイトルが追加されます。

単にタイトル名だけ書けば良さそうですが、プロパティ毎に決められた書き方のルールがあります。タイトルを書くには、次のように書いてください。何を表しているかわからないかもしれませんが、ルールなのでこれに従ってください。

配列は辞書と同じように一段下にアイテムを持つことができます。ただし、辞書と違ってキーを持ちません。キーには何も入力しなくて大丈夫です。

キー階層種類備考
[プロパティ名]1辞書なしプロパティ名はNotionデータベースを確認してください
title2配列なし
項目13辞書なし
text4辞書なし
content5テキスト[タイトル]値は追加したいタイトルにしてください
階層は、「Name」の1階層目を1としています

ちょっと複雑で分かりづらいですが、Notion APIを使うためにはこのように書く必要があります。

またタイトルの他にもプロパティに値を書きたい時は、プロパティごとに書き方が違うので注意してください。

さて、ここまでで準備は終わりです。ここまでできたらテストをしてみましょう。変数タイトルに「テスト」という文字列を入れてショートカットを実行してください。

成功!

うまくいかない時の方法

作り終わったら、かんたんな投稿をテストしてみましょう。ショートカットを実行してからデータベースを見に行くとページが作られていますか?
Notion APIを使う手順は複雑なので、作ってみたらうまくいかないことはよくあります。そんな時の調べ方と対処法を知っておくことで、自分でShortcutを作る時に役立ちます。

うまくいかない時の調べ方と対処方法

うまくいかなかった時は、かならずどこかに原因があります。まずはこの原因を調べなければ、対応方法を間違える可能性があります。しかしエラーの調べ方は慣れないとわかりません。どうすればよいのでしょうか?

Shortcutsでは、結果を表示を使って、アクションURLの内容を表示の結果を表示してみると結果を見ることができます。例えばこんな表示になります。

{"status":401,"object":"error","code":"unauthorized","message":"API token is invalid.","request_id":"0ffa5e9b-1682-4cdb-b228-abc42666f564"}

ここにはエラーの原因が書いてあるのですが、謎の文章で何が書いてあるわからないですね。エラーはリクエストと同じくJSONという形式で表示されています。JSONは適切に改行を挟むと読めるようになります。私はDraftsというアプリを使って変換しています

{
    "status": 401,
    "object": "error",
    "code": "unauthorized",
    "message": "API token is invalid.",
    "request_id": "0ffa5e9b-1682-4cdb-b228-abc42666f564"
}

すべての行で、「:」の左をキー、右を値と呼びます。

codeというキーの値はunauthorized、messageというキーの値は API token is invalid. と書かれています。
よくわからないけれど、APIトークンと呼ばれるものがinvalidで認証エラーのようです。見たことがないエラーの場合はこのメッセージを検索して原因を調べて対策をします。

代表的なエラーとその対処方法

私が作っている時によく見たエラーを書いておきます。エラー調査の参考にしてください。

なお、正しい方法じゃなければ全てエラーになってうまくいかないため、エラーの原因は多岐にわたります。ここに書いてあるものですべてのエラーが解決するわけではないことはご了承ください。

401 unauthorized

認証エラーです。
インテグレーションのシークレットキーが誤っている可能性があります。
インテグレーションが正しく作られていること、作ったでシークレットキーが正しく、Shortcutsのsecretにコピーされていることを確認してみてください。

404 object_not_found

データベースが見つからないエラーです。
データベースIDが誤っている可能性があります。データベースIDが正しいことを確認してください。
Notionのデータベースは、大元のデータを保存しているデータベースと、それを表示するためのビューとがあります。それぞれ別のIDを持っているので、ビューのIDを見てしまってデータベースIDではなかったということがよくありました。この場合はエラーが表示されてしまうので、間違いなくデータベースIDであることを確認してください。

{
    "status": 404,
    "object": "error",
    "code": "object_not_found",
    "message": "Could not find database with ID: ***. Make sure the relevant pages and databases are shared with your integration.",
    "request_id": "abfb6bb3-6603-48bb-ba1c-7a0128ebd1fd"
}

messageには、「このIDのデータベースが見つかりません!インテグレーションとデータベースがつながっていることを確認してください」と書かれています。

なお、*が連続しているところは実際はdatabase_idが書かれています。

400 validation_error

これはリクエストボディの内容が誤っているエラーです。これはいくつかの理由が考えられます。

データベースにConnectionsを追加していない場合

正しいデータベースIDを使っているけど、Notion側で許可されていない場合があります。Connectionsが追加されているかを確認してください。

わざとNotionのconnectionsを削除した時のエラーがこちらです。

{
    "status": 400,
    "object": "error",
    "code": "validation_error",
    "message": "body failed validation. Fix one:\nbody.parent.page_id should be defined, instead was `undefined`.\nbody.parent.database_id should be a valid uuid, instead was `\"***\"`.",
    "request_id": "f751afb4-9150-4ff7-a493-ae7d1f84ab80"
}

messageには、階層構造を “.” (ドット)で繋げて、「bodyのparentのpage_idが定義されているはずが、定義されていない!bodyのparentのdatabase_idは許可されていなければいけない!」と書かれています。

parentには page_id か database_id のいずれかが書かれていなければならないですが、Notionは判断できなかったので可能性のあるものをすべて並べているようです。そのため、自分がやりたいことに合わせてどのエラーメッセージに対応しなければならないかを判断する必要があります。すべてに対応しなければいけないわけではないことにご注意ください。

なお、*が連続しているところは実際はdatabase_idが書かれています。

プロパティが正しくない場合

文字や構造をひとつでも間違えたらエラーになります。
しかしプロパティは複雑なため、慣れていても間違えやすいです。一つずつ指差し確認をしながら正しいかを確認しましょう。

例えばこれは、タイトルを書く「content」を削除した時のエラーです。

階層 5 のcontentを削除した
{
    "status": 400,
    "object": "error",
    "code": "validation_error",
    "message": "body failed validation: body.properties.Name.title[0].text.content should be defined, instead was `undefined`.",
    "request_id": "c976b6a5-465d-4af6-8d11-ee468663da66"
}

messageには 、階層構造を “.”(ドット)でつなげて、「bodyの中にあるpropertiesの中にあるNameの中にあるtitleの1つめにあるtextの中にあるcontent が定義されていなければいけないのに、定義されていません!」と書かれています。

これを読めば、contentが足りていないということがわかります。

おわりに

今回作成したサンプルはこちらからダウンロードできます。

初回実行時のみインテグレーションのシークレットとデータベースIDを聞かれます。あらかじめ準備してからお試しください。またこのShortcutではAPIを使用しており、こちらも初回のみ許可を求められます。

いかがでしたでしょうか。ShortcutsでNotionに投稿するための手順を書いてみました。タイトルを固定していたらあまり意味がないかもしれません。しかし、このタイトルを自由に決められたらどうでしょう。また、タイトル以外のプロパティやページ内の本文も自由に設定できたらどうでしょう。

  • 読んだ本の題名と感想を投稿する
  • 今日の日記を投稿する
  • 買い物の金額と品目を投稿する

アイデア次第で色々なことができるようになります。ぜひ試してみてください!

コメント

タイトルとURLをコピーしました