Googleフォーム×GASで業務効率化!他部署への情報共有を自動化する方法
- GAS
「Googleフォームの回答内容をいちいち転送するのが面倒」「応募者への対応が遅れて機会損失が発生している」「複数部署への情報共有に時間がかかりすぎる」といった課題に悩まされていませんか?
実は、Google Apps Script(GAS)を使えば、Googleフォームへの回答があった瞬間に、複数の関係者へ自動でメール通知を送信する仕組みを簡単に構築できます。プログラミング経験がなくても、コピー&ペーストで実装可能な自動化により、手作業での転送作業を完全に無くし、対応スピードを劇的に向上させることができるのです。
本記事では、NPO法人での面談申込自動通知システムの実装事例をもとに、GASを活用したフォーム通知自動化の具体的な手順と効果を詳しく解説します。一度設定すれば、採用活動から問い合わせ対応まで、様々な業務で活用できる汎用的なシステムが完成するでしょう。
なお本記事は、もともとSHIFT AIの会員コミュニティ内で限定公開していた内容を特別に一般公開しています。SHIFT AIでは、こうした実践的なAI活用ノウハウを日々研究・発信しており、誰でもすぐに実務で活かせる形で情報提供を行っています。
さらに詳しく学びたい方には、定期開催している無料セミナーもご用意しています。ページ下部よりお気軽にご参加ください。
課題と背景
多くの組織が抱える情報共有の課題
現代の組織運営において、Googleフォームは欠かせないツールとなっていますが、その活用方法に多くの問題が潜んでいます。
典型的な課題パターン
- 情報の属人化:特定の担当者のメールにのみ通知が届く
- 転送作業の負荷:手作業でのSlack転送や口頭共有が必要
- 対応の遅延:確認タイミングによって初回対応が数日遅れる
- 共有漏れのリスク:重要な申込や問い合わせの見落とし
NPO法人での具体的な課題事例
組織概要
- ボランティア採用を行うNPO法人
- 月間20-30件の面談申込を処理
- 役員・人事チーム・事務局の3部署で情報共有が必要
発生していた問題
- 情報の一極集中
- 役員の個人メールアドレスにのみフォーム通知
- 役員が不在時は対応が完全停止
- 他部署は情報を把握できない状況
- 手作業による非効率
- 1件あたり5-8分の転送作業
- 内容の要約や補足説明が必要
- 月間で2-3時間の純粋な転送作業
- 対応品質の低下
- 初回連絡まで平均48時間
- 緊急性の高い申込への対応遅れ
- 応募者からの「返事が遅い」というフィードバック
- 機会損失の発生
- 転送忘れによる完全な対応漏れ
- 遅延による応募者の他団体への流出
- 組織の信頼性低下
業界横断的な共通課題
この問題はNPO法人に限らず、多くの業界で共通して見られる課題です:
人事・採用業界
- 求人応募の初回対応遅延による優秀人材の逸失
- 面接調整の非効率による採用期間の長期化
営業・マーケティング
- 問い合わせ対応の遅延による受注機会の損失
- リード情報の共有漏れによる営業機会の逸失
カスタマーサポート
- 顧客問い合わせの対応遅延による満足度低下
- 緊急対応が必要な案件の見落とし
導入内容と仕組み
自動通知システムの全体構成
GASを活用した自動通知システムは、以下の要素で構成されます。
システム構成要素
- Googleフォーム:申込者の入力インターフェース
- Googleスプレッドシート:回答データの蓄積
- Google Apps Script:自動処理を実行するスクリプト
- Gmail API:メール送信機能
- トリガー機能:フォーム送信時の自動実行
データフローの詳細
ステップ1:フォーム送信 申込者がGoogleフォームに必要事項を入力して送信
ステップ2:データ蓄積 フォーム回答が連携されたGoogleスプレッドシートに自動保存
ステップ3:トリガー発動 フォーム送信イベントによりGASのonFormSubmit関数が自動実行
ステップ4:データ取得・加工 GASがスプレッドシートから最新の回答データを取得し、メール用に整形
ステップ5:メール自動送信 設定された複数のメールアドレスに同時通知
ステップ6:ログ記録 実行結果をGASのログシステムに記録
自動化による改善効果
Before(手作業時代)
フォーム送信 → 役員メール通知 → 役員確認(数時間〜数日後)
→ Slack転送(5-8分) → 人事チーム確認 → 応募者連絡
After(自動化後)
フォーム送信 → 即座に全関係者にメール通知 → 人事チーム即座対応
定量的改善効果
- 通知速度:数時間〜数日 → 数秒
- 転送作業時間:月間2-3時間 → 0時間
- 初回対応時間:平均48時間 → 平均4時間
- 対応漏れ:月1-2件 → 0件
GASの実装方法
実装の前提条件
必要な環境・権限
- Googleアカウント(G Suite/Google Workspaceアカウント推奨)
- Googleフォームとスプレッドシートの作成権限
- GASの実行権限
- Gmail送信権限
事前準備
- Googleフォームの作成と基本設定
- 回答先スプレッドシートの設定
- 送信先メールアドレスの確認
- 必要な権限の確認
ステップ1:Googleフォームとスプレッドシートの準備
フォーム作成
- Googleフォームで新しいフォームを作成
- 必要な質問項目を設定(例:お名前、メールアドレス、希望日程等)
- 「回答」タブから「スプレッドシートを作成」を選択
- 新しいスプレッドシートが自動生成されることを確認
重要な注意点
- 質問項目名はGASコードで使用するため、分かりやすい名前を設定
- 必須項目は適切に設定
- スプレッドシートの列見出しがフォームの質問文と一致することを確認
ステップ2:GASエディタの起動とコード実装
GASエディタへのアクセス
- 作成されたスプレッドシートを開く
- メニューから「拡張機能」→「Apps Script」を選択
- 新しいGASプロジェクトが開く


基本コードの実装
function onFormSubmit(e) {
try {
// フォーム回答データの取得
const responses = e.namedValues;
// 回答項目の取得(フォームの質問項目名に合わせて修正)
const email = responses[“メールアドレス”]?.[0] || “”;
const name = responses[“お名前”]?.[0] || “申込者さま”;
const phone = responses[“電話番号”]?.[0] || “未入力”;
const preferredDate = responses[“希望日程”]?.[0] || “未入力”;
// スプレッドシートのURLを取得
const sheet = SpreadsheetApp.getActiveSpreadsheet();
const sheetUrl = sheet.getUrl();
// メール件名の設定
const subject = “【自動通知】ご面談フォームに回答がありました”;
// メール本文の作成
const body = `
${name}さまより、ご面談フォームへのご回答がありました。
人事チームにて内容をご確認のうえ、対応をお願いいたします。
■ 申込者情報
お名前:${name}
メールアドレス:${email}
電話番号:${phone}
希望日程:${preferredDate}
■ 詳細確認
回答内容の詳細はスプレッドシートをご確認ください。
${sheetUrl}
—
特定非営利活動法人○○○○○
※このメールは自動送信です
`;
// メール送信の実行
GmailApp.sendEmail(
“info@yourorganization.org”, // To(主担当者)
subject,
body,
{
cc: “hr@yourorganization.org,office@yourorganization.org”, // CC(関係者)
replyTo: email // 返信先を申込者のメールアドレスに設定
}
);
// 実行ログの記録
console.log(`メール送信完了: ${name}さん (${email})`);
} catch (error) {
// エラーハンドリング
console.error(“メール送信エラー:”, error);
// エラー通知メール(オプション)
GmailApp.sendEmail(
“admin@yourorganization.org”,
“【エラー】フォーム通知システム異常”,
`フォーム通知の送信でエラーが発生しました。\n\nエラー内容: ${error.toString()}`
);
}
}
// トリガー設定用の関数(初回設定時に1回だけ実行)
function setupFormTrigger() {
try {
// 既存のトリガーを削除(重複防止)
const triggers = ScriptApp.getProjectTriggers();
triggers.forEach(trigger => {
if (trigger.getHandlerFunction() === ‘onFormSubmit’) {
ScriptApp.deleteTrigger(trigger);
}
});
// スプレッドシートに紐づくフォームを取得
const sheet = SpreadsheetApp.getActiveSpreadsheet();
const formUrl = sheet.getFormUrl();
if (!formUrl) {
throw new Error(“このスプレッドシートにはフォームがリンクされていません。”);
}
// フォームオブジェクトを取得
const form = FormApp.openByUrl(formUrl);
// フォーム送信時のトリガーを作成
ScriptApp.newTrigger(‘onFormSubmit’)
.forForm(form)
.onFormSubmit()
.create();
console.log(“トリガーの設定が完了しました。”);
} catch (error) {
console.error(“トリガー設定エラー:”, error);
throw error;
}
}
ステップ3:設定のカスタマイズ
メールアドレスの設定
// 送信先の設定例
const config = {
to: “info@yourorganization.org”, // 主担当者
cc: [
“hr@yourorganization.org”, // 人事チーム
“office@yourorganization.org”, // 事務局
“manager@yourorganization.org” // 管理者
].join(“,”),
bcc: “log@yourorganization.org” // ログ用(オプション)
};
フォーム項目とコードの対応
// フォームの質問項目名に応じて修正
const responses = e.namedValues;
const formData = {
name: responses[“お名前を入力してください”]?.[0] || “未入力”,
email: responses[“連絡先メールアドレス”]?.[0] || “未入力”,
phone: responses[“電話番号(任意)”]?.[0] || “未入力”,
message: responses[“ご質問・ご要望がございましたらご記入ください”]?.[0] || “なし”
};
ステップ4:トリガーの設定と動作確認
初期設定の実行
1.GASエディタでsetupFormTrigger関数を選択して保存


2.トリガーの各項目を以下のように設定する
- 実行する関数:onFormSubmit
- イベントのソース:フォームから を選択
- イベントの種類:フォーム送信時



※実際の画面とは異なります。
動作テストの実施
- 実際にGoogleフォームから送信テストを実施
- 自動メール通知が正常に動作することを確認
トリガー状態の確認
- GASエディタの左メニューから「トリガー」を選択
- フォーム送信トリガーが設定されていることを確認
- トリガーの状態が「有効」になっていることを確認
実装時の注意点と初心者向け解説
注意点1:フォーム項目名とコードの紐付け
フォームの質問項目名とGASコード内の項目名は完全に一致させる必要があります。
確認方法
- Googleフォームの「回答」タブでスプレッドシートを開く
- 1行目の列見出し(質問項目名)を確認
- GASコード内のresponses[“項目名”]を完全一致させる
よくある失敗例
// ❌ 不正確(スペースや文字が微妙に違う)
const name = responses[“お名前”]?.[0];
// ⭕ 正確(スプレッドシートの列見出しと完全一致)
const name = responses[“お名前を入力してください”]?.[0];
注意点2:Gmail送信制限の理解
Googleアカウントには1日あたりのメール送信制限があります。
送信制限
- 個人アカウント:1日500通
- Google Workspaceアカウント:1日2000通
制限対策
// 送信前の制限チェック機能
function checkDailyLimit() {
const today = Utilities.formatDate(new Date(), “JST”, “yyyy-MM-dd”);
const properties = PropertiesService.getScriptProperties();
const sentToday = parseInt(properties.getProperty(`sent_${today}`) || “0”);
if (sentToday >= 450) { // 安全マージンを設定
throw new Error(“1日の送信制限に近づいています。”);
}
// 送信後にカウンターを更新
properties.setProperty(`sent_${today}`, (sentToday + 1).toString());
}
注意点3:エラーハンドリングの重要性
システムの安定性を確保するため、適切なエラーハンドリングを実装します。
推奨するエラーハンドリング
function onFormSubmit(e) {
try {
// メイン処理
processFormSubmission(e);
} catch (error) {
// エラーログの記録
console.error(“処理エラー:”, error);
// 管理者への通知
notifyAdminOfError(error, e);
// ユーザーへの影響を最小化
// (この場合は何もしない = フォーム送信は正常完了として扱う)
}
}
function notifyAdminOfError(error, formData) {
try {
const errorDetails = {
timestamp: new Date().toISOString(),
error: error.toString(),
stack: error.stack,
formData: JSON.stringify(formData, null, 2)
};
GmailApp.sendEmail(
“admin@yourorganization.org”,
“【緊急】フォーム通知システムエラー”,
`システムでエラーが発生しました。\n\n${JSON.stringify(errorDetails, null, 2)}`
);
} catch (notificationError) {
console.error(“エラー通知の送信も失敗:”, notificationError);
}
}
セキュリティ・運用面での重要な配慮事項
セキュリティ対策の必須事項
権限設定の最小化原則
// 実行権限の確認機能
function validatePermissions() {
const user = Session.getActiveUser().getEmail();
const allowedUsers = [
“admin@yourorganization.org”,
“it@yourorganization.org”
];
if (!allowedUsers.includes(user)) {
throw new Error(“実行権限がありません。”);
}
}
個人情報保護への配慮
// 個人情報を含まないメール本文の例
const body = `
新しい面談申込がありました。
詳細な内容はスプレッドシートでご確認ください。
申込日時: ${new Date().toLocaleString(“ja-JP”)}
回答件数: ${sheet.getLastRow() – 1}件目
詳細確認: ${sheetUrl}
※個人情報保護のため、申込者の詳細情報はスプレッドシートでのみ確認可能です。
`;
アクセスログの記録
function logAccess(action, user, details) {
const logSheet = SpreadsheetApp.openById(“LOG_SHEET_ID”).getActiveSheet();
logSheet.appendRow([
new Date(),
action,
user,
JSON.stringify(details)
]);
}
運用面でのベストプラクティス
定期メンテナンス計画
- 月次チェック
- トリガーの動作状況確認
- エラーログの確認
- 送信統計の確認
- 四半期メンテナンス
- コードの見直し
- セキュリティ設定の確認
- パフォーマンス最適化
- 年次監査
- 全体システムの見直し
- セキュリティ監査
- 利用規約の更新
バックアップとディザスタリカバリ
// 設定情報のバックアップ機能
function backupConfiguration() {
const config = {
triggers: ScriptApp.getProjectTriggers().map(t => ({
handlerFunction: t.getHandlerFunction(),
eventType: t.getEventType(),
triggerSource: t.getTriggerSource()
})),
properties: PropertiesService.getScriptProperties().getProperties(),
timestamp: new Date().toISOString()
};
// 設定をスプレッドシートに保存
const backupSheet = SpreadsheetApp.openById(“BACKUP_SHEET_ID”);
backupSheet.getActiveSheet().appendRow([
config.timestamp,
JSON.stringify(config)
]);
}
応用例と拡張可能性
他業務での活用パターン
人事・採用業務への応用
- 求人応募フォームの自動通知
- 面接スケジュール調整の自動化
- 入社手続き書類の提出通知
営業・マーケティングへの応用
- 商品問い合わせの自動振り分け
- セミナー申込の即座通知
- 見積依頼の関係部署への転送
カスタマーサポートへの応用
- サポート依頼の自動エスカレーション
- 緊急度別の通知ルーティング
- 対応状況の自動レポート
システムの拡張機能
条件分岐による高度な振り分け
function routeByContent(responses) {
const category = responses[“お問い合わせ種別”]?.[0];
const urgency = responses[“緊急度”]?.[0];
let recipients = [“info@yourorganization.org”];
// カテゴリ別の振り分け
switch(category) {
case “技術的なお問い合わせ”:
recipients.push(“tech@yourorganization.org”);
break;
case “料金・契約について”:
recipients.push(“sales@yourorganization.org”);
break;
case “サポート依頼”:
recipients.push(“support@yourorganization.org”);
break;
}
// 緊急度による追加通知
if (urgency === “緊急”) {
recipients.push(“emergency@yourorganization.org”);
}
return recipients;
}
自動返信機能の追加
function sendAutoReply(applicantEmail, applicantName) {
const subject = “【自動返信】お申し込みを受け付けました”;
const body = `
${applicantName}さま
この度は面談のお申し込みをいただき、ありがとうございます。
お申し込み内容を確認いたしました。
担当者より3営業日以内にご連絡させていただきますので、
今しばらくお待ちください。
ご不明な点がございましたら、下記までお気軽にお問い合わせください。
—
特定非営利活動法人○○○○○
担当:人事チーム
電話:03-1234-5678
メール:hr@yourorganization.org
※このメールは自動送信です
`;
GmailApp.sendEmail(applicantEmail, subject, body);
}
まとめ:自動化で実現する効率的な組織運営
Googleフォーム×GASによる自動通知システムは、組織の情報共有を根本的に改善する強力なツールです。プログラミング知識がなくても実装できる手軽さと、大幅な業務効率化を両立できる点が最大の魅力です。
重要なのは、技術的な完璧さよりも、組織のニーズに合わせた実用性を重視することです。まずは基本的な自動通知から始めて、運用しながら機能を拡張していくアプローチが成功の鍵となります。
このシステムを導入することで、あなたの組織の情報共有速度と業務品質が格段に向上するはずです。
さらに詳しい自動化活用術や最新情報を学びたい方は、定期開催している無料セミナーもご用意しております。ページ下部よりお気軽にご参加ください。
投稿者プロフィール
皆川純子
Instagramアカウント:https://www.instagram.com/remote_ai_official/
無料セミナーへの参加はこちらから
SHIFT AIの最先端AI活用×マネタイズが
学べる限定特典付き
これらの特典は、SHIFT AIがこれまで20,000人以上に届けてきた
「実務直結のAIスキル」のノウハウを、
国内外の先端事例と組み合わせ、誰もが再現できる形に体系化したものです。