Contact Form 7の問い合わせをGoogleスプレッドシートに自動保存する方法|初心者向け完全ガイド


WordPressでホームページを作るとき、「お問い合わせフォーム」はほぼ必ず設置します。
ですが、こんな悩みはありませんか?
- メールだけだと後から探すのが大変
- 対応状況を管理できない
- チームで共有しづらい
- 問い合わせ履歴を分析できない
- 「あの問い合わせ、返信したっけ?」と不安になる
私自身、医療機関SEとして14年間、さまざまなシステムの問い合わせ対応を見てきました。メールだけで管理しているチームは、必ずと言っていいほど「返信漏れ」や「二重対応」が発生していました。
そこでおすすめなのが、Contact Form 7の送信内容をGoogleスプレッドシートに自動で保存する仕組みです。
この記事を読めば、以下のことができるようになります:
- フォーム送信と同時にスプレッドシートへ自動記録
- 対応状況の管理(未対応・対応中・完了)
- チームでのリアルタイム共有
- 問い合わせ傾向の分析
プログラミングが苦手な方でも、コピペ中心で実装できます。 高校生でも理解できるレベルを目標に、仕組みから実装まで丁寧に解説します。
この仕組みで実現できること
実装前に、この仕組みを導入すると何が変わるのかを具体的に見てみましょう。
Before:メール管理の問題点
| 項目 | 状況 |
|---|---|
| 保存場所 | 担当者の個人メールボックス |
| 検索性 | 探すのに時間がかかる |
| 共有 | 転送しないと他の人が見れない |
| 対応管理 | 誰が対応したか分からない |
| 分析 | ほぼ不可能 |
After:スプレッドシート管理のメリット
| 項目 | 状況 |
|---|---|
| 保存場所 | 全員がアクセスできるスプレッドシート |
| 検索性 | フィルタ・検索で一瞬 |
| 共有 | リアルタイムで全員が閲覧可能 |
| 対応管理 | 「対応ステータス」列で一目瞭然 |
| 分析 | グラフ化・集計が簡単 |
私がクライアントにこの仕組みを提案したとき、「これでやっと問い合わせ管理がまともになる」と言われました。特に複数人で対応するチームには効果絶大です。
全体の仕組みをざっくり理解しよう
まずは難しいことを考えず、流れだけ見てください。
やっていることはとてもシンプルです。「フォームに書かれた内容を、別の場所(スプレッドシート)にコピーする」だけです。
今回使うもの
| 名前 | 役割 | 費用 |
|---|---|---|
| Contact Form 7 | お問い合わせフォーム | 無料 |
| Googleスプレッドシート | 問い合わせの保存先 | 無料 |
| Google Apps Script(GAS) | データを受け取ってシートに書く係 | 無料 |
| 少しだけPHP(WordPress側) | フォーム送信時にGASへ送る役目 | 無料 |
👉 全部無料で使えます。
事前準備:必要なもの
実装を始める前に、以下が揃っていることを確認してください。
必須
- WordPressサイト(管理者権限でログイン可能)
- Contact Form 7がインストール・有効化済み
- Googleアカウント(Gmail)
あると便利
- 子テーマ(functions.phpを編集するため)
- FTPクライアント or ファイルマネージャーへのアクセス
👉 子テーマがない場合:テーマ更新時にコードが消えるリスクがあります。可能であれば子テーマを用意してください。
ステップ①:スプレッドシートを用意する
まずは、問い合わせを保存する「箱」を作ります。
1-1. 新規スプレッドシートを作成
- Googleドライブにアクセス
- 「新規」→「Googleスプレッドシート」をクリック
- ファイル名を「お問い合わせ管理」などに変更
1-2. 1行目に列名を入力
シートの1行目に、以下のような列名を入力します。
お問い合わせフォーム用の例:
| A列 | B列 | C列 | D列 | E列 | F列 | G列 |
|---|---|---|---|---|---|---|
| 受信日時 | お名前 | メール | 電話 | 会社名 | 種別 | 内容 |
無料相談フォーム用の例:
| A列 | B列 | C列 | D列 | E列 |
|---|---|---|---|---|
| 受信日時 | お名前 | メール | 会社名 | 相談内容 |
👉 列名は日本語でOKです。 あとから見て分かることが大切です。
1-3. スプレッドシートIDをメモする
ブラウザのURLを見てください。以下のような形式になっています。
https://docs.google.com/spreadsheets/d/【ここがスプレッドシートID】/editこのスプレッドシートID(英数字の長い文字列)を、後で使うのでメモしておいてください。
ステップ②:Google Apps Script(GAS)を作成する
次に、データを受け取ってシートに書き込む係を作ります。
2-1. Apps Scriptエディタを開く
- スプレッドシートを開いた状態で
- 上のメニュー「拡張機能」→「Apps Script」をクリック
2-2. コードを貼り付ける
表示されたエディタに、以下のコードを全て貼り付けてください。
/**
* Contact Form 7からのデータを受け取り、スプレッドシートに記録する
*
* 【設定手順】
* 1. SPREADSHEET_ID に自分のスプレッドシートIDを入力
* 2. SHEET_NAME にシート名を入力(デフォルトは「シート1」)
*/
// ===== 設定項目(ここを自分の環境に合わせて変更) =====
const SPREADSHEET_ID = 'ここにスプレッドシートIDを貼り付け';
const SHEET_NAME = 'シート1'; // シート名(タブの名前)
// =====================================================
/**
* POSTリクエストを受け取る関数
* WordPressからデータが送られてくると、この関数が実行される
*/
function doPost(e) {
try {
// 送られてきたデータを取得
const params = e.parameter;
// スプレッドシートを開く
const spreadsheet = SpreadsheetApp.openById(SPREADSHEET_ID);
const sheet = spreadsheet.getSheetByName(SHEET_NAME);
// シートが見つからない場合はエラー
if (!sheet) {
return createResponse('error', 'シートが見つかりません: ' + SHEET_NAME);
}
// 1行目(ヘッダー)を取得
const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
// 新しい行に書き込むデータを準備
const newRow = [];
for (let i = 0; i < headers.length; i++) {
const header = headers[i];
if (header === '受信日時') {
// 受信日時は現在時刻を自動で入力
newRow.push(new Date());
} else {
// それ以外は送られてきたデータから取得
// ヘッダー名をキーとしてデータを探す
newRow.push(params[header] || '');
}
}
// 最終行の次に新しいデータを追加
sheet.appendRow(newRow);
// 成功レスポンスを返す
return createResponse('success', 'データを保存しました');
} catch (error) {
// エラーが発生した場合
return createResponse('error', error.toString());
}
}
/**
* レスポンスを作成する関数
*/
function createResponse(status, message) {
return ContentService
.createTextOutput(JSON.stringify({
status: status,
message: message
}))
.setMimeType(ContentService.MimeType.JSON);
}
/**
* GETリクエスト用(動作確認用)
*/
function doGet(e) {
return createResponse('success', 'GASは正常に動作しています');
}
2-3. スプレッドシートIDを設定する
コードの上部にある以下の行を見つけてください。
const SPREADSHEET_ID = 'ここにスプレッドシートIDを貼り付け';ステップ①でメモしたスプレッドシートIDをここに貼り付けます。
const SPREADSHEET_ID = '1abc2defg3hijklmn4opqrst5uvwxyz'; // 例👉 シングルクォート(’)で囲むのを忘れずに!
2-4. 保存する
- 上部の「💾」アイコン、または
Ctrl + S(Mac:Cmd + S)で保存 - プロジェクト名を入力(例:「お問い合わせ連携」)
ステップ③:GASをWebアプリとして公開する
GASはそのままだと外部から使えません。Webアプリとして公開することで、WordPressからアクセスできるようになります。
3-1. デプロイ画面を開く
- 右上の「デプロイ」ボタンをクリック
- 「新しいデプロイ」を選択
3-2. 種類を選択
- 「種類の選択」の歯車アイコンをクリック
- 「ウェブアプリ」を選択
3-3. 設定を行う(👉 ここが超重要)
以下の設定を必ず行ってください。
| 項目 | 設定値 |
|---|---|
| 説明 | (任意)「お問い合わせ連携」など |
| 次のユーザーとして実行 | 自分 |
| アクセスできるユーザー | 全員 |
⚠️ 「アクセスできるユーザー」を「全員」にしないと、WordPressからアクセスできません。
3-4. 認証を許可する
初回デプロイ時は、Googleアカウントへのアクセス許可を求められます。
- 「アクセスを承認」をクリック
- 自分のGoogleアカウントを選択
- 「詳細」→「〇〇(安全ではないページ)に移動」をクリック
- 「許可」をクリック
👉 「安全ではない」という警告が出ますが、これは自分で作ったスクリプトなので問題ありません。
3-5. WebアプリのURLをメモする
デプロイが完了すると、以下のようなURLが表示されます。
https://script.google.com/macros/s/【長い文字列】/execこのWebアプリURLを、後で使うのでメモしておいてください。
ステップ④:WordPress側で送信処理を書く
いよいよ最後のステップです。WordPressがフォーム送信時にGASへデータを送るようにします。
4-1. Contact Form 7のフォームIDを確認する
WordPress管理画面で「お問い合わせ」→「コンタクトフォーム」を開きます。
使用するフォームをクリックして、URLを確認してください。
https://あなたのサイト/wp-admin/admin.php?page=wpcf7&post=1602&action=edit
↑
ここの数字がフォームID
この例では 1602 がフォームIDです。
⚠️ ここでよくある間違い:ショートコードのIDは使えません
エラー: コンタクトフォームが見つかりません。
↑
これは見た目用IDなので、PHPでは使えません!
4-2. functions.phpにコードを追加する
子テーマの functions.php に、以下のコードを追加します。
<?php
/**
* Contact Form 7 → Googleスプレッドシート連携
*
* 【設定手順】
* 1. $gas_url に自分のGAS WebアプリURLを入力
* 2. $form_id に自分のフォームIDを入力
* 3. $fields 配列を自分のフォームに合わせて編集
*/
// フォーム送信後に実行されるフック
add_action('wpcf7_mail_sent', 'send_cf7_to_spreadsheet');
function send_cf7_to_spreadsheet($contact_form) {
// ===== 設定項目(ここを自分の環境に合わせて変更) =====
// GASのWebアプリURL
$gas_url = 'https://script.google.com/macros/s/あなたのGAS_URL/exec';
// 連携するフォームのID(複数フォームがある場合は配列で指定)
$form_id = 1602; // ここを自分のフォームIDに変更
// =========================================================
// このフォームが対象かチェック
if ($contact_form->id() != $form_id) {
return;
}
// フォームの送信データを取得
$submission = WPCF7_Submission::get_instance();
if (!$submission) {
return;
}
$posted_data = $submission->get_posted_data();
// スプレッドシートに送るデータを準備
// キー名はスプレッドシートの1行目(ヘッダー)と一致させる
$data = array(
'お名前' => isset($posted_data['your-name']) ? $posted_data['your-name'] : '',
'メール' => isset($posted_data['your-email']) ? $posted_data['your-email'] : '',
'電話' => isset($posted_data['your-tel']) ? $posted_data['your-tel'] : '',
'会社名' => isset($posted_data['your-company']) ? $posted_data['your-company'] : '',
'種別' => isset($posted_data['your-subject']) ? $posted_data['your-subject'] : '',
'内容' => isset($posted_data['your-message']) ? $posted_data['your-message'] : '',
);
// GASにデータを送信
$response = wp_remote_post($gas_url, array(
'method' => 'POST',
'timeout' => 30,
'body' => $data,
));
// エラーログ(デバッグ用・本番では削除可)
if (is_wp_error($response)) {
error_log('GAS送信エラー: ' . $response->get_error_message());
}
}
4-3. 自分のフォームに合わせて編集する
上記コードで変更が必要な箇所:
1. GASのWebアプリURL
$gas_url = 'https://script.google.com/macros/s/あなたのGAS_URL/exec';ステップ③でメモしたURLに置き換えてください。
2. フォームID
$form_id = 1602; // ここを自分のフォームIDに変更ステップ④-1で確認したIDに置き換えてください。
3. フィールドの対応付け
$data = array(
'お名前' => isset($posted_data['your-name']) ? $posted_data['your-name'] : '',
// ...
);左側('お名前')はスプレッドシートの列名、右側('your-name')はContact Form 7のフィールド名です。
Contact Form 7のフォーム編集画面で、各フィールドの名前を確認してください。
[text* your-name] ← この「your-name」がフィールド名動作確認とトラブルシューティング
動作確認の手順
- フォームのあるページを開く
- テスト送信する(「テスト」など分かりやすい内容で)
- スプレッドシートを確認する
- 新しい行にデータが追加されていれば成功!
よくあるエラーと対処法
❌ スプレッドシートに何も追加されない
- GASのスプレッドシートIDは正しいか
- GASのシート名は正しいか(「シート1」など)
- GASのデプロイ設定で「アクセス:全員」になっているか
- PHPのGAS URLは正しいか
- PHPのフォームIDは正しいか
❌ 一部の列だけ空になる
- スプレッドシートの列名とPHPの
$data配列のキー名が一致しているか - Contact Form 7のフィールド名が正しいか
❌ WordPressがエラーになる
- PHPの構文エラーがないか
-
<?phpタグの重複がないか
👉 エラーログを確認する方法:wp-content/debug.log にエラーが記録されます。
なぜこの方法を選んだのか(技術選定の理由)
「Contact Form 7とスプレッドシートを連携する方法」は他にもあります。なぜ私がこの方法を選んだのか、技術選定の判断軸を共有します。
他の選択肢との比較
| 方法 | メリット | デメリット |
|---|---|---|
| 今回の方法(GAS + PHP) | 安定・拡張しやすい | 設定にやや手間がかかる |
| プラグイン「CF7 to Spreadsheet」 | 簡単に設定できる | プラグイン依存・更新停止リスク |
| Googleフォーム埋め込み | 設定が最も簡単 | デザインの自由度が低い |
| Zapier連携 | ノーコードで連携 | 月額費用がかかる |
拡張性
私がこの方法を選んだ最大の理由は拡張性です。
GASを中継することで、将来的に以下のような機能を追加できます:
- Slack通知(問い合わせが来たらチームに通知)
- 対応ステータス管理(未対応・対応中・完了)
- 自動返信ログ(いつ返信したかを記録)
- データ分析(問い合わせ傾向のグラフ化)
プラグインに依存すると、こうした拡張が難しくなります。
保守性
医療機関SEとして14年間、「システムが止まったら業務が止まる」環境を支えてきました。その経験から、運用しやすさを最優先しています。
今回の方法は:
- GASもPHPも一般的な技術なので、私がいなくなっても保守可能
- プラグインの更新停止リスクがない
- Googleのインフラを使うので安定している
コスト
すべて無料で使えます。
- Contact Form 7:無料
- Googleスプレッドシート:無料
- Google Apps Script:無料
- WordPress:無料(ホスティング費用は別途)
Zapierなどの連携サービスは月額費用がかかりますが、この方法ならランニングコストゼロで運用できます。
よくある質問
- プログラミング初心者でもできますか?
-
できます。
この記事のコードは、コピペで構築できます。変更が必要な箇所(URL、ID、フィールド名)を自分の環境に合わせるだけです。
- 無料ですか?
-
はい、無料です。
WordPress、Contact Form 7、Googleスプレッドシート、GASすべて無料で使えます。
- データは安全ですか?
-
Googleアカウント内に保存されるので、Excel添付メールより安全です。
アクセス権限はスプレッドシートの共有設定で細かく管理できます。
- 複数のフォームに対応できますか?
-
できます。
PHPコードの
$form_idを配列にするか、フォームごとにif文を追加してください。GAS側は1つでOKです。 - フォームの項目を増やしたらどうすればいい?
-
スプレッドシートに列を追加し、PHPの
$data配列に項目を追加してください。GAS側は自動で対応します(ヘッダー名をキーにしているため)。
まとめ
この記事では、Contact Form 7の問い合わせをGoogleスプレッドシートに自動保存する方法を解説しました。
この記事のポイント
- 全体の流れ:フォーム送信 → WordPress → GAS → スプレッドシート
- GASの役割:データを受け取ってシートに書き込む
- PHPの役割:フォーム送信時にGASへデータを送る
- フォームIDの注意:ショートコードのIDではなく、管理画面URLの数字を使う
- 拡張性:Slack通知や対応ステータス管理も後から追加可能
この仕組みを導入すると
- 問い合わせ管理が楽になる
- チーム共有がしやすくなる
- 業務効率が大きく上がる
「フォームは作ったけど、その後が大変」という方に、特におすすめの仕組みです。
まずはテスト環境で試してみてください。 一度動いてしまえば、あとは自動で記録されていきます。
この技術を使った業務改善・システム開発のご相談
「自社でも導入できるか相談したい」
「もっと詳しく話を聞きたい」
「Slack通知や対応ステータス管理も追加したい」
という方は、お気軽にご相談ください。
私は医療機関SEとして14年間、現場のシステム改善に携わってきました。「作って終わり」ではなく、運用まで見据えた仕組みづくりをお手伝いします。
※ 無理な売り込みは一切しません。まずはお話を聞かせてください。

