フォーム回答をスプレッドシートで即通知
こんにちは、GASおじだ。中小企業の経営者やフリーランスの皆さん、Googleフォームの回答をリアルタイムで確認したいと思ったことはないかい?フォームの回答があったらすぐに通知が来て、しかも既存のデータを消さずに安全にバックアップも取れる仕組みを作るのが今回のテーマだよ。
この記事では、Googleフォームの回答を受け取ったら、スプレッドシートに即座に新しい日時付きシートを作成して回答をまとめ、その後にSlackなどへ通知を送る仕組みをGoogle Apps Script(GAS)で作ってみよう。しかも、既存のデータは絶対に消さない。消すAPIは使わず、入力検証もして、もしものためにバックアップもとる。これで無駄なSaaS課金を減らして、Googleアカウントの利用枠内で賢く業務を効率化できるぞ。
■ 初期設定と必要な権限
まず、スプレッドシートとGoogleフォームは連携済みとする。フォームの回答はスプレッドシートに自動で記録されているはずだ。今回のGASはフォームの回答をトリガーに動かすので、Installable Triggerの設定が必要だ。トリガーは以下のように設定しよう。
・スクリプトエディタの「編集」→「現在のプロジェクトのトリガー」
・「トリガーを追加」ボタンを押す
・実行する関数を onFormSubmitNotify に設定
・イベントの種類を「フォーム送信時」に設定
権限としては、スプレッドシートの編集権限とフォームの閲覧権限が必要。また、通知をSlackに送る場合はSlack WebhookのURLを用意し、GASのプロパティに保存するのが良い。個人情報の扱いには注意し、必要最小限の情報だけを通知することをお勧めする。
■ 入力検証と安全なデータ書き込み
フォーム回答には想定外のデータが入ることもある。そこで簡単な入力検証を行い、問題があればログに残して処理を中断する。また、回答は既存のシートを上書きせず、新しい日時付きのシートにまとめて書き込む。これにより元データは保持され、過去の回答も安全に保存される。
以下は例のコードだ。Slack通知はコメントアウトしてあるが、必要に応じてWebhook URLをセットして有効にしてほしい。
function onFormSubmitNotify(e) {
try {
// フォーム送信イベントから回答を取得
const responses = e.values;
if (!responses || responses.length === 0) {
console.error('回答データが空です。処理を中断します。');
return;
}
// 基本的な入力検証(例:必須項目の存在)
if (!responses[1] || !responses[2]) { // 例えば2列目と3列目が必須とする
console.error('必須項目が空です。回答を記録しません。');
return;
}
const ss = SpreadsheetApp.getActiveSpreadsheet();
// バックアップ用に新しいシートを作成(日時を名前に)
const timestamp = new Date();
const sheetName = Utilities.formatDate(timestamp, Session.getScriptTimeZone(), 'yyyyMMdd_HHmmss');
// 新しいシートを作成(既存のシートは削除しない)
const newSheet = ss.insertSheet(sheetName);
// ヘッダー行をフォームの項目名から取得(1行目)
const formSheet = ss.getSheetByName('フォームの回答 1'); // フォームの回答が記録されるシート名に合わせる
const headers = formSheet.getRange(1, 1, 1, formSheet.getLastColumn()).getValues()[0];
// ヘッダーと回答をまとめて書き込む
const dataToWrite = [headers, responses];
newSheet.getRange(1, 1, dataToWrite.length, dataToWrite[0].length).setValues(dataToWrite);
// ここでSlack通知などの外部連携も可能(必要に応じて)
/*
const slackWebhookUrl = PropertiesService.getScriptProperties().getProperty('SLACK_WEBHOOK_URL');
if (slackWebhookUrl) {
const payload = {
text: `新しいフォーム回答がありました。シート名: ${sheetName}`,
};
const options = {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(payload),
};
UrlFetchApp.fetch(slackWebhookUrl, options);
}
*/
console.log(`回答を新しいシート「${sheetName}」に安全に保存しました。`);
} catch (error) {
console.error('エラーが発生しました:', error);
}
}
■ バックアップと復元の考え方
今回のスクリプトは既存の回答シートを消さずに新しいシートを追加する方式だ。もし何か問題があっても、過去のシートはそのまま残っているので復元は簡単だ。特定の日時のシートを開いて、必要なデータをコピーすればよい。
万が一に備え、スプレッドシート自体のバージョン履歴も活用しよう。Googleスプレッドシートは自動的に数週間分の変更履歴を保存しているので、誤って上書きしても復旧可能だ。
■ コスト削減の試算(仮定)
よくある外部SaaSで回答通知をする場合、月額数千円〜1万円程度かかることもある。GASを使えばGoogleアカウントの利用枠内で追加の専用SaaS料金なしで実現可能だ。(ただしApps Scriptのquota・実行上限はあるので大量のフォーム送信には注意)
例えば、月に500件のフォーム回答があり、外部SaaSの通知サービスが月額5,000円と仮定すると、
年間コスト削減額 = 5,000円 × 12ヶ月 = 60,000円
となる。GASは無料の範囲内で使えても、実行時間や回数の制限はあるので、大量データには注意しつつ賢く使おう。
■ まとめ
・フォーム回答を即座に新しい日時付きシートに保存し、元データは消さない安全設計
・簡単な入力検証で誤ったデータの記録を防止
・Slack通知など外部連携もカスタマイズ可能
・Googleアカウントの利用枠内で追加SaaS料金なし(quota・実行上限あり)
・安心のバックアップ・復元体制で運用しやすい
中小企業やフリーランスの皆さんが無駄なSaaSコストを削減しつつ、業務効率化できるようにおじさんはこれからも役立つ情報を提供していくよ。
■ GASの相談や導入サポートを見たい方へ
この記事と近い作業をGoogleシートやGASで整えたい方は、Gasおじのココナラ出品一覧もご覧ください。
■ 関連サービス
GASおじのココナラ出品一覧
日々の記録、確認、通知、投稿準備などを、GoogleスプレッドシートとGASで無理なく自動化する相談ができます。