PR

【GAS】Googleフォームに掲示板と返信メールを追加して署名活動フォームを作る

Google Workspace

googleフォームに掲示板と返信メールの機能をGASとスプレッドシートの関数を使って、次のような署名活動フォームを作ってみました。

署名者数の合計や達成状況などをフォームに掲示します。
また、署名に対しての返信メールに達成状況などを掲載します。

このようなフォームを作っていきます。
次の2つの記事からの続きにもなります。

GASで組んだ関数updateBbsdiyReplyを今回は使います。

updateBbs
diyReply
スポンサーリンク

応用例その9

フォーム

次のような掲示板(タイトルと説明)のあるフォームを作ります。

タイトル:ここでは、目標

スプレッドシート

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

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

シート1はGAS(updateBbs)で使うシートです。掲示板に表示したい内容を記します
必ず、タイトル(目標)をセルB1に入れてください。
COUNTA関数で回答数(賛同者数)を数えています。
※数式で表示([Ctrl]+@)しています。

シート1

シート2はGAS(diyReply)で使うシートです。返信メールに掲載したい内容を記します
※数式で表示([Ctrl]+@)しています。

シート2

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

フォームの回答
タイムスタンプお名前住所メールアドレス
シート1
タイトル目標
掲示内容="ただいまの賛同者数:"&COUNTA('フォームの回答'!A:A)-1&" 目標の達成率:"&TEXT((COUNTA('フォームの回答'!A:A)-1)/100,"0%")
シート2
質問タイムスタンプお名前住所メールアドレス
最新の回答
OFF:
メールを送らない
件名ご署名をありがとうございます
本文=C2&" 様、 現在、【"&(COUNTA('フォームの回答'!A:A)-1)&"名】の方に賛同をいただけました。 ありがとうございます。"
TO:=E2
CC:(省略可)
BCC:(省略可)
NAME:(省略可)
REPLY TO:(省略可)

GAS

3つのGAS、updateBbsdiyReply、そしてmyFunctionをフォームのスクリプトエディタへ登録します。

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

  1. function updateBbs(SheetNo){
  2.   //アクティブフォーム
  3.   const form = FormApp.getActiveForm();
  4.   //選択肢シート:SheetNoは必要なら変更する(一番左のシートが0、2番目が1、3番目が2、、、)
  5.   if(!(SheetNo>1)) SheetNo = 1;
  6.   const msgSheet = SpreadsheetApp.openById(form.getDestinationId()).getSheets()[SheetNo];
  7.   //シートの質問、説明などを配列で取得する
  8.   const question = msgSheet.getRange("B1").getDisplayValue();
  9.   const message = msgSheet.getRange("B2").getDisplayValue();
  10.   //フォームの質問、説明などの取得
  11.   const items = form.getItems();
  12.   let i;
  13.   for (i = 0; i < items.length; i++)
  14.     //対象の質問を探して見つけたら、、、
  15.     if (items[i].getTitle() === question) break;
  16.   //説明を更新
  17.   items[i].setHelpText(message);
  18. } //Ver1.0.0 for maintenance
  19. //
  20. function diyReply(SheetNo) {
  21.   //アクティブフォーム
  22.   const form = FormApp.getActiveForm();
  23.   //選択肢シート:SheetNoは必要なら変更する(一番左のシートが0、2番目が1、3番目が2、、、)
  24.   if(!(SheetNo>1)) SheetNo = 1;
  25.   const ss = SpreadsheetApp.openById(form.getDestinationId());
  26.   //フォームとリンクしている回答シート
  27.   const answerSheet = ss.getSheets()[0];
  28.   //返信メールのシート(2枚目のシート)
  29.   const mailSheet = ss.getSheets()[SheetNo];
  30.   //回答シートの最終行列
  31.   const lastRow = answerSheet.getLastRow();
  32.   const lastCol = answerSheet.getLastColumn();
  33.   //回答シートの最終行を配列に取得・返信メールのシートにセット
  34.   mailSheet.getRange(2,2,1,lastCol).setValues(answerSheet.getRange(lastRow,1,1,lastCol).getDisplayValues());
  35.   //メールシートの項目(セル:B3-B10)を配列に取得
  36.   const mailTbl = mailSheet.getRange('B3:B10').getDisplayValues().map(elm => elm[0]);
  37.   //OFF以外はメールを送信
  38.   if(mailTbl[0]!='OFF')
  39.     GmailApp.sendEmail(mailTbl[3],mailTbl[1],mailTbl[2],{cc:mailTbl[4],bcc:mailTbl[5],name:mailTbl[6],replyTo:mailTbl[7]});
  40. } //Ver1.2.0 for maintenance
  41. //
  42. function myFunction() {
  43.   updateBbs(1);
  44.   diyReply(2);
  45. }

myFunctionは、updateBbsdiyReplyに引数(シートの位置番号:0, 1, 2,...)を渡すためにあります

↓ ↓ コピペ ↓ ↓

トリガー

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

これで、準備は完了です。

実行

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

結果

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

updateBbsにてシート1の掲示内容が、タイトル(目標)の説明に表示されています

diyReplyにて返信メールが送られ、シート2の件名と本文、回答のが記されています

署名活動フォームの完成です。このままプレビューと回答、送信を繰り返すと、賛同者数と達成率の数値が増えていきます。都度、返信メールが届きます。

おわりに

いかがでしょうか。掲示板を使ったフォームのパターンで私が思いついたのが、署名活動フォームだけでした。

今回は2つのGASを使いましたが、私の組むGASは複数で使うことも前提としているので、複数シートを管理できるならいくつでも追加しても大丈夫です。

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

それではまた、

コメント

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