Article

30分で構築!社内FAQをGoogleサイトで作る

高田晃太郎
30分で構築!社内FAQをGoogleサイトで作る

従業員は業務時間の約20%を情報探索に費やしているというMcKinseyの報告はよく引用されます。また、同趣旨の調査では従業員が必要な情報を探すのに全業務時間の25%以上を割いているとの指摘もあります¹。社内ヘルプデスクの現場でも、似た質問がSlackやメールで繰り返される構図は珍しくありません。1,000人規模で月2,000件の社内問い合わせがある組織を仮定すると、自己解決率が20%改善した場合、毎月400件の起票を回避できる「可能性」があります。1件あたり5分の対応時間短縮と置けば、33時間分の作業に相当します。これはあくまで試算ですが、こうした具体的数値でROIを見積もると、社内FAQの整備は費用対効果が高い取り組みに映ります。本稿では、Googleサイトを使って30分でMVPを立ち上げる方法を軸に、情報設計、権限、Apps Script連携、GA4計測まで一気通貫で解説します。

なぜGoogleサイトで社内FAQなのか:速度、権限、コストの三拍子

社内FAQの成否はスピードとメンテナンス性に大きく左右されます。GoogleサイトはGoogle Workspaceに標準搭載され、ドメイン認証とグループ権限をそのまま引き継げます。新しいインフラの調達も不要で、編集者はDocsやSlidesと同じ操作感で更新できます。公開先を社内ドメインに限定すれば、SSO前提の安全な配布が即日で可能です。モバイル対応が標準で、Googleフォームやスプレッドシート、カレンダーの埋め込みも数クリックで完了します。追加費用は原則発生せず、運用も既存のWorkspace契約内で収まるため、導入障壁が低いのが強みです²³。

一方で制約も正しく理解しておく必要があります。2025年時点の新しいGoogleサイトでは、カスタムCSSや任意のJavaScript挿入は制限があり、ワイヤーフレームの自由度は一般的なCMSに比べて狭い設計です。承認ワークフローや高度なバージョニングは原則持たないため、レビュー運用はドライブの承認やコメント機能で補います。ページ単位の細かな閲覧制御は限定的で、権限の切り分けはサイト単位で考えると運用が安定します。高度検索やAPI公開が必要であれば、後述のApps ScriptやGoogle プログラマブル検索エンジンの埋め込みを組み合わせるのが現実解です。制約と拡張策をセットで設計すれば、スピードと保守性のバランスが取れます。

MVP志向の合理性:まずは30分で使えるものを

完璧な情報構造を目指して立ち止まるより、最小構成で試し、問い合わせの実データから改善するほうが高い成果を生みます。初期はトップページ、カテゴリ別FAQ、検索、質問送信フォームの四点に絞り、週次で差分を積み上げます。MVPの時点では、カテゴリは5〜7つ、各カテゴリに上位10問、計50〜70件を目標に揃えると、アクセスの8割をカバーしやすくなります。ナレッジを一元管理するだけでも、散逸や重複によるムダを減らしやすくなります⁵。

30分で社内FAQを立ち上げる設計図

最初にドライブ上に専用フォルダを用意し、FAQの原稿はGoogleドキュメントで作成、一覧とメタデータはスプレッドシートで管理します。フォルダに対して閲覧は全社、編集はFAQ運営チームのグループに限定し、編集権限は人ではなくGoogleグループ単位で付与しておくと人事異動に強い権限設計になります。Googleサイトを新規作成し、トップページに検索ボックスと主要カテゴリへのカードリンクを配置します。サイト内検索はGoogleサイト標準の検索を有効化するか、拡張が必要なら後述のApps Scriptベース検索を埋め込みます。質問送信はGoogleフォームを用意し、回答先をスプレッドシートに接続、フォーム側でカテゴリと概要、詳細欄を必須にして重複検知の材料を確保します。フォーム送信後のサンクスページにFAQトップへの導線を返すと自己解決の回遊が生まれます。公開はドメイン内限定に設定し、URLは短く覚えやすいものを選びます。SlackやGoogle Chatのチャンネルに固定メッセージでリンクを掲示し、メール署名やオンボーディング資料にもリンクを入れて初動のトラフィックを確保します³。

情報設計のコア:ナレッジ粒度とメタデータ

1ページ1質問に統一し、タイトルは「何をしたいか/どうすればいいか」で始めます。たとえば「2段階認証を再設定する方法」のように、検索クエリに直結する文言に寄せるのが有効です。先頭に要約、手順、補足、トラブルシューティング、更新履歴の順に並べ、最上部に最短経路を置いて滞在時間を短くします。スプレッドシート側ではカテゴリ、サブカテゴリ、SLA対象可否、更新日、オーナー、関連キーワード、既知の代替案などの列を持ち、後述の検索やレポーティングで活用します。重複質問は正規記事にリダイレクトする方針を決め、複数の言い回しを関連キーワードに登録しておくと、検索の取りこぼしが減ります。

権限と公開範囲:安全と利便の両立

全社向けFAQと管理部門限定FAQを分けたい場合は、同一サイト内のページごと権限ではなく、サイトを分けるほうが運用は安定します。アクセスログはGoogleサイト設定でGA4の測定IDを設定し、閲覧・検索の行動を後述のイベント計測で可視化します。人事や法務のセンシティブな手順は、ドライブの閲覧権限でさらに制御し、サイトからは概要だけ提示して詳細はアクセス権のあるドキュメントに遷移させる設計が安全です。

Apps Scriptと埋め込みで拡張する:検索、更新、計測

Googleサイト単体でも最低限は機能しますが、Apps Scriptを併用すると検索精度や更新効率、計測の粒度を一段上げられます。ここでは具体的数値を意識した実装例を示します。FAQが数百件規模でも軽快な応答を目指せるよう、キャッシュとインデックスを併用します。Apps ScriptのWebアプリとContentServiceを用いれば、シートのデータをJSONで配信するAPIを簡潔に実装できます⁴。なお、応答時間や同時実行は端末やネットワーク、スクリプトの割り当て(クォータ)に依存するため、キャッシュ活用やレスポンスの絞り込みで安定動作を図ります。

スプレッドシートをJSON API化し、高速検索する

スプレッドシートの構成は、ID、Category、Question、Answer、Keywords、UpdatedAt、Viewsを推奨します。次のApps Scriptは公開WebアプリとしてGET検索を提供し、CacheServiceで数分間のキャッシュを使って応答を安定化します⁴。

// Code 1: doGetでFAQ検索API(Apps Script)
const SHEET_NAME = 'FAQ';
const CACHE_TTL = 300; // seconds

function doGet(e) {
  const q = (e && e.parameter && (e.parameter.q || '')).toLowerCase().trim();
  const cat = e && e.parameter && e.parameter.category;
  const cache = CacheService.getScriptCache();
  const key = 'faq:' + Utilities.base64EncodeWebSafe(JSON.stringify({ q, cat }));
  const hit = cache.get(key);
  if (hit) return ContentService.createTextOutput(hit).setMimeType(ContentService.MimeType.JSON);

  const sheet = SpreadsheetApp.getActive().getSheetByName(SHEET_NAME);
  const values = sheet.getDataRange().getValues();
  const header = values.shift();
  const idx = Object.fromEntries(header.map((h, i) => [h, i]));

  const rows = values.map(r => ({
    id: String(r[idx.ID]),
    category: r[idx.Category],
    question: r[idx.Question],
    answer: r[idx.Answer],
    keywords: String(r[idx.Keywords] || ''),
    updatedAt: r[idx.UpdatedAt],
    views: Number(r[idx.Views] || 0)
  }));

  const needle = q || '';
  const result = rows.filter(item => {
    const hay = [item.category, item.question, item.answer, item.keywords].join(' ').toLowerCase();
    const catOk = cat ? String(item.category) === String(cat) : true;
    return catOk && (needle === '' || hay.indexOf(needle) >= 0);
  }).slice(0, 50);

  const json = JSON.stringify({ count: result.length, items: result });
  cache.put(key, json, CACHE_TTL);
  return ContentService.createTextOutput(json).setMimeType(ContentService.MimeType.JSON);
}

公開はウェブアプリとしてデプロイし、アクセスを「全員(社内)」に限定します。結果はJSONなので、Googleサイトの埋め込みでUIを別途作ります。数百件のデータでもキャッシュが効けば体感は速く、カテゴリ条件付きの検索でも軽快に動作させられます。

検索UIをWebアプリとして埋め込む

Apps ScriptのHTML Serviceで検索UIを返し、GoogleサイトにURL埋め込みします。次の例はキーワード入力でAPIを叩き、結果をカード表示し、クリックで詳細ページに遷移します。

<!-- Code 2: 検索UI(HTML Serviceで返す) -->
<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <style>
    body{font-family:system-ui, sans-serif;margin:16px}
    .q{width:100%;padding:10px;font-size:16px}
    .card{border:1px solid #e5e7eb;border-radius:8px;padding:12px;margin-top:10px}
    .muted{color:#6b7280;font-size:12px}
  </style>
</head>
<body>
  <input class="q" id="q" placeholder="キーワードで検索" />
  <div id="res"></div>
  <script>
    const API = 'YOUR_SCRIPT_URL/exec';
    const res = document.getElementById('res');
    const q = document.getElementById('q');
    let t;
    q.addEventListener('input', () => { clearTimeout(t); t = setTimeout(run, 200); });
    async function run(){
      const url = API + '?q=' + encodeURIComponent(q.value.trim());
      const r = await fetch(url, { credentials: 'include' });
      const data = await r.json();
      res.innerHTML = data.items.map(it => `
        <div class="card">
          <div><strong>${it.question}</strong></div>
          <div class="muted">${it.category}・更新: ${new Date(it.updatedAt).toLocaleDateString()}</div>
          <div style="margin-top:8px">${(it.answer||'').slice(0,120)}...</div>
          <div style="margin-top:8px"><a href="/faq/${it.id}" target="_top" data-id="${it.id}">詳細を見る</a></div>
        </div>`).join('');
    }
    run();
  </script>
</body>
</html>

Googleサイトは相対パスの遷移に弱いケースがあるため、詳細はGoogleサイト内の対応ページURLに合わせてリンクを調整します。カードの抜粋は冒頭120〜160文字に制限すると視認性が上がります。

閲覧カウントや検索語の計測

GA4の測定IDをサイト設定に入れた上で、イベントとして検索クエリやFAQ閲覧を送信します。Googleサイト側でスクリプトを直接置けない場合は、前述の検索UI内から計測を送ります。

<!-- Code 3: 検索語のGA4イベント送信 -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXX"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);} gtag('js', new Date());
  gtag('config', 'G-XXXXXXX');
  function trackSearch(q, count){
    gtag('event', 'faq_search', { search_term: q, results: count });
  }
  // 検索実行箇所で呼ぶ
  // trackSearch(q.value, data.count);
</script>

FAQページの閲覧増加と検索語のカバレッジ率を追うと、どのカテゴリに投資すべきかが見えてきます。未解決検索語の上位20件を週次で拾い、翌週に対応記事を追加していけば、自己解決の動線は1〜2ヶ月で改善が見込みやすくなります。

ビュー数をシートに書き戻す

簡易的な人気記事指標として、詳細リンクのクリック時にApps ScriptへPOSTし、シートのViewsを加算します。負荷を避けるためにバッチ更新とミュータブルキャッシュを併用します(同時更新が増える場合はLockServiceの導入も検討します)。

// Code 4: doPostでビュー加算(Apps Script)
function doPost(e){
  const body = JSON.parse(e.postData.contents || '{}');
  const id = String(body.id || '');
  if (!id) return ContentService.createTextOutput('{}');
  const sheet = SpreadsheetApp.getActive().getSheetByName('FAQ');
  const values = sheet.getDataRange().getValues();
  const header = values.shift();
  const idx = Object.fromEntries(header.map((h,i)=>[h,i]));
  for (let r = 0; r < values.length; r++){
    if (String(values[r][idx.ID]) === id){
      const current = Number(values[r][idx.Views] || 0) + 1;
      sheet.getRange(r+2, idx.Views+1).setValue(current);
      break;
    }
  }
  return ContentService.createTextOutput('{"ok":true}');
}

UI側ではリンククリックでfetchを送るだけです。Googleサイトから埋め込んだUIであれば、認証は社内SSOで満たされるため追加のトークンは不要です。

// Code 5: クリック時にビュー加算
function sendView(id){
  fetch('YOUR_SCRIPT_URL/exec', { method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify({ id })});
}
// <a ... onclick="sendView('123')">詳細</a>

運用とROI:数字で語れるナレッジ運用へ

ナレッジ運用を仕組みに落とすには、KPIを数個に絞り、週次で小さく回すのが鍵です。自己解決率、問い合わせ件数、平均ハンドリング時間、FAQの更新滞留日数、検索クエリの未解決率の五つを揃えると、改善余地が具体的に見えてきます。ナレッジの散逸や再作成コストは組織にとって無視できない負担となりうることが示されています⁷。中央集約されたナレッジ基盤は、探す・再作成するムダを減らす起点になります⁵⁶。GA4ではイベントベースで検索語やクリックを取り、Googleフォームの回答とスプレッドシートをLooker Studioで可視化すれば、初期の可観測性は数時間で整います。BigQuery連携を有効にすれば、月間数十万イベント規模でもコストは抑えやすく、長期トレンドの分析が容易になります。

ROIは前提を明示して試算します。たとえば月2,000件の問い合わせ、FAQ導入での自己解決率改善を20%と置き、1件あたり対応5分、平均人件費を時給3,000円と仮定すると、毎月約33時間・10万円相当の削減という概算です。初期構築は30分、整備は週1時間といった軽量運用であれば、年間の投下時間は50時間未満に収まりやすく、早期にコスト効果が期待できます。導入後90日で未解決検索語の上位を潰していけば改善幅が伸びるケースもありますが、これは組織の規模・問い合わせ特性・運用の成熟度に依存します。伸び悩む時は、タイトルがユーザーの言い回しとズレている、カテゴリが深すぎて辿り着けない、権限やリンク切れで離脱している、といった構造的な課題が多く、計測のダッシュボードを見るだけで原因仮説は立ちます。

ガバナンスの観点では、記事のオーナーを明確にし、更新期限を列で持ち、期限超過は赤色で可視化します。レビューは軽量でも良いので、週次で3件だけでも差し替えるリズムを守ると、陳腐化は抑えられます。人事や法務のように変更頻度が高い領域は、FAQ本文を短くし、詳細は最新版のドキュメントへリンクする構造にし、更新差分が出てもリンク先の差し替えで耐える設計にしておくと、運用負荷が跳ね上がりません⁶。

よくあるつまずきと回避策

検索の当たりが弱い場合は、見出しと本文の冒頭100文字に代表的な言い回しを含めると改善します。Googleサイトの標準検索は全文検索の挙動に限界があるため、Apps ScriptのAPI検索でKeywords列を積極的に活かします。ページ数が増えすぎて迷子になる時は、トップに「今週よく読まれた10記事」と「はじめての方向け」の二つを常設し、行動のファーストステップを明確にします。運営チーム内で責任の所在が曖昧だと更新が止まるので、カテゴリごとにオーナーを任命し、更新依頼はフォーム経由に一本化し、Slackの通知はZapierやApps Scriptのトリガーで自動化します。これだけでも手戻りが目に見えて減ります。

拡張の方向性:段階的に高度化する

初期はGoogleサイトで十分ですが、FAQが1,000件を超えて階層化が複雑になれば、Cloud Searchの導入や外部CMS連携を検討するタイミングです。とはいえ、導入のハードルは高くなります。実務的には、GoogleサイトのままでもApps Scriptにシノニム辞書や部分一致のスコアリングを加え、ランキングをクリック率と併用してチューニングするだけで、ユーザー体験は大幅に改善します。ナレッジマネジメントはプラットフォームよりも運用の習熟が効きます。小さく始めて、数字を見ながら強化していくのが、最短で成果にたどり着くやり方です。

まとめ:30分のMVPが、来月の生産性を変える

社内FAQは、理想像を描くよりも、まずは使えるものを早く出すことが価値につながります。Googleサイトなら、ドメイン権限と既存ツールの親和性を武器に、30分でMVPを立ち上げられます。検索、更新、計測をApps ScriptとGA4で補強すれば、数百件規模でも高速に回り、問い合わせの一定割合を自己解決へ誘導できる可能性があります。来週の定例までに、トップ、カテゴリ、検索、フォームの四点だけを形にして、翌週は未解決検索語の上位から三つ、記事を足してみてください。数字が少しでも動いたら、その変化が次の改善の羅針盤になります。チームの時間を取り戻すために、今日30分だけ、始めてみませんか。

参考文献

  1. Economic Times. Employees spend more than 25% of their time searching for the information they need to do their jobs: Citrix. https://economictimes.indiatimes.com/jobs/employees-spend-more-than-25-of-their-time-searching-for-the-information-they-need-to-do-their-jobs-citrix/articleshow/69839496.cms
  2. Google Workspace. Sites — Deep integration with Google Workspace. https://workspace.google.com/intl/en_my/products/sites/
  3. Google Workspace. Sites — Build secure and reliable sites without IT support. https://workspace.google.com/intl/en_my/products/sites/
  4. Google for Developers. Content Service | Apps Script. https://developers.google.com/apps-script/reference/content/content-service
  5. Atlassian. Knowledge management — the process and benefits (Confluence guide). https://www.atlassian.com/software/confluence/guides/knowledge-management
  6. Atlassian. How to use Confluence to foster knowledge sharing. https://www.atlassian.com/software/confluence/guides/knowledge-management
  7. Harvard Business Review. The Cost of Knowledge (2006). https://hbr.org/2006/11/the-cost-of-knowledge