AI開発環境（v0とCursor）でずっと欲しかったWebアプリを爆速で作った話【作り方も解説】

最初にこちらが成果物です。

![mosaic_20241107135125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240240/3d4cb3ca-be06-be7f-4b54-5b31ee2205bf.png)


[https://google-calendar-analytics-git-develop-masaoka108s-projects.vercel.app?_vercel_share=JW5UcgwKY7YYw5QMPFBtMRPAoY55O7FZ](https://google-calendar-analytics-git-develop-masaoka108s-projects.vercel.app/?_vercel_share=JW5UcgwKY7YYw5QMPFBtMRPAoY55O7FZ)

Googleカレンダーを連携してタイトルをサマリー、時間を集計してくれるアプリです。

前々から自分の稼働時間分析をしたいと思っていました。
この手のツールではTogglを使うのがスタンダードなのでしょうけど、どうも使いずらい・・・
計測を開始するのも停止するのもすぐに忘れてしまう。。

私は全ての予定をGoogleカレンダーに登録するのでそれをサマリーしてくれるサービスがあったらいいなとずっと思っていました。
TimeNavi（https://www.timenavi.com/）
というサービスがいい感じにその願いを叶えてはくれたのですが、途中から課金しないといけないようで断念。

ChatGPTの登場をきっかけにGoogleカレンダーと連携してスプレッドシートにサマリーを書き出すGASを組んだりしていました。
これでもよかったのですが、やはりもっと手軽にWebベースで使いたい・・・と思っていたところにv0やCursorの登場。

AI開発環境で何かを作りたいと思っていたし、これはいけるのではないか！！！と思い着手。

工数的にはスタートからデプロイまで5〜6h程度だと思います。

「AIで簡単にアプリが作れる！」という話は色々聞きますが実際に作った過程をシェアした記事はあまりない気がしたので今回執筆しました。

作り方の手順は以下の通りです。

1. v0でベースとなるアプリを生成
2. v0で生成したアプリをローカルで動くようにする
3. Cursorで自然言語で修正を加える
4. Vercelにデプロイ

## 1. v0でベースとなるアプリを生成

![スクリーンショット 2024-11-07 14.17.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240240/4ffb9545-b4e9-9c74-d523-19fc78c4f275.png)


https://v0.dev/

v0に以下のプロンプトを実行

```jsx
以下のWebアプリを作成してください。

・Googleカレンダーと連携して、予定のタイトルを取得。 
・タイトルが同じものを集計して各タイトルに何時間つかっているかを可視化する。 
・可視化の方法はリスト形式（タイトル、時間）と円グラフで表示。 \
・ 集計単位は月毎で「次へ」「前へ」ボタンで前月、次月へ遷移できる。
```

![スクリーンショット 2024-11-07 14.26.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240240/328eb6d0-2014-c7dd-6149-b2909e7f935d.png)


これだけで原型が完成しました。

![スクリーンショット 2024-11-07 14.27.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240240/46d1cf7e-4cde-6bd5-b82c-817dccf51e1c.png)

おそらくライブラリの問題と思われますが円グラフや一覧はプレビューに現れませんでした。
v0の環境だとGoogle連携もできないのでこの時点ではアプリとして動かないがコードは生成できているのでこのまま進行。

本筋ではないですが、以下のプロンプトでREADME.mdも生成してもらう。

```jsx
このコードをローカルにダウンロードして動かしたいのでRead.meを作成してくれますか？
```

## 2. v0で生成したアプリをローカルで動くようにする

これが少しコツがいりました。こちらの記事を参照させていただきました。

https://qiita.com/nekoniii3/items/e8aaf7762110a8be9b84

まず大元となるReactのプロジェクトを生成します。

Node.js、npmの環境についてはここでは割愛します（バージョン問題の解消に一番時間がかかりました・・・）

Next.jsのプロジェクトを作成

```jsx
npx create-next-app@latest
```

作成したフォルダに移動

```jsx
cd [作成したフォルダ名]
```

開発モードで起動

```jsx
npm run dev
```

[http://localhost:3000](http://localhost:3000/) でブラウザからアクセスできればOKです。

次にv0で生成したコードをローカルに移植していきます。

![スクリーンショット 2024-11-07 14.38.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240240/c877458d-6e67-e211-c591-ef47520fd5e9.png)


「Add to Codebase」のコマンドをコピーしてプロジェクトのルートで実行します。

今回は4ファイル生成されたので4回コマンドを実行しました。

実行するごとにプロジェクトにファイルが追加されていきます。

ここで問題が発生。全てのファイルをローカルのプロジェクトに入れたのですがアプリが動かない・・・・

Cursorで「アプリを動くようにしてください」と言ってもうまくいかない。

よくよくコードを見てみるとimportの参照先が間違っていました。

```jsx
import { GoogleAuth } from '../google-auth' //本当は ./components-google-auth とするべき
```

また、v0で生成したページを表示するURLがありませんでした。

これはCursorに以下のようにプロンプトを流して解決

```jsx
@app-page.tsx この画面を表示するURLがないようなのでルートに設定して下さい
```

これで [http://localhost:3000](http://localhost:3000/)  でアクセスできるようになりました。

しかし、Google認証はまだ動かず。

![スクリーンショット 2024-11-07 14.46.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240240/a8dc0620-4b9c-2720-5c4b-33a597d6bd0f.png)


## 3.Cursorで自然言語で修正を加える

ここまで来たらあとはひたすらCursorでアプリが動作するように指示してTry & Errorです。

```jsx
Google認証が動かないようなのだけどどうしたらいい？
```

```jsx
サインイン直後にグラフが表示されないようです。修正してもらえますか。
```

```jsx
Previous Month,Next Monthのボタンで切り替えができません。修正して。
```

```jsx
Event Listの左にチェックボックスを表示して
```

```jsx
チェックボックスがFalseになったらグラフにも描画しないようにして
```

```jsx
Even Listの下にチェックボックスがtrueのものの合計hoursを表示して
```

Cursorの基本的な使い方はこちらを参照させていただきました。

https://zenn.dev/umi_mori/books/ai-code-editor-cursor

Google Calendarの認証周りで少し迷いましたが基本Cursorに聞けば解決法を教えてくれました。

![スクリーンショット 2024-11-07 14.48.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240240/3c6ee154-2199-2245-7fc1-1049ca4ce4f9.png)

Cursorの提案をAccept → 別の機能を実装 → エラーが発生したら対処の繰り返しです。

ほとんどコードを真剣に読むことはありませんでした。99%↑のような自然言語で開発完了。

少しだけコードを読んだのは例えば「チェックボックスを配置して」と言った時にリストのコードを指定しないと全然違うところにチェックボックスが追加されたので、範囲を限定する必要があったので修正が必要なファイルとコードの位置を追いかけました。

ローカルで動作するようになるまでひたすらCursorとの対話を続けます。

## 4.Vercelにデプロイ

私はVercelにデプロイしたことがなかったのでやり方をCursorに聞いて対応。

デプロイ時に色々エラーが発生しましたが、エラーメッセージをそのままCursorにコピペして修正案をAcceptを数回繰り返して無事にデプロイできました。

Vercelの環境変数の設定もCursorが教えてくれました。

---

これで完成したWebアプリがこちらです。

![mosaic_20241107135125.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240240/23e31e9e-442f-1553-3a8e-0dd43f5cdfba.png)

[https://google-calendar-analytics-git-develop-masaoka108s-projects.vercel.app?_vercel_share=JW5UcgwKY7YYw5QMPFBtMRPAoY55O7FZ](https://google-calendar-analytics-git-develop-masaoka108s-projects.vercel.app/?_vercel_share=JW5UcgwKY7YYw5QMPFBtMRPAoY55O7FZ)

## まとめ
まずは自分がずっと欲しかったアプリが実現して大変嬉しいです。

開発過程についてはAIが生成したコードが動かなかった時、全くコードが読めないと詰んでしまうな、とは思いました。

あとCursorで開発してもらっている時に何回もデグレってしまいました。あるエラーは解消したけど、元々実装していた機能が動かなくなった、など。

あとはもっとカッコイイUIになると良いなと思ったので、次はv0で生成する時点でもっとこだわろうと思います。

# **おまけ**

株式会社MAKE A CHANGEはAIシステム・アプリ開発とソリューションを提供する専門企業です。

お気軽にご相談ください。

また、生成AIに関わる仕事がしたい仲間（AIエンジニア、PM、UIUXデザイナーなど）も募集中です。

https://makeachange.co.jp/