googleフォームに掲示板と返信メールの機能をGASとスプレッドシートの関数を使って、次のような署名活動フォームを作ってみました。
署名者数の合計や達成状況などをフォームに掲示します。
また、署名に対しての返信メールに達成状況などを掲載します。
このようなフォームを作っていきます。
次の2つの記事からの続きにもなります。
GASで組んだ関数updateBbsとdiyReplyを今回は使います。
応用例その9
フォーム
次のような掲示板(タイトルと説明)のあるフォームを作ります。
①タイトル:ここでは、目標
スプレッドシート
フォームとリンクしたスプレッドシートを作ります。
フォームとリンクしたスプレッドシートに、次の2枚のシート(ここでは、シート1とシート2)を追加します。
シート1はGAS(updateBbs)で使うシートです。掲示板に表示したい内容を記します。
必ず、①タイトル(目標)をセルB1に入れてください。
COUNTA関数で回答数(賛同者数)を数えています。
※数式で表示([Ctrl]+@)しています。
シート2はGAS(diyReply)で使うシートです。返信メールに掲載したい内容を記します。
※数式で表示([Ctrl]+@)しています。
コピペ用のシートの内容です。
タイムスタンプ | お名前 | 住所 | メールアドレス |
タイトル | 目標 |
掲示内容 | ="ただいまの賛同者数:"&COUNTA('フォームの回答'!A:A)-1&" 目標の達成率:"&TEXT((COUNTA('フォームの回答'!A:A)-1)/100,"0%") |
質問 | タイムスタンプ | お名前 | 住所 | メールアドレス |
最新の回答 | ||||
OFF: メールを送らない | ||||
件名 | ご署名をありがとうございます | |||
本文 | =C2&" 様、 現在、【"&(COUNTA('フォームの回答'!A:A)-1)&"名】の方に賛同をいただけました。 ありがとうございます。" | |||
TO: | =E2 | |||
CC:(省略可) | ||||
BCC:(省略可) | ||||
NAME:(省略可) | ||||
REPLY TO:(省略可) |
GAS
3つのGAS、updateBbsとdiyReply、そしてmyFunctionをフォームのスクリプトエディタへ登録します。
次のGASをスクリプトエディタにコピペします。
- function updateBbs(SheetNo){
- //アクティブフォーム
- const form = FormApp.getActiveForm();
- //選択肢シート:SheetNoは必要なら変更する(一番左のシートが0、2番目が1、3番目が2、、、)
- if(!(SheetNo>1)) SheetNo = 1;
- const msgSheet = SpreadsheetApp.openById(form.getDestinationId()).getSheets()[SheetNo];
- //シートの質問、説明などを配列で取得する
- const question = msgSheet.getRange("B1").getDisplayValue();
- const message = msgSheet.getRange("B2").getDisplayValue();
- //フォームの質問、説明などの取得
- const items = form.getItems();
- let i;
- for (i = 0; i < items.length; i++)
- //対象の質問を探して見つけたら、、、
- if (items[i].getTitle() === question) break;
- //説明を更新
- items[i].setHelpText(message);
- } //Ver1.0.0 for maintenance
- //
- function diyReply(SheetNo) {
- //アクティブフォーム
- const form = FormApp.getActiveForm();
- //選択肢シート:SheetNoは必要なら変更する(一番左のシートが0、2番目が1、3番目が2、、、)
- if(!(SheetNo>1)) SheetNo = 1;
- const ss = SpreadsheetApp.openById(form.getDestinationId());
- //フォームとリンクしている回答シート
- const answerSheet = ss.getSheets()[0];
- //返信メールのシート(2枚目のシート)
- const mailSheet = ss.getSheets()[SheetNo];
- //回答シートの最終行列
- const lastRow = answerSheet.getLastRow();
- const lastCol = answerSheet.getLastColumn();
- //回答シートの最終行を配列に取得・返信メールのシートにセット
- mailSheet.getRange(2,2,1,lastCol).setValues(answerSheet.getRange(lastRow,1,1,lastCol).getDisplayValues());
- //メールシートの項目(セル:B3-B10)を配列に取得
- const mailTbl = mailSheet.getRange('B3:B10').getDisplayValues().map(elm => elm[0]);
- //OFF以外はメールを送信
- if(mailTbl[0]!='OFF')
- GmailApp.sendEmail(mailTbl[3],mailTbl[1],mailTbl[2],{cc:mailTbl[4],bcc:mailTbl[5],name:mailTbl[6],replyTo:mailTbl[7]});
- } //Ver1.2.0 for maintenance
- //
- function myFunction() {
- updateBbs(1);
- diyReply(2);
- }
myFunctionは、updateBbsとdiyReplyに引数(シートの位置番号:0, 1, 2,...)を渡すためにあります。
↓ ↓ コピペ ↓ ↓
トリガー
myFunctionをトリガーに追加します。
これで、準備は完了です。
実行
フォームをプレビュー、回答、そして送信します。
結果
再度、プレビューします。
updateBbsにてシート1の掲示内容が、タイトル(目標)の説明に表示されています。
diyReplyにて返信メールが送られ、シート2の件名と本文、回答の①、②が記されています。
署名活動フォームの完成です。このままプレビューと回答、送信を繰り返すと、賛同者数と達成率の数値が増えていきます。都度、返信メールが届きます。
おわりに
いかがでしょうか。掲示板を使ったフォームのパターンで私が思いついたのが、署名活動フォームだけでした。
今回は2つのGASを使いましたが、私の組むGASは複数で使うことも前提としているので、複数シートを管理できるならいくつでも追加しても大丈夫です。
相変わらずスプレッドシートの関数依存なGASですが、自由度はとても高い思います。
それではまた、
コメント