← Tools に戻る

Development Request

開発依頼書

Sanity HTML入稿 + Googleフォーム設置

作成日: 2026-03-12 / 依頼者: kota

1 全体概要

pink-labo.com に対して2つの機能追加を依頼します。

① Sanity HTML入稿

記事をHTMLで直接入稿できるフィールドを Sanity Studio に追加

② Googleフォーム設置

サイト内に読者アンケート用のGoogleフォームを埋め込み

対象サイト

サイト pink-labo.com(ピンク研究所)
フレームワーク Next.js(App Router)
CMS Sanity
ホスティング Cloudflare Pages

2 なぜやるのか

① HTML入稿が必要な理由

現状: 入稿に時間がかかりすぎている

記事はHTML形式(JSON-LD付き)で完成稿を作成しています。しかしSanityにはRich Text Editor(Portable Text)しかないため、HTMLを手作業で分解して再入力しています。1記事あたり30〜60分の入稿作業が発生し、テーブル・引用枠・FAQ構造などが再現しきれずに品質も落ちます。

解決: HTMLをそのまま貼り付けて入稿したい

SanityにHTMLフィールドを追加すれば、完成稿をコピペするだけで入稿が完了します。入稿時間は1記事5分以下になり、構造の再現性も100%になります。現在59本の入稿済み記事に加え、今後も月20〜30本ペースで記事を投下する計画なので、この効率化のインパクトは大きいです。

ボトルネックの数字

30-60分/本

現在の入稿時間

5分/本

HTML入稿後

90%削減

入稿時間

② Googleフォームが必要な理由

現状: 読者の声を集める手段がない

GA4でPV・滞在時間はわかりますが、「読者が何を求めているのか」「どんな悩みを抱えているのか」を直接聞く手段がありません。SEO記事を書いていても、読者の実態がわからないままコンテンツを作っている状態です。

解決: サイト内でアンケートを取りたい

Googleフォームを記事ページやサイドバーに埋め込み、読者の属性・悩み・求めている情報を収集します。この一次データは記事の質を上げるだけでなく、SEOのKW選定やペルソナ精度の向上にも直結します。外部アンケートツールへの誘導では回答率が下がるため、サイト内に自然に溶け込む形で設置したいです。

期待する効果

  • 読者の実態把握(年代・職種・悩み)→ ペルソナの精度向上
  • 記事リクエストの収集 → 読者が本当に欲しい記事を優先制作
  • 一次データの蓄積 → 独自調査として記事に引用可能(SEO差別化)
  • サイト内完結 → 外部遷移がないため回答率が高い

3 要件①: Sanity HTML入稿機能

3.1 Sanity Studio 側(スキーマ + UI)

フィールド追加

ブログ記事のスキーマに htmlBody フィールドを追加してください。

{
  name: 'htmlBody',
  title: 'HTML本文',
  type: 'text',
  description: 'HTML形式で記事を貼り付け。値がある場合はPortable Textより優先表示されます。',
}

実装方法(2案)

推奨

案A: code-input プラグイン

  • @sanity/code-input をインストール
  • • シンタックスハイライト付きのコードエディタが使える
  • • 保存値: { _type: 'code', language: 'html', code: '...' }
  • • フロント側で htmlBody.code を参照
  • → 工数: 1〜2時間
余裕あれば

案B: カスタムコンポーネント

  • • Reactでコード/プレビュー切り替えUIを自作
  • • 入力したHTMLをその場でレンダリング確認可能
  • • 文字数カウンター付き
  • • 保存値: プレーンなHTML文字列(type: 'text'
  • → 工数: +1〜2時間

まず案Aで動くものを作って、使い勝手を見てから案Bに進めるのがよいです。

フィールドの配置順

1 タイトル
2 スラッグ
3 話題の記事(既存)
4 HTML本文(新規追加)← ここ
5 Rich Text Editor(既存。「従来の入力方式」と説明を付けてOK)
6 View Count / その他の既存フィールド

3.2 フロントエンド側(Next.js)

表示ロジック

htmlBody が存在する場合はそちらを優先表示。ない場合は従来の Portable Text をレンダリング。

// 記事ページのコンポーネント(イメージ)
{article.htmlBody ? (
  <div
    className="article-body"
    dangerouslySetInnerHTML={{
      __html: typeof article.htmlBody === 'string'
        ? article.htmlBody
        : article.htmlBody.code  // code-inputの場合
    }}
  />
) : (
  <PortableText value={article.body} />
)}

GROQクエリの更新

記事取得のGROQクエリに htmlBody を追加。

*[_type == "blog" && slug.current == $slug][0] {
  title,
  slug,
  body,
  htmlBody,  // ← 追加
  // ...
}

CSSとJSON-LD

  • .article-body に基本タイポグラフィ(font-size, line-height等)が適用されること。テーブル・引用枠・FAQの構造が崩れないこと
  • HTML本文内の <script type="application/ld+json"> はそのまま出力でOK(body内でもGoogleは認識します)
  • 既にグローバルCSSで対応済みなら変更不要

入稿フローの変化

Before(現状)

1 HTMLで記事を完成
2 HTMLを見出し・段落・テーブルに分解
3 Sanityの各ブロックに手動で入力
4 プレビューで確認・修正

→ 30〜60分 / 構造の再現性 △

After(HTML入稿後)

1 HTMLで記事を完成
2 SanityのHTMLフィールドにコピペ
3 保存して完了

→ 5分以下 / 構造の再現性 100%

4 要件②: Googleフォーム設置

4.1 設置場所

A

記事ページ下部(本文の後、関連記事の前)

記事を読み終えたタイミングで表示。最も回答率が高いと想定される位置。

B

専用ページ(/survey)

詳細なアンケートは専用ページに設置。記事ページからリンクで誘導。

4.2 埋め込み方法

Googleフォームの iframe 埋め込みを使用します。

<!-- 記事ページ下部に設置するコンポーネント -->
<section class="survey-section">
  <h2>あなたの声を聞かせてください</h2>
  <p>回答は記事改善に使用します(1分で完了)</p>
  <iframe
    src="https://docs.google.com/forms/d/e/FORM_ID/viewform?embedded=true"
    width="100%"
    height="800"
    frameborder="0"
    marginheight="0"
    marginwidth="0"
    loading="lazy"
  >
    読み込んでいます…
  </iframe>
</section>

4.3 実装パターン(2案)

推奨

案A: 全記事に一律表示

  • • 記事テンプレートの本文直後に iframe を配置
  • • 全記事に自動で表示される
  • • フォームURLは環境変数 or 定数で管理
  • • フォームの差し替えが1箇所で済む
  • → 工数: 30分
将来

案B: Sanityで記事別に制御

  • • Sanityスキーマに surveyFormUrl フィールドを追加
  • • 記事ごとに異なるフォームを設定可能
  • • 未設定の記事にはデフォルトのフォームを表示
  • • カテゴリ別のアンケートが可能
  • → 工数: 1時間

まずは案Aで設置し、フォームの運用が安定してから案Bに拡張するのがよいです。

4.4 フォームの設問案(参考)

Googleフォーム自体はこちらで作成します。以下は設問の方向性です。

Q1

あなたの年代は?

選択式: 10代 / 20代前半 / 20代後半 / 30代 / 40代以上

Q2

この記事は役に立ちましたか?

5段階: とても役立った〜全く役に立たなかった

Q3

他にどんな情報が知りたいですか?

自由記述(任意)

5 スコープ外(やらないこと)

  • 既存記事のPortable Text → HTMLへのデータ移行

    既存記事はそのまま。新規記事からHTMLフィールドを使う

  • Rich Text Editor(Portable Text)の削除

    従来の入稿方法も残す。併用できる状態にする

  • HTML入力のバリデーション・サニタイズ

    入稿者は社内メンバーのみ。セキュリティリスクは低い

  • Googleフォームの回答集計・ダッシュボード

    集計はGoogleスプレッドシート側で行う

  • 独自アンケートフォームの開発

    Googleフォームの iframe 埋め込みで十分。自前開発は不要

6 スケジュール感

1

Sanity HTML入稿(案A)

スキーマ追加 + フロント修正

1〜2時間
2

Googleフォーム設置(案A)

テンプレートにiframe追加 + スタイル調整

30分
3

動作確認・デプロイ

テスト記事でHTML入稿を確認 + フォーム表示確認

30分

合計見積り

2〜4時間

案Aベース。案Bにする場合は +1〜2時間

7 確認事項

実装前に確認させてください。

Sanity関連

  1. 1. ブログ記事のスキーマファイルはどこにありますか?(例: schemas/blog.ts
  2. 2. @sanity/code-input プラグインは案Aで問題ないですか?
  3. 3. フロントエンドの記事表示コンポーネントのファイルパスは?
  4. 4. 記事取得のGROQクエリはどのファイルにありますか?

Googleフォーム関連

  1. 5. フォームは全記事一律表示(案A)でいいですか?それとも記事別に制御したいですか?
  2. 6. 専用ページ(/survey)も初期段階で作りますか?

Pink Research Institute / Development Request / 2026-03-12