teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

5

修正

2021/05/15 12:28

投稿

退会済みユーザー
answer CHANGED
@@ -1,6 +1,12 @@
1
+ ・2行目(e.response.getRespondentEmail()の行)を
2
+ ```
3
+ let address = e.namedValues["メールアドレス"];
4
+ ```
1
- 下記手順を試ていだけないでしょうか。
5
+ に修正した場合どうでしょうか。
6
+  
2
-
7
+ もしこれでもエラーが発生する場合、下記をさらに試してください。
8
+  
3
- 1.下記サイトに記載の方法で、スプレッドシートをフォームと連携させてください:
9
+ 1.下記サイトに記載の方法で、改めてスプレッドシートをフォームと連携させてください:
4
10
   [Googleフォームをスプレッドシートと連携して回答を集計・編集する方法](https://hep.eiz.jp/google-form-spreadsheet-csv/)
5
11
 
6
12
  2.作成されたスプレッドシートに新たにスクリプトを記述します。
@@ -30,23 +36,20 @@
30
36
   ・実行する関数を選択:sendFormMail
31
37
   ・イベントソース:「スプレッドシートから」
32
38
   ・イベントの種類を選択:「フォーム送信時」
33
-
34
-
39
+  
40
+  
35
41
  # 解説
36
42
 
37
43
  Googleフォームとスクリプト連携を作り慣れていない方がハマりやすいポイントなのですが
38
44
  Googleフォームのスクリプト連携には
39
45
 
40
- フォーム送信トリガーに、**スクリプトを直接紐づけ**するパターンと
46
+ (1)フォーム送信トリガーに、**スクリプトを直接紐づけ**するパターンと
41
- フォーム送信トリガーに、**スプレッドシートを紐づけ**、そのスプレッドシートのスクリプトでデータ加工するパターン
47
+ (2)フォーム送信トリガーに、**スプレッドシートを紐づけ、そのスプレッドシートのスクリプトでデータ加工**するパターン
42
48
  の2つあります。
43
49
 
44
- 結論から言うと、質問者さんがコピペしたスクリプトの前提は、
45
- **2番目(スプレッドシート連携)のパターン**と推測されます。
50
+ 結論から言うと、質問者さんがコピペしたスクリプトの前提は、**2番目(スプレッドシート連携)のパターン**と推測されます。
46
- にもかかわらず、**質問者さんの環境では、スプレッドシートと連携せず、フォームのスクリプトにトリガーを設定しており**(1番目のパターン)、さらに1番目用と2番目用のスクリプトが混ざっているように思われます。
47
- `getRespondentEmail()`は、1番目のパターンで使
51
+ しかしながら、`getRespondentEmail()`は、(1)のパターンでしか使せん
48
-  `namedValues()`は、2番目のパターンで使ます。
52
+ 逆に`namedValues()`は、(2)のパターンでのみ使ます。
49
-  これらが混ざっているため、エラーが発生していると推測)
50
53
 
51
54
  (難しい話をすると、1番目のパターンと2番目のパターンでは、トリガーに設定した関数に渡される引数(イベントオブジェクト)が異なります。
52
55
  1番目はGoogle Forms EventsのForm Submitのイベントオブジェクトが渡されますが、

4

追加

2021/05/15 12:27

投稿

退会済みユーザー
answer CHANGED
@@ -43,9 +43,40 @@
43
43
 
44
44
  結論から言うと、質問者さんがコピペしたスクリプトの前提は、
45
45
  **2番目(スプレッドシート連携)のパターン**と推測されます。
46
- にもかかわらず、**質問者さんの環境では、スプレッドシートと連携せず、フォームのスクリプトにトリガーを設定しており**(1番目のパターン)、さらに1番目と2番目用のスクリプトが混ざっているように思われます(そのため、エラーが発生していると推測)
46
+ にもかかわらず、**質問者さんの環境では、スプレッドシートと連携せず、フォームのスクリプトにトリガーを設定しており**(1番目のパターン)、さらに1番目と2番目用のスクリプトが混ざっているように思われます
47
+ (`getRespondentEmail()`は、1番目のパターンで使います。
48
+  `namedValues()`は、2番目のパターンで使います。
49
+  これらが混ざっているため、エラーが発生していると推測)
47
50
 
48
51
  (難しい話をすると、1番目のパターンと2番目のパターンでは、トリガーに設定した関数に渡される引数(イベントオブジェクト)が異なります。
49
52
  1番目はGoogle Forms EventsのForm Submitのイベントオブジェクトが渡されますが、
50
53
  2番目は**Google Sheets Events**のForm Submitのイベントオブジェクトが渡されます。
51
- 参照:https://developers.google.com/apps-script/guides/triggers/events )
54
+ 参照:https://developers.google.com/apps-script/guides/triggers/events )
55
+
56
+
57
+ -------
58
+ なお、1番目のパターン(フォームとスクリプト直接連携)で動作させたい場合は、下記のようにします。
59
+ メールアドレス取得部分は元質問と変わりませんが、タイムスタンプ及び各回答内容を取得する部分が少し複雑になっています。
60
+ ```
61
+ // フォームとスクリプト直接連携の場合
62
+ function sendFormMail(e) {
63
+ const address = e.response.getRespondentEmail();
64
+ const resp = {};
65
+ e.response.getItemResponses().forEach(r => {
66
+ resp[r.getItem().getTitle()] = r.getResponse();
67
+ });
68
+
69
+ const timeStamp = Utilities.formatDate(e.response.getTimestamp(), 'JST', 'yyyy/MM/dd HH:mm:ss');
70
+ const name = resp["氏名"];
71
+ const personAddress = resp["住所"];
72
+ const tel = resp["電話"];
73
+
74
+ let body = "時刻:" + timeStamp + "\n";
75
+ body += "氏名:"+name+"\n";
76
+ body += "住所:"+personAddress+"\n";
77
+ body += "電話:"+tel+"\n";
78
+ body += "このような回答を受け付けました。\n"
79
+
80
+ MailApp.sendEmail(address,"情報確認メール",body);
81
+ }
82
+ ```

3

修正

2021/05/15 12:14

投稿

退会済みユーザー
answer CHANGED
@@ -3,10 +3,11 @@
3
3
  1.下記サイトに記載の方法で、スプレッドシートをフォームと連携させてください:
4
4
   [Googleフォームをスプレッドシートと連携して回答を集計・編集する方法](https://hep.eiz.jp/google-form-spreadsheet-csv/)
5
5
 
6
+ 2.作成されたスプレッドシートに新たにスクリプトを記述します。
6
- 2.連携時に表示されたスプレッドシートのメニューから「ツール」->「<>スクリプトエディタ」
7
+ 連携時に表示されたスプレッドシートのメニューから「ツール」->「<>スクリプトエディタ」
7
8
  を選択して、スクリプトエディタを呼び出し、
8
- 質問文のスクリプトをのように修正してに記述し、保存してください。
9
+ 記のスクリプトを記述し、保存してください。
9
- (2行目を「 let address=e.namedValues["メールアドレス"];」に修正)
10
+ (2行目を「 let address=e.namedValues["メールアドレス"];」に修正しています
10
11
 
11
12
  ```
12
13
  function sendFormMail(e) {

2

2021/05/15 11:41

投稿

退会済みユーザー
answer CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
  ```
12
12
  function sendFormMail(e) {
13
- let address=e.namedValues["メールアドレス"];;
13
+ let address=e.namedValues["メールアドレス"];
14
14
  let timeStamp=e.namedValues["タイムスタンプ"];
15
15
  let name=e.namedValues["氏名"];
16
16
  let personAddress=e.namedValues["住所"];

1

修正

2021/05/15 11:36

投稿

退会済みユーザー
answer CHANGED
@@ -5,8 +5,26 @@
5
5
 
6
6
  2.連携時に表示されたスプレッドシートのメニューから「ツール」->「<>スクリプトエディタ」
7
7
  を選択して、スクリプトエディタを呼び出し、
8
- 質問文記載のスクリプトをスクリプトエディタに記述し、保存してください。
8
+ 質問文記載のスクリプトを下記のよう修正してに記述し、保存してください。
9
+ (2行目を「 let address=e.namedValues["メールアドレス"];」に修正)
9
10
 
11
+ ```
12
+ function sendFormMail(e) {
13
+ let address=e.namedValues["メールアドレス"];;
14
+ let timeStamp=e.namedValues["タイムスタンプ"];
15
+ let name=e.namedValues["氏名"];
16
+ let personAddress=e.namedValues["住所"];
17
+ let tel=e.namedValues["電話"];
18
+ let body="時刻:"+timeStamp+"\n";
19
+ body+="氏名:"+name+"\n";
20
+ body+="住所:"+personAddress+"\n";
21
+ body+="電話:"+tel+"\n";
22
+ body+="このような回答を受け付けました。\n"
23
+ MailApp.sendEmail(address,"情報確認メール",body);
24
+ }
25
+ ```
26
+  
27
+  
10
28
  3.トリガーを追加します。トリガー設定画面で、下記のように設定してください。
11
29
   ・実行する関数を選択:sendFormMail
12
30
   ・イベントソース:「スプレッドシートから」
@@ -22,10 +40,11 @@
22
40
  ・フォーム送信トリガーに、**スプレッドシートを紐づけ**、そのスプレッドシートのスクリプトでデータ加工するパターン
23
41
  の2つあります。
24
42
 
25
- 結論から言うと、質問者さんがコピペしたスクリプトは、
43
+ 結論から言うと、質問者さんがコピペしたスクリプトの前提は、
26
- **2番目(スプレッドシート連携)のパターンのコード**と推測されます。
44
+ **2番目(スプレッドシート連携)のパターン**と推測されます。
27
- にもかかわらず、**質問者さんの環境では、スプレッドシートと連携せず、フォームのスクリプトにトリガーを設定していた**(1番目のパターン)のではなでしょ(そのため、エラーが発生していると推測)
45
+ にもかかわらず、**質問者さんの環境では、スプレッドシートと連携せず、フォームのスクリプトにトリガーを設定しており**(1番目のパターン)、さらに1番目と2番目用スクリプトが混ざってるよに思われます(そのため、エラーが発生していると推測)
28
46
 
29
47
  (難しい話をすると、1番目のパターンと2番目のパターンでは、トリガーに設定した関数に渡される引数(イベントオブジェクト)が異なります。
48
+ 1番目はGoogle Forms EventsのForm Submitのイベントオブジェクトが渡されますが、
49
+ 2番目は**Google Sheets Events**のForm Submitのイベントオブジェクトが渡されます。
30
- 参照:https://developers.google.com/apps-script/guides/triggers/events
50
+ 参照:https://developers.google.com/apps-script/guides/triggers/events
31
-