Notionへのタスク追加、もっと「手元」で済ませたい
普段、タスク管理やメモにNotionを使っているのですが、作業中にふと思い立った時、わざわざウィンドウを開いてロードを待つのが少し億劫でした。
そこで、Macのランチャー「Raycast」とNotion APIを使い、作業画面から移動せずにキーボードだけでタスク登録できるコマンドを作ってみました。
これが想像以上に快適で、思考を止めずにサクサク記録できます。今回は、この「自分専用のTODO入力コマンド」の作り方をシェアします。
この記事はこんな人に向いています
普段からNotionとMacを愛用していて、「もっと入力をサクサク行いたい」と感じている方を想定しています。
- Notionを開くまでの数秒や、入力までのステップが少し面倒に感じている
- キーボードから手を離さず、思いついた瞬間に記録したい
- Raycastを使っていて、簡単なスクリプト(コピペ程度)なら試してみたい
「ガチガチのシステム構築」というよりは、今のワークフローを少しだけチューニングして、日々の作業を快適にしたい人向けの内容です。
今回作ったもの
百聞は一見にしかず、ということで実際の挙動はこちらです。
流れとしては非常にシンプルです。
- Raycastから自作コマンド(
Create Todoなど)を呼び出す - 「タスク名」と「日付」を入力してEnter
- Notionデータベースにページが追加され、作成されたページが自動的にブラウザ(またはアプリ)で開く
ただタスクを放り込むだけでなく、作成直後にそのページが開くようにしています。これにより、「とりあえずタイトルだけ登録」もできますし、「登録してすぐに詳細をメモ書きする」という動きもスムーズに繋がります。
「自分専用Todo入力」の作り方
それでは、実際に構築していきましょう。
手順1. アプリのインストール
MacのランチャーRaycastと、Notionアプリをインストールしておきます。Notionはブラウザ版でも動作しますが、アプリ版の方がスクリプト実行後の画面遷移がスムーズです。
手順2. Todoリスト(データベース)の作成
Notionで新規データベースを作成し、以下のプロパティを用意してください。プロパティ名がスクリプトと連動するため、正確に入力します。
【スクリプト連携用(必須)】
- Name(タイトル):ここにタスク名が入ります。
- Date(日付):ここに取り組む日付/期限が入ります。
【タスク管理用(推奨)】
実用的なリストにするため、以下も合わせて作っておくのがおすすめです。
- Status(ステータス):未着手・進行中・完了などの管理用。
- Priority(セレクト):優先度管理用。
作成できたら、そのデータベースをフルページで開いた状態で Cmd + L を押し、URLをコピーします。URLの中にある notion.so/ と ?v= の間の文字列(32桁の英数字)が DATABASE_ID です。これを控えておきます。
手順3. APIトークンの取得
外部からNotionを操作するための権限を発行します。
Notion Integrations にアクセスし、「新しいインテグレーション」を作成してください。設定したいワークスペースを選び、種類は「内部」を選択します。
発行された 内部インテグレーションシークレット(ntn_から始まる文字列)をコピーして控えます。これが NOTION_TOKEN となります。
作成したインテグレーションを、先ほどのデータベース右上の「…」メニューから「接続」で追加しておきます。
手順4. Node.jsの準備
今回のスクリプトはJavaScript(Node.js)で動作します。まだインストールしていない場合は、公式サイトからLTS版をダウンロードしてインストールしてください。
手順5. コマンドファイルの作成
Raycastを開き、Create Script Command と入力してEnterを押します。設定画面が出たら、以下のように入力してください。
-
Template:
Node.js -
Mode:
Compact(入力窓が小さく、タイトルと日付だけをサッと入力できるモードです) -
Title:
Create Todo -
Package Name:
Notion
入力できたら Cmd + Enter で保存します。保存先フォルダを聞かれるので、任意の場所(Documents/Raycast Scriptsなど)を選んでください。
手順6. ライブラリのインストール
保存したフォルダには自動的に create-todo.js などのファイルが生成されていますが、今回はNotion公式のライブラリを使うため、簡単なインストール作業が必要です。
ターミナルでそのフォルダを開き、以下のコマンドを実行してください。
npm install @notionhq/client
手順7. コードのコピペと設定
生成された .js ファイルを適当なエディタ(VS Codeなど)で開き、元々書かれている内容をすべて消して、以下のコードをまるごとコピペしてください。
#!/usr/bin/env node
// Required parameters:
// @raycast.schemaVersion 1
// @raycast.title Create Todo
// @raycast.mode compact
// Optional parameters:
// @raycast.icon 📝
// @raycast.argument1 { "type": "text", "placeholder": "Title" }
// @raycast.argument2 { "type": "text", "placeholder": "Date (YYYY-MM-DD format, empty for today)", "optional": true }
// @raycast.packageName Notion
import { Client } from "@notionhq/client";
import { exec } from "child_process";
// ハードコードされた設定
const NOTION_TOKEN = "your_notion_integration_token_here";
const DATABASE_ID = "your_notion_database_id_here";
// Notionクライアントの初期化
const notion = new Client({
auth: NOTION_TOKEN,
});
// 日付フォーマット関数
function formatDate(date) {
if (!date) {
// 今日の日付を取得(JST)
const now = new Date();
const jstOffset = 9 * 60;
const jstTime = new Date(now.getTime() + jstOffset * 60 * 1000);
return jstTime.toISOString().split("T")[0];
}
// スラッシュをハイフンに変換
const formattedDate = date.replace(/\//g, "-");
// 日付フォーマットのバリデーション
if (!/^\d{4}-\d{2}-\d{2}$/.test(formattedDate)) {
throw new Error("Date must be in YYYY-MM-DD or YYYY/MM/DD format");
}
return formattedDate;
}
// ページ作成関数
async function createPage(title, dateInput) {
try {
console.log(`Creating page: ${title}`);
const targetDate = formatDate(dateInput);
console.log(`Date: ${targetDate}`);
// ページを作成
const response = await notion.pages.create({
parent: { database_id: DATABASE_ID },
icon: {
emoji: "📝",
},
properties: {
Name: {
title: [
{
text: {
content: title,
},
},
],
},
Date: {
date: {
start: targetDate,
},
},
},
// シンプルなコンテンツを追加
children: [
{
object: "block",
type: "heading_3",
heading_3: {
rich_text: [
{
type: "text",
text: {
content: "📌 タスク内容",
},
},
],
},
},
{
object: "block",
type: "to_do",
to_do: {
rich_text: [
{
type: "text",
text: {
content: "",
},
},
],
checked: false,
},
},
{
object: "block",
type: "to_do",
to_do: {
rich_text: [
{
type: "text",
text: {
content: "",
},
},
],
checked: false,
},
},
{
object: "block",
type: "to_do",
to_do: {
rich_text: [
{
type: "text",
text: {
content: "",
},
},
],
checked: false,
},
},
{
object: "block",
type: "divider",
divider: {},
},
{
object: "block",
type: "heading_3",
heading_3: {
rich_text: [
{
type: "text",
text: {
content: "💭 メモ",
},
},
],
},
},
{
object: "block",
type: "bulleted_list_item",
bulleted_list_item: {
rich_text: [
{
type: "text",
text: {
content: "",
},
},
],
},
},
{
object: "block",
type: "bulleted_list_item",
bulleted_list_item: {
rich_text: [
{
type: "text",
text: {
content: "",
},
},
],
},
},
{
object: "block",
type: "bulleted_list_item",
bulleted_list_item: {
rich_text: [
{
type: "text",
text: {
content: "",
},
},
],
},
},
],
});
console.log(`✅ Page created successfully!`);
console.log(`Page ID: ${response.id}`);
// Notionアプリで開く
if (response.url) {
const notionAppUrl = response.url.replace("https://", "notion://");
console.log(`Opening: ${notionAppUrl}`);
exec(`open "${notionAppUrl}"`);
}
return response.id;
} catch (error) {
console.error("❌ Error creating page:", error.message);
throw error;
}
}
// メイン処理
async function main() {
// コマンドライン引数を取得
const title = process.argv[2];
const date = process.argv[3] || undefined;
if (!title) {
console.error("Error: Title is required");
process.exit(1);
}
try {
await createPage(title, date);
} catch (error) {
console.error("Failed to create page");
process.exit(1);
}
}
// 実行
main();
手順8. IDとトークンの書き換え
コピペしたコードの上部(18〜19行目あたり)にある以下の部分を、先ほど控えておいた自分のものに書き換えます。
// ハードコードされた設定
const NOTION_TOKEN = "ntn_xxxxxxxx..."; // 控えておいた「内部インテグレーションシークレット」
const DATABASE_ID = "xxxxxxxx..."; // 控えておいた「データベースID」
書き換えて保存すれば、実装完了です!
Raycastを開いて Create Todo と打てば、自作コマンドが起動するはずです。
【おまけ】リスト確認も「一瞬」で行う
入力は爆速になりましたが、「リストの中身を確認したい時」もNotionを探していませんか?
ついでに、Todoリストを一発で開くショートカット(Quicklink)も作っておきましょう。
- Raycastで
Create Quicklinkを実行。 -
Name:
Open Todoなど。 -
Link: ここに一工夫加えます。
- 通常は
https://www.notion.so/...ですが、先頭をnotion://に書き換えて登録してください。 - 例:
notion://www.notion.so/my-workspace/task-db-id...
- 通常は
こうすることで、ブラウザを経由せずダイレクトにNotionアプリが立ち上がるため、体感速度が劇的に上がります。
これで、「入力」も「確認」もキーボードだけで完結する環境の完成です。
トラブルシューティング:nvmを使っている場合
スクリプトを実行した際に、以下のようなエラーが出て動かないことがあります。
Reason: env: node: No such file or directory
Domain: scripts
これは、RaycastがNode.jsの実行場所を見つけられていないことが原因です。特に nvm (Node Version Manager) などを使ってNode.jsを管理している場合に発生します。
対処法:Nodeの絶対パスを指定する
ターミナルで以下のコマンドを打ち、現在使っているNodeのパスを確認してください。
which node
すると、以下のようなパスが表示されます。
/Users/username/.nvm/versions/node/v20.x.x/bin/node
このパスをコピーし、作成したスクリプトファイル(.js)の1行目を書き換えます。
// 変更前
#!/usr/bin/env node
// 変更後(自分のパスに書き換え)
#!/Users/username/.nvm/versions/node/v20.x.x/bin/node
これでRaycastが正しくNodeを認識できるようになり、コマンドが動くはずです。
まとめ:入力の「摩擦」を消して、本来の作業に集中する
今回紹介した仕組みは、技術的には「APIを叩いているだけ」のシンプルなものです。
しかし、導入してからは「Notionを開く」という心理的・時間的コストがゼロになりました。
- 思いついた瞬間に
Create Todoで投げ込む - 0.5秒で完了し、すぐに元の作業に戻る
このサイクルが出来上がったことで、タスクの取りこぼしがなくなり、「あれ忘れてないかな?」という脳のバックグラウンド処理から解放されました。
結果として、コードを書いたり設計を考えたりといった本来集中すべきクリエイティブな時間の質が確実に上がっています。
「Notionを開くのが面倒」と感じている方は、ぜひこの週末に少しだけ時間を割いて、自分専用の爆速入力環境を作ってみてください。一度作れば、その快適さは一生モノだと思います!
