Google Apps Script(GAS)を活用すると、Googleフォームの送信時にカレンダーへ予定を登録し、自動返信メールを送信することができます。本記事では、Googleフォームの回答をトリガーにしてGoogleカレンダーに予定を登録し、Gmailで自動返信するスクリプトの実装方法を詳しく解説します。初心者でも実践できるように、コード例やトリガー設定の手順を分かりやすく紹介します。
Google Apps Script(GAS)とは?
GASの概要
Google Apps Script(GAS) は、Googleが提供するスクリプト言語で、Googleの各種サービス(Gmail、スプレッドシート、カレンダー、Googleフォームなど)を 連携・自動化 できる強力なツールです。
JavaScriptベース で記述できるため、比較的習得しやすいのも特徴です。
GASを活用するメリット
- 手作業の自動化:データ入力、メール送信、カレンダー登録などの繰り返し作業を省ける
- Googleサービスとの統合が簡単:Gmail、スプレッドシート、カレンダーなどをスムーズに連携
- トリガー機能を活用できる:フォーム送信時や特定の時間に自動実行が可能
- 無料で使える:Googleアカウントがあれば追加コストなしで利用可能
本記事では、Googleフォームの送信をトリガーにして、カレンダーに予定を登録し、自動でメールを送る方法 を紹介します。
Googleフォーム送信で実現できる自動化機能
Googleフォームの送信をトリガーとして、GASを活用することで、以下のような自動化を実現できます。
1. Googleカレンダーへの予定登録
- フォーム送信時に「希望日時」フィールドの情報を取得し、Googleカレンダーに自動的にイベントを追加。
- 予約や問い合わせ対応のスケジュール管理をスムーズに。
2. 自動返信メールの送信
- フォーム送信者に対し、「お問い合わせありがとうございます」といった確認メールを自動送信。
- 事前に定型文を用意し、ユーザーに迅速に対応。
3. Googleスプレッドシートへのデータ記録(応用編)
- フォームの回答内容をスプレッドシートに記録し、後でデータ分析や確認が可能。
これにより、問い合わせ管理の手間を減らし、迅速な対応が可能になります。
次のセクションでは、具体的な準備手順を解説していきます。
必要な準備
GASを使ってGoogleフォームの送信をトリガーに カレンダー登録&自動返信メール を実装するために、以下の準備を行います。
1. Googleフォームの作成
- 必須フィールド
- 「メールアドレス」(ユーザーに自動返信するため)
- 「連絡希望日」(カレンダー登録するため)
- 「連絡希望時刻」(カレンダー登録するため)
- 「問い合わせ内容」(イベントタイトルや詳細として活用)
- 設定手順
- Googleフォーム にアクセス。
- 新規フォーム を作成し、上記のフィールドを追加。
- フォームの「設定」→「回答の収集」で メールアドレスの収集を有効化。
2. Googleスプレッドシートとの連携
- フォームの回答を記録するため、Googleスプレッドシートに自動保存されるように設定。
- 設定手順
- Googleフォームの「回答」タブを開く。
- スプレッドシートのアイコン をクリックし、新規または既存のスプレッドシートにリンク。
3. Google Apps Script(GAS)の準備
- スプレッドシート上でGASを開き、スクリプトを記述するための環境を整える。
- 設定手順
- Googleスプレッドシートを開く。
- メニューから 「拡張機能」 → 「Apps Script」 を選択。
- スクリプトエディタが開くので、ここにGASのコードを記述。
GASのスクリプト解説(Googleフォーム送信でカレンダー登録&自動返信)
ここからは、Google Apps Script(GAS)を使って Googleフォーム送信時にカレンダー登録し、自動返信メールを送るスクリプト を解説します。
1. GASの基本コード
以下のスクリプトをGASエディタに記述します。
/**
* フォーム送信時:カレンダー登録&自動返信
* 必要:フォーム送信トリガー(インストール型)
*/
function onFormSubmitAutoCalendarAndMail(e) {
const namedValues = e?.namedValues || {};
const formResponseId = e?.response ? e.response.getId() : Utilities.getUuid(); // 重複防止タグ
// === 設問タイトル(フォームに合わせて変更)===
const Q_DATE = '連絡希望日';
const Q_TIME = '連絡希望時刻';
const Q_EMAIL = 'メールアドレス';
const Q_BODY = '問い合わせ内容';
// === 回答値取得 ===
const dateStr = (namedValues[Q_DATE] && namedValues[Q_DATE][0]) || '';
const timeStr = (namedValues[Q_TIME] && namedValues[Q_TIME][0]) || '';
const email = (namedValues[Q_EMAIL] && namedValues[Q_EMAIL][0]) || '';
const inquiry = (namedValues[Q_BODY] && namedValues[Q_BODY][0]) || '詳細なし';
// === 日付+時刻をDateに変換 ===
const dt = combineDateTime_(dateStr, timeStr);
if (!dt) {
if (email) {
GmailApp.sendEmail(
email,
'お問い合わせありがとうございます',
'ご入力の日時を読み取れませんでした。担当よりご連絡いたします。\n\n内容: ' + inquiry
);
}
return;
}
const start = dt;
const end = new Date(start.getTime() + 60 * 60 * 1000); // デフォルト1時間
// === 件名(問い合わせ内容の先頭20文字を〇〇部分に差し込み)===
const subject = `【〇〇】打ち合わせ`;
// === カレンダー登録(ゲスト招待&重複防止あり)===
const cal = CalendarApp.getDefaultCalendar();
const dupTag = 'FormResponseID:' + formResponseId;
const existing = cal.getEvents(start, end, {search: dupTag});
if (!existing || existing.length === 0) {
cal.createEvent(
subject,
start,
end,
{
description:
'問い合わせ内容:\n' + inquiry +
'\n\nFormResponseID:' + formResponseId,
guests: email, // ゲストにフォーム回答者のメールを追加
sendInvites: true // 招待メールを自動送信
}
);
}
// === 自動返信メール(必要なら残す)===
if (email) {
GmailApp.sendEmail(
email,
'お問い合わせありがとうございます',
[
'ご連絡希望日時で予定を登録しました。',
'',
'日時: ' + formatYMDHM_(start) + ' 〜 ' + formatYMDHM_(end),
'件名: ' + subject,
'内容: ' + inquiry,
'',
'※このメールにご返信いただけます。'
].join('\n'),
{
name: 'サポート窓口',
replyTo: 'support@example.com' // 任意
}
);
}
}
/**
* 日付+時刻を Date オブジェクトに変換
* 例: dateStr=2025/09/08, timeStr=13:00:00
*/
function combineDateTime_(dateStr, timeStr) {
if (!dateStr) return null;
// 日付を正規化 (2025/09/08 形式へ)
const d = String(dateStr).trim()
.replace(/年|\/|-/g, '/')
.replace(/月/g, '/')
.replace(/日/g, '');
const m1 = d.match(/^(\d{4})\/(\d{1,2})\/(\d{1,2})$/);
if (!m1) return null;
let hour = 9, minute = 0, second = 0;
if (timeStr) {
// 時刻を正規化(全角コロン対応、空白除去)
const t = String(timeStr).trim()
.replace(/:/g, ':')
.replace(/\s+/g, '');
// HH:mm or HH:mm:ss の両対応
const m2 = t.match(/^(\d{1,2}):(\d{2})(?::(\d{2}))?$/);
if (m2) {
hour = +m2[1];
minute = +m2[2];
second = m2[3] ? +m2[3] : 0;
}
}
return new Date(+m1[1], (+m1[2]) - 1, +m1[3], hour, minute, second);
}
/** 日時を "YYYY/MM/DD HH:mm" に整形 */
function formatYMDHM_(d) {
const pad = n => ('0' + n).slice(-2);
return (
d.getFullYear() + '/' +
pad(d.getMonth() + 1) + '/' +
pad(d.getDate()) + ' ' +
pad(d.getHours()) + ':' +
pad(d.getMinutes())
);
}
2. コードの解説
このスクリプトは Googleフォームの送信をトリガー にして、次の処理を実行します。
- フォーム送信データを取得
e.namedValues
からフォーム回答の値を取得し、適切な変数に格納。
- Googleカレンダーへの予定登録
contactDateStr
を日付オブジェクト (new Date()
) に変換し、Googleカレンダーにイベントを作成。endTime
は開始時刻の1時間後に設定。
- 自動返信メールの送信
GmailApp.sendEmail()
を使い、送信者に自動返信メールを送る。- 問い合わせ内容をメール本文に含める。
トリガーの設定(Googleフォーム送信時にスクリプトを自動実行)
GASのスクリプトを Googleフォーム送信時に自動実行 するには、トリガー を設定する必要があります。
1. トリガーとは?
Google Apps Script(GAS)のトリガーは、特定のイベント(フォーム送信、時間経過、ファイル変更など)をきっかけにスクリプトを実行する仕組みです。
本記事では 「Googleフォーム送信時」 にスクリプトが動作するようにトリガーを設定します。
2. トリガーの設定手順
以下の手順でトリガーを設定してください。
① スクリプトエディタを開く
- Googleスプレッドシートの 「拡張機能」 → 「Apps Script」 をクリックし、スクリプトエディタを開く。
② トリガーの管理画面を開く
- スクリプトエディタ上部のメニューから 「トリガー」アイコン(時計マーク) をクリック。
③ 新しいトリガーを追加
- 「トリガーを追加」ボタン をクリック。
- 設定項目を以下のように選択:
- 実行する関数:
onFormSubmitAutoCalendarAndMail
- 実行するデプロイ:デフォルトのままでOK
- イベントの種類:
フォーム送信時
- エラー通知設定:必要に応じて(例:毎日通知)
- 実行する関数:
④ トリガーを保存
- 「保存」ボタンを押すと、Googleアカウントの承認画面が表示される。
- 「許可」 をクリックし、スクリプトの実行を許可。
3. トリガーが正しく動作するかテスト
トリガー設定後、フォームを送信し、以下の動作を確認してください。 ✅ カレンダーに予定が追加される
✅ メールが自動返信される
エラーが発生した場合、スクリプトエディタの 「実行」メニュー → 「ログ(Logger.log)」 でデバッグすると原因を特定しやすくなります。
セキュリティと権限設定の注意点
Google Apps Script(GAS)を利用する際、セキュリティと権限設定 には特に注意が必要です。
適切な設定を行わないと、意図しないデータ漏洩やスクリプトの実行エラーが発生する可能性があります。
1. 承認プロセス
GASで GoogleカレンダーやGmailを操作する には、Googleアカウントの承認 が必要です。
承認の手順
- 初めてスクリプトを実行すると、「このアプリはGoogleで確認されていません」という警告が表示される。
- 「詳細を表示」→「安全ではないページへ移動」 をクリック。
- 「許可」を押して、スクリプトの実行を許可する。
なぜこの承認が必要なのか?
- GASは Googleの各サービスにアクセスするスクリプト なので、ユーザーの許可が必要。
- これにより、 悪意のあるスクリプトが勝手に実行されるのを防ぐ 仕組みになっている。
動作テストとデバッグ方法
GASスクリプトを実装した後、正常に動作するかテスト し、問題があればデバッグする必要があります。
このセクションでは、テスト手順とデバッグのポイント を解説します。
1. フォーム送信によるテスト
まずは、以下の手順でスクリプトが意図した通りに動作するか確認しましょう。
テスト手順
- Googleフォームを開く。
- フォームを送信し、実際のデータを入力。
- 以下の動作を確認:
- ✅ Googleカレンダーに予定が登録されているか
- ✅ 自動返信メールが届いているか
- ✅ スプレッドシートにデータが正しく記録されているか(応用)
2. ログを確認する
スクリプトの実行状況を確認する ために、GASの Logger.log() を活用します。
ログの記録方法
スクリプト内の適切な場所に以下のコードを追加:
Logger.log("フォーム送信データ: " + JSON.stringify(namedValues));
これにより、フォーム送信時のデータがログとして出力されます。
ログの確認手順
- スクリプトエディタで「実行」→「ログ」タブを開く。
- 送信データが正しく取得されているかチェック。
3. 手動実行でデバッグ
GASのコードが正しく動作するか 手動で実行して確認 する方法もあります。
手動実行の手順
- スクリプトエディタを開く。
onFormSubmitAutoCalendarAndMail(e)
を実行(ただしe
のデータがないため注意)。Logger.log()
を利用し、変数の値を確認。- 実行結果にエラーがないかチェック。
4. よくあるエラーと対策
エラー | 原因 | 対策 |
---|---|---|
TypeError: Cannot read property '0' of undefined | フォームのデータが取得できていない | フォームの質問名とスクリプト内のキーが一致しているか確認 |
The script does not have permission to access the calendar | 権限が不足している | GoogleアカウントでGASの権限を許可する |
MailApp.sendEmail() failed | メール送信に失敗 | 正しいメールアドレスが取得できているか Logger.log() で確認 |
Invalid Date | フォームの日時データが正しく変換できていない | フォーマットを確認し、new Date(contactDateStr) が正常に動作するか検証 |
5. テスト完了後のチェックポイント
✅ カレンダー登録、メール送信が正しく動作するか
✅ フォームのデータが正しく取得・処理されているか
✅ エラーが発生していないか(ログを確認)
応用例とカスタマイズ方法
GASを活用すれば、Googleフォームの送信時にカレンダー登録やメール送信をするだけでなく、さまざまな拡張機能を追加 できます。ここでは、応用例やカスタマイズの方法を紹介します。
1. 予約の重複チェック
現在のスクリプトでは、カレンダーに無条件でイベントを登録しますが、既に同じ時間帯に予定がある場合は登録を防ぐ ことも可能です。
カスタマイズコード
function checkAndCreateEvent(title, startTime, endTime, description) {
var calendar = CalendarApp.getDefaultCalendar();
var events = calendar.getEvents(startTime, endTime);
if (events.length > 0) {
Logger.log("既に予定があります。イベントを作成しません。");
return "予約不可:既に予定があります";
} else {
calendar.createEvent(title, startTime, endTime, {description: description});
return "予約完了:カレンダーに登録しました";
}
}
- 既存の
onFormSubmitAutoCalendarAndMail
に 予約チェック機能 を組み込んで、空きがある場合のみ登録し、結果をメール送信。
3. スプレッドシートに予約ステータスを記録
予約の成否をスプレッドシートに記録する ようにカスタマイズできます。
カスタマイズコード
function logReservation(email, date, status) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("予約ログ");
if (!sheet) {
sheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("予約ログ");
sheet.appendRow(["メールアドレス", "予約日時", "ステータス"]);
}
sheet.appendRow([email, date, status]);
}
予約が成功したかどうかを 「予約ログ」シート に記録。
データを蓄積することで、予約履歴の管理 が可能に。
4. 予約リマインドメールを自動送信
予約の前日にリマインドメール を自動送信するように設定できます。
カスタマイズコード
function sendReminderEmails() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("予約ログ");
var data = sheet.getDataRange().getValues();
var today = new Date();
today.setHours(0, 0, 0, 0);
for (var i = 1; i < data.length; i++) {
var email = data[i][0];
var reservationDate = new Date(data[i][1]);
reservationDate.setDate(reservationDate.getDate() - 1);
if (reservationDate.getTime() === today.getTime()) {
GmailApp.sendEmail(email, "【リマインダー】予約日時のご案内", "明日がご予約の日です。お忘れなく!");
}
}
}
- 毎日自動実行 するトリガーを設定し、前日の予約者にメールを送る。
- トリガーの設定方法は 「時間ベースのトリガー」→「毎日1回」 に設定。
5. Slackへの通知
フォーム送信時にSlackにも通知を送ることで、チーム全員で情報を共有 できます。
カスタマイズコード
function sendSlackNotification(message) {
var webhookUrl = "https://hooks.slack.com/services/xxxxx/yyyyy/zzzzz"; // 自分のWebhook URLに変更
var payload = JSON.stringify({text: message});
var options = {
method: "post",
contentType: "application/json",
payload: payload
};
UrlFetchApp.fetch(webhookUrl, options);
}
フォーム送信時に sendSlackNotification()
を呼び出す ことで、Slackに通知。
まとめ
本記事では、Googleフォームの送信をトリガーにして、Googleカレンダーへ自動登録し、メールを自動返信する方法 を解説しました。
本記事を参考に、GASを活用して Googleフォームの送信をトリガーにした業務自動化 を実践してみてください!
うまく活用すれば、手作業を減らし、作業効率を大幅に向上できます。
さらに知りたいことや、追加のカスタマイズが必要ですか?
ご質問や「こんな機能も追加したい!」といった要望があれば、お気軽にご相談ください!