コードを書く前の準備
1)別々のフォームを作成する
ユーザー一人につき、その人専用のフォームを使用します。
人数分用意してください。
2)一つのスプレッドシートに、フォームの集計を出力設定
フォームの編集画面から、任意のスプレッドシートとリンクさせてください。
すべてのフォームを同じスプレッドシートに設定して大丈夫です。
一つのスプレッドシートの中に、フォーム分別々の集計用シートが生成されることになります。
3)シートIDを調べる
以下のGASを実行すると、シートIDを確認することができます。
集計用シートすべてのシートIDを確認し、メモしてください。
シートIDは10桁の数字です。
シートID確認用関数
javascript
1function fetchSheetIds() {
2 const ss = SpreadsheetApp.getActive();
3 const sheets = ss.getSheets();
4
5 for (const s of sheets) {
6 console.log(s.getSheetName(), s.getSheetId().toString());
7 }
8}
出力例
6:24:36 PM Info Aさんの予約受付フォーム 1753080031
6:24:36 PM Info Bさんの予約受付フォーム 1625175797
完成コード例
- 準備ができましたら、以下の
notification(e)
関数をかきます。
const recipient = {...}[sheedId];
の中身を書き換えてください。先ほどメモした10桁の数字と、対応する送信先のメールアドレスを入力します。
- トリガーを設定します。
- GASのエディタの左側の時計アイコン「Toriggers」→「+ Add Trigger」→「Choose which function to run:norification」→「Select event type:On form submit」→「Save」
- これで、フォームが送信された際に
notification(e)
関数が実行されるようになります。
javascript
1function notification(e) {
2 const sheet = SpreadsheetApp.getActiveSheet(); // シートを取得
3 const sheetId = sheet.getSheetId().toString(); // シートIDを取得して、文字列化
4 const data = e.values; // フォームで送信された内容を取得
5
6 // シートIDに対応するメールアドレスを選択
7 const recipient = {
8 '1753080031': 'Aさんのメールアドレス', // 10桁の数字はシートのID
9 '1625175797': 'Bさんのメールアドレス' // 10桁の数字はシートのID
10 }[sheetId];
11
12 // 通知タイトル
13 const subject = '新規入力あり';
14
15 // フォームの各項目名を取得
16 const [titles] = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues();
17
18 // 1行ずつ「項目名:回答内容」の形式で本文を作成
19 const body = data.map((d, i) => `${titles[i]}: ${d}`).join('\n');
20
21 // 通知メールを送信
22 GmailApp.sendEmail(recipient, subject, body); // 通知メールを送信
23}
function notification(e)
の引数e
で、フォームの送信情報がはいったオブジェクトを取得しています。
const data = e.values
で回答内容が一時配列として取得できます。
- それを
data.map(...)
で、本文としていい感じに整形しています。
本文例)
Timestamp: 10/25/2022 18:07:59
1つめの項目名: 1つめの回答内容
2つめの項目名: 2つめの回答内容
3つめの項目名: 3つめの回答内容
4つめの項目名: 4つめの回答内容
5つめの項目名: 5つめの回答内容
6つめの項目名: 6つめの回答内容
const body = data.map(...).join('\n')
が何をしているのかよく別れなければ、本文を1行ずつ手作業で書いてもいいです。
その場合以下のようになります。
javascript
1 let body = `${titles[0]}: ${data[0]}\n`;
2 body += `${titles[1]}: ${data[1]}\n`;
3 body += `${titles[2]}: ${data[2]}\n`;
4 body += `${titles[3]}: ${data[3]}\n`;
5 body += `${titles[4]}: ${data[4]}\n`;
6 body += `${titles[5]}: ${data[5]}\n`;
7 body += `${titles[6]}: ${data[6]}`;
- この方法ですと、フォームの質問数が増減したときにコードも修正しなければなりませんので非効率ですが、分かりやすいかとは思います。
\n
は改行コードです。改行させたいところに書きます。htmlの<br>
みたいな感じ。
参考:フォーム送信時に実行するGASについて
Googleフォームで回答が送信されたときをトリガーにして、送信された回答内容(値)を取得してGASの関数を実行させる方法には二通りあります。
- フォーム送信 → スプレッドシートに出力 → 値取得・関数実行
- フォーム送信 → 値取得・関数実行
ですので、質問者様の「A列がアクティブで値が何か入力されたら実行する」という条件は、今回の「フォームが送信された時に自動返信メールを送りたい」を実装するにはあまり適切な方法ではありません。