PR

【GAS】Googleフォームに定員(人数制限)と返信メール、掲示板などマルチ機能を追加する

Google Workspace

ここで紹介するGAS(multiReply)を使うことで、Googleフォームに次の3つの機能を追加できます。

  • 定員(人数制限)
    フォームの申し込み(回答)が、定員(人数制限)になると回答受付を終了します。
  • 返信メール
    回答後に送る自動返信メールを自由に作れます。
  • 掲示板
    フォームの送信毎に、メッセージが変更できる掲示板(説明)が使えます。

それでは、multiReplyを実例を使って説明します。

スポンサーリンク

フォーム、スプレッドシート、GASを準備する

フォーム

Googleフォームで、次のような講演会の申込フォームを作ります。

この申込みフォームには、申込人数に50人までの定員(人数制限)を設けています。

掲示板(お知らせ)の項目は「タイトルと説明を追加」で作れます。

※掲示板は作らなくても問題ありません。

スプレッドシート

フォームとリンクしたスプレッドシートを作ります。

フォームとリンクしたスプレッドシートに、次のようなシート(ここでは、シート1)を追加します。

シート1は、GAS(multiReply)で使うシートです。
※数式で表示([Ctrl]+@)しています。

1行目のセルB1~D1(任意項目)には、質問の「お名前」「メールアドレス」を入れます。(必要なら好きな言葉に替えます)

2行目は最後に送信された回答が表示されます。

セルB3~B12(必須項目)は、GASにて以下のように使われます。

  • B3数値が0以下ならフォームの回答受付を終了
  • B4フォームに「タイトルと説明」(掲示板)があれば、セルの内容を説明に表示
  • B5OFF(半角)だと返信メールを送らない
  • B6返信メールの件名
  • B7返信メールの本文
  • B8返信メールの宛先(メールアドレス)、ここでは、=D2を入れてます。
  • B9:必要なら、CC:を追加する。複数の場合は、aaa@gmail.com, bbb@gmail.comのように,で区切ってください。
  • B10:必要なら、BCC:を追加する。複数の場合は、aaa@gmail.com, bbb@gmail.comのように,で区切ってください。
  • B11:必要なら、送信元(自分)の表示名を入れます。
  • B12:必要なら、返信先(メールアドレス)を入れます。

コピペ用のシート内容です。

フォームの回答
ABC
1タイムスタンプお名前メールアドレス
2
3
4
5
6
シート1
ABCD
1質問タイムスタンプお名前メールアドレス
2最新の回答
3終了フラグ=50-COUNTA('フォームの回答'!A:A)+1
4掲示板="あと、"&50-COUNTA('フォームの回答'!A:A)+1&"席の空きがあります。"
5OFF:
メールを送らない
6件名◯◯講演会のお申込みをありがとうございます。
7本文=C2&" 様、 ◯◯講演会のお申込みをありがとうございます。
~~~~~<お申込み内容>~~~~~
◆ 〇〇講演会
◆ 日時:7月9日(日)
◆ 会場:東京都〇〇区〇〇-〇〇-〇〇
 (住所:〇〇区民館 1階小ホール)
◆ 講演時間: 10:30 ~ 12:00(開場:10時)
◆ 料金:2,000円

◆ 申込者(お名前):"&C2&"
◆ メールアドレス:"&D2&"
~~~~~~~~~~~~~~~~~~
次のクレジット決済用URLをクリックして、料金のお支払いをお願いいたします。 https://square.link/u/o1exxxPZ

お支払い後、レシートがメールで届きますので、ご来場のとき受付でお見せください。
それでは、当日会場にてお待ちしております。"
8TO:=D2
9CC:(省略可)
10BCC:(省略可)
11NAME:(省略可)〇〇主催
12REPLY TO:(省略可)
表計算が得意な人には何でもない関数ですが、セル内に文章を書くのは不慣れな人が多いのではないでしょうか。
"文字列"(ダブルクォーテーションで挟まれた文字列)とセルの数値(C2など)を、&(半角)でつなぎながら文章を書くのは慣れないと少し難しいかもしれません。
コツは最初に"を付けてから、一気に文章を書きあげて最後に"で閉じます。
この時、改行([Ctrl]+[Enter]キー)も気にせずに使います。
それから必要な箇所を"&※※&"に置き換えていきます。(※※は、A1,、B2など)

'シート1'のB7セルに望みの文章が表示出来たら、それがそのままメールの文章になります。

関数についての説明

申込人数を50人に制限するために、B3セルに次のような数式を設定しました。

=50-COUNTA('フォームの回答'!A:A)+1

COUNTA関数は指定された範囲の空白でないセルの数をカウントします。

ここでは、'フォームの回答'シートのA列のタイムスタンプの数が、50になるとB3セルの数値が0(ゼロ)になります。

これにより申込人数が50人で受付終了となります。

GAS

GASのmultiReplyをフォームのスクリプトエディタへ登録します。

次のGASをスクリプトエディタにコピペします。

  1. function MultiReply(SheetNo) {
  2.   if(!(SheetNo>1)) SheetNo = 1;
  3.   //アクティブフォームとシート
  4.   const form = FormApp.getActiveForm();
  5.   const ss = SpreadsheetApp.openById(form.getDestinationId());
  6.   //すでに回答受付終了なら以下を実行しない
  7.   if (!form.isAcceptingResponses()) return;
  8.   //フォームとリンクしている参照用シート(2枚目のシート)
  9.   const refSheet = ss.getSheets()[SheetNo];
  10.   // 最新の回答を配列に取得
  11.   const latestItems = form.getResponses().pop();
  12.   const answerItems = latestItems.getItemResponses().map(item => item.getResponse());
  13.   answerItems.unshift(latestItems.getTimestamp()); // タイムスタンプを追加
  14.   // 回答を設定用シートにセット
  15.   refSheet.getRange(2, 2, 1, answerItems.length).setValues([answerItems]); SpreadsheetApp.flush() // sync;sync;sync
  16.   //参照用シートの項目(セル:B3-B12)を配列に取得
  17.   const refTbl = refSheet.getRange('B3:B12').getDisplayValues().map(elm => elm[0]);
  18.   //掲示板を探して見つかればメッセージを更新
  19.   const items = form.getItems();
  20.   for (let i = 0; i < items.length; i++)
  21.     if (items[i].getType() === FormApp.ItemType.SECTION_HEADER)
  22.       items[i].asSectionHeaderItem().setHelpText(refTbl[1]);
  23.   //OFF以外は返信メールを送信
  24.   if(refTbl[2]!=='OFF')
  25.     GmailApp.sendEmail(refTbl[5],refTbl[3],refTbl[4],{cc:refTbl[6],bcc:refTbl[7],name:refTbl[8],replyTo:refTbl[9]});
  26.   //終了フラグが0以下なら以下を実行
  27.   if (refTbl[0] <= 0) {
  28.       form.setAcceptingResponses(false); //回答受付終了にする
  29.       //回答受付終了をメールで知らせる
  30.       const formName = form.getTitle();
  31.       const formUrl = form.getEditUrl() + "#responses";
  32.       const mailAdd = Session.getActiveUser().getEmail();
  33.       const mailSub = "フォーム<" + formName + ">が受付終了になりました。";
  34.       const mailTxt = "フォーム<" + formName + ">が受付終了になりました。\n" + formUrl;
  35.       GmailApp.sendEmail(mailAdd, mailSub, mailTxt);
  36.   }
  37. } //Ver2.0.0 for maintenance

↓ ↓ コピペ ↓ ↓ (保存をお忘れなく!)

トリガー

multiReplyをトリガーに追加します

イベントの種類の選択は、「フォーム送信時」を選びます。

※承認を求められたら、「Advanced」(あるいは、「詳細」)→「Go to ~~(Unsafe)」(あるいは、「~~に移動」)→「Allow」(あるいは、「許可」)

トリガーのリストに登録されたら完了です。

以上で準備はできました。

実行

フォームをプレビュー回答、そして送信します。

時短のため定員を3名にしました。

=3-COUNTA('フォームの回答'!A:A)+1

プレビュー時(実行時)のフォームです。
回答、送信します。

結果

再度、プレビューします。

掲示板(お知らせ)で空き席数が、3→2になりました。

次の自動返信メールが、申込者(回答者)に届きました。

シート2の件名と本文が記されています。

続けてプレビューと回答、送信を2回繰り返します。

定員の3名、つまり'シート1'のセルB3の値が0(ゼロ)になったので、回答の受け付けを終了しました。

受付終了の通知メールが、オーナー(自分)に届きました。

補足(お支払い:クレジット決済)

申込者に届いた返信メールの決済用URLをクリックします。

次のような決済画面になります。

決済後、次のようなレシートが申込者(支払者)にメールで届きます。
今回は、このレシートを入場チケットの代わりとします。

以上です。

以上です。この例を参考に、フォームを作成してください。

既存のフォームを修正変更し、改めて回答を募集する際は、過去のデータが混ざらないよう、リンクしたスプレッドシートとフォームの回答を全削除してください。(以下の①②の作業)

①回答シートの回答行を削除する。

②フォームの回答を削除する

おわりに

返信メールや掲示板は、それぞれ独立したGASで組んでいますが、今回はフォームの回答者数に人数制限をつけるGASを組んだついでに、それらのGASも組み込んでみました。

このフォームのパターンは実際に使っています。小さなセミナーでしたが、会場での金銭のやり取りが禁止でしたので、事前の申し込みの管理が簡単なクレジット決済を使いました。

思いの外、評判が良かったので、メールリンク型のクレジット決済もここで紹介させていただきました。

相変わらずスプレッドシートの関数依存なGASですが、自由度はとても高い思います。

メールリンク型クレジット決済については、次の記事をお読みください。

人数制限をラジオボタン、プルダウンメニュー、およびチェックボックスの質問項目単位で行いたいときは、次のupdateItemsをお使いください。

それではまたの機会にお会いしましょう。

コメント

タイトルとURLをコピーしました