WordPressでサイトを運営していると、Contact Form 7でお問い合わせフォームを設置することが多いと思います。
しかし、こんな悩みはありませんか?
- メールだけだと後から探すのが大変
- 対応状況を管理できない
- チームで共有しづらい
- 問い合わせ履歴を分析できない
この記事では、Contact Form 7の送信内容をGoogleスプレッドシートに自動で保存する仕組みを解説します。
この記事で解決できること
- 問い合わせ内容がスプレッドシートに自動で蓄積される
- 対応状況をチームで共有・管理できる
- 問い合わせデータの分析が可能になる
想定読者
- WordPressでサイトを運営している方
- Contact Form 7を使っている方
- プログラミングは苦手だがコピペならできる方
実案件での実績
この実装はクライアントのコーポレートサイト案件で実際に構築したものです。導入後、問い合わせ管理の工数が月5時間→30分に削減できました。
全体の仕組みをざっくり理解しよう
まずは難しいことを考えず、流れだけ把握しましょう。
やっていることはとてもシンプルです。
今回使うもの
| ツール | 役割 |
|---|---|
| Contact Form 7 | WordPressの無料フォームプラグイン |
| Googleスプレッドシート | 問い合わせの保存先(Excelのクラウド版) |
| Google Apps Script(GAS) | データを受け取ってシートに書き込む係 |
| PHP(functions.php) | フォーム送信時にGASへデータを送る役目 |
難しそうに見えますが、コードはすべてコピペでOKです。
ステップ1:スプレッドシートを用意する
まずは、問い合わせを保存する「箱」を作ります。
手順
- Googleスプレッドシートにアクセス
- 「空白のスプレッドシート」を新規作成
- シート名を「お問い合わせ」に変更
- 1行目に以下の列名を入力
シート例(お問い合わせ)
| A列 | B列 | C列 | D列 | E列 | F列 | G列 |
|---|---|---|---|---|---|---|
| 受信日時 | お名前 | メール | 電話 | 会社名 | 種別 | 内容 |
列名は日本語でOKです。あとから見て分かることが大切です

ステップ2:Google Apps Scriptを作成する
次に、データを受け取る係(GAS)を作ります。
手順
- スプレッドシートを開いた状態で、上のメニューから 「拡張機能 → Apps Script」 をクリック
- 表示されたエディタで、既存のコードをすべて削除
- 以下のコードを貼り付ける
GASコード
/**
* Contact Form 7からのデータを受け取り、スプレッドシートに保存する
* POSTリクエストを処理する関数
*/
function doPost(e) {
try {
// POSTされたJSONデータを解析
var data = JSON.parse(e.postData.contents);
// アクティブなスプレッドシートを取得
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('お問い合わせ');
// 現在の日時を取得(日本時間)
var timestamp = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy/MM/dd HH:mm:ss');
// シートに1行追加
// 列の順番:受信日時, お名前, メール, 電話, 会社名, 種別, 内容
sheet.appendRow([
timestamp, // A列:受信日時
data.name || '', // B列:お名前
data.email || '', // C列:メール
data.tel || '', // D列:電話
data.company || '', // E列:会社名
data.type || '', // F列:種別
data.message || '' // G列:内容
]);
// 成功レスポンスを返す
return ContentService.createTextOutput(
JSON.stringify({ result: 'success' })
).setMimeType(ContentService.MimeType.JSON);
} catch (error) {
// エラーレスポンスを返す
return ContentService.createTextOutput(
JSON.stringify({ result: 'error', message: error.toString() })
).setMimeType(ContentService.MimeType.JSON);
}
}
/**
* GETリクエストへの応答(動作確認用)
*/
function doGet(e) {
return ContentService.createTextOutput('GAS is working!');
}
- Ctrl + S(Macは Cmd + S)で保存
- プロジェクト名を「CF7連携」などに変更

GASの役割を超ざっくり言うと
「WordPressから送られてきたデータを、決められたシートに書き込む」
それだけです。
ステップ3:GASをWebアプリとして公開する
GASはそのままだと外部から使えません。「公開」の設定が必要です。
手順
- GASエディタ右上の 「デプロイ」→「新しいデプロイ」 をクリック
- 歯車アイコンをクリックし、「ウェブアプリ」 を選択
- 以下の設定を行う
設定ポイント(超重要)
| 項目 | 設定値 |
|---|---|
| 説明 | CF7連携(任意) |
| 実行するユーザー | 自分 |
| アクセスできるユーザー | 全員 |
- 「デプロイ」 ボタンをクリック
- 表示される ウェブアプリのURL をコピーして保存
⚠️ 重要: 「アクセスできるユーザー」を「全員」にしないと、WordPressからアクセスできません。実装時に「GASのデプロイ設定」でハマりました。ここを間違えると外部から呼び出せません。

ステップ4:WordPress側で送信処理を書く
次はWordPressです。Contact Form 7には、フォームが送信された瞬間に動く仕組み(フック)があります。
手順
- WordPress管理画面から 「外観」→「テーマファイルエディター」 を開く
- functions.php を選択
- ファイルの末尾に以下のコードを追加
PHPコード
<?php
/**
* Contact Form 7の送信内容をGoogleスプレッドシートに保存
*
* @param WPCF7_ContactForm $contact_form フォームオブジェクト
*/
function send_cf7_to_spreadsheet($contact_form) {
// フォームIDを確認(管理画面URLの post=XXXX の数字)
$form_id = $contact_form->id();
// 対象フォームのIDを指定(複数ある場合は配列で管理)
$target_forms = array(
1602, // お問い合わせフォームのID
// 1603, // 無料相談フォームのID(必要に応じて追加)
);
// 対象フォーム以外は処理しない
if (!in_array($form_id, $target_forms)) {
return;
}
// 送信されたデータを取得
$submission = WPCF7_Submission::get_instance();
if (!$submission) {
return;
}
$posted_data = $submission->get_posted_data();
// GASに送信するデータを整形
$data = array(
'name' => isset($posted_data['your-name']) ? $posted_data['your-name'] : '',
'email' => isset($posted_data['your-email']) ? $posted_data['your-email'] : '',
'tel' => isset($posted_data['your-tel']) ? $posted_data['your-tel'] : '',
'company' => isset($posted_data['your-company']) ? $posted_data['your-company'] : '',
'type' => isset($posted_data['your-type']) ? $posted_data['your-type'] : '',
'message' => isset($posted_data['your-message']) ? $posted_data['your-message'] : '',
);
// GASのウェブアプリURL(デプロイ時に取得したURL)
$gas_url = 'https://script.google.com/macros/s/XXXXXXXXXX/exec'; // ← ここを自分のURLに変更
// GASにPOSTリクエストを送信
$response = wp_remote_post($gas_url, array(
'method' => 'POST',
'headers' => array('Content-Type' => 'application/json'),
'body' => json_encode($data),
'timeout' => 30,
));
// エラーログ(デバッグ用、本番では削除可)
if (is_wp_error($response)) {
error_log('GAS送信エラー: ' . $response->get_error_message());
}
}
// Contact Form 7の送信完了後に実行
add_action('wpcf7_mail_sent', 'send_cf7_to_spreadsheet');
- 「ファイルを更新」 をクリックして保存
$gas_url の部分は、ステップ3で取得した自分のGAS URLに必ず変更してください。
ハマりやすいポイント
実装時に詰まりやすいポイントと解決策をまとめました。
1. フォームIDの種類を間違える
Contact Form 7には 2種類のID があります。
| ID | 見つけ方 | 使える場所 |
|---|---|---|
| 投稿ID(数字) | 管理画面URLの post=1602 | PHPで使用 ✅ |
| ハッシュID | | ショートコード用 ❌ |
⚠️ PHPではハッシュIDは使えません。 管理画面URLに表示される数字のIDを使ってください。多くの人がここでつまずきます。

2. GASのデプロイ設定ミス
| よくあるミス | 正しい設定 |
|---|---|
| アクセス権が「自分のみ」 | 「全員」に変更 |
| 新しいデプロイを作っていない | コード変更後は必ず「新しいデプロイ」 |
3. フォームのname属性が違う
PHPコード内の $posted_data['your-name'] は、Contact Form 7で設定した name属性 と一致している必要があります。
フォームタグを確認してください:
[text* your-name] ← name属性は「your-name」
[email* your-email] ← name属性は「your-email」4. スプレッドシートに書き込まれない場合のチェックリスト
- GASのデプロイ設定は「全員」になっているか
- GASのURLは正しくコピーされているか
- PHPのフォームIDは正しい数字になっているか
- フォームのname属性とPHPのキーは一致しているか
- スプレッドシートのシート名は「お問い合わせ」になっているか
なぜこの方法がおすすめなのか
1. とにかく安定する
- Googleフォームを使った方法より壊れにくい
- 仕様変更の影響を受けにくい
- サーバー間通信で確実にデータが届く
2. 拡張しやすい
この仕組みを土台にして、以下の機能を後から追加できます:
- GoogleChatへの通知
- AppSheetと連携
- 対応ステータス管理(未対応/対応中/完了)
- 自動返信メールのログ記録
- 月次レポートの自動生成
3. 実務で使える
- 個人事業主の問い合わせ管理
- 中小企業の顧客対応履歴
- 制作会社の案件管理
どの現場でも通用する仕組みです。この仕組みを導入したクライアントからは「Excelで管理していた頃より圧倒的に楽になった」と好評でした。
よくある質問
- プログラミング初心者でもできますか?
-
できます。
ほぼコピペで構築できます。変更が必要なのは「GASのURL」と「フォームID」の2箇所だけです。 - 無料ですか?
-
はい、無料です。
WordPress、Contact Form 7、Googleスプレッドシート、GASすべて無料で使えます。
- データは安全ですか?
-
Googleアカウント内に保存されるので、Excel添付メールより安全です。
アクセス権限はスプレッドシートの共有設定で細かく管理できます。
- 複数のフォームに対応できますか?
-
できます。
PHPコードの
$target_forms配列にIDを追加し、GASでシートを分ける処理を追加すれば対応可能です。
まとめ
Contact Form 7とGoogleスプレッドシートを連携すると、以下のメリットがあります:
- ✅ 問い合わせ管理が楽になる
- ✅ チーム共有がしやすくなる
- ✅ 業務効率が大きく上がる
- ✅ データの分析・活用が可能になる
「フォームは作ったけど、その後の管理が大変」という方に、特におすすめの仕組みです。
実装にかかる時間の目安は 30分〜1時間 程度。一度構築すれば、あとは自動で問い合わせが蓄積されていきます。
