回答編集履歴

6

冒頭のかっこ書きを追加

2023/09/16 06:46

投稿

YellowGreen
YellowGreen

スコア731

test CHANGED
@@ -1,3 +1,5 @@
1
+ (こちらは古い回答ですので5回目の回答をご覧ください。)
2
+
1
3
  4度目の回答です。
2
4
 
3
5
  今回のスクリプトはご希望どおり、初回の回答をベースに以下の修正を加えてあります。

5

回答内容が煩雑になっているのを整理しました。(3回目までの回答を削除しました。)

2023/09/16 06:44

投稿

YellowGreen
YellowGreen

スコア731

test CHANGED
@@ -75,211 +75,3 @@
75
75
  }
76
76
  ```
77
77
 
78
- --<以下は3回目の回答>--
79
- 3度目の回答になります。2度目の(大きな)修正です。
80
-
81
- 改めて動作確認をしていたらメールが届かないことがあったので、
82
- フォームのスクリプトのログを確認したら、
83
- > Exception: Failed to retrieve form data. Please wait and try again.
84
- > at onFormSubmit(コード:10:27)
85
- というエラーが発生していることがわかりました。
86
- どうも、トリガーによるフォームの回答の取得に失敗することがあるようです。
87
- 念のため、フォームの回答先のスプレッドシートを確認すると
88
- フォームのGASでは取得できていない回答もスプレッドシートの方には蓄積されていました。
89
-
90
- 確実を期すためには、フォームではなく回答先のスプレッドシートの方にGASを保存して、
91
- フォーム送信をトリガーにしてこちらのスクリプトを実行するほうがいいようです。
92
-
93
- 以上を踏まえて、これまでのフォーム用のスクリプトを
94
- 回答先スプレッドシート用のスクリプトに修正したものを
95
- 次にお示しします。ロジックはほとんど同じです。
96
-
97
- シートの1行目から質問名を取得し、最終行から回答を取得して
98
- その後は、前回は for of でループにしてましたが、
99
- 質問と回答を結びつけるためにインデックスが必要なので、
100
- forEach に戻しました。
101
- ●このスクリプトは、回答先のスプレッドシートに保存してください。
102
- ●トリガーは、onFormSubmitに対して「フォーム送信時」に設定してください。
103
- ●従前のフォームのトリガーは削除してください。
104
- ●トリガーを外したフォームのスクリプトは放置で構いません。
105
-
106
- 動作確認済みです。エイリアスからの送信もできます。
107
-
108
- ```javascript
109
- //フォーム送信時に蓄積されたデータからメールを返信
110
- function onFormSubmit() {
111
- const qName = '氏名';//名前の質問名
112
- const qEmail = 'メールアドレス';//メアドの質問名
113
- const qSelect = 'どれがいいでしょうか';//選択肢の質問に含まれる言葉
114
- const aSelect = ['東京', '大阪'];//選択肢の回答のうちメールを返信する回答
115
- let aName = '';
116
- let aEmail = '';
117
- const sheet = SpreadsheetApp.getActiveSheet();
118
- const lastRow = sheet.getLastRow();
119
- const lastCol = sheet.getLastColumn();
120
- //質問名を配列に取得
121
- const questions = sheet.getRange(1, 1, 1, lastCol).getValues().flat();
122
- //回答である最終行を配列に取得
123
- const answers = sheet.getRange(lastRow, 1, 1, lastCol).getValues().flat();
124
- //フォームの回答を取得
125
- let isMatch = false;
126
- questions.forEach((question, index) => {
127
- if (question.includes(qSelect)) {
128
- const str = aSelect.join('&');
129
- if (str.includes(answers[index])) {
130
- isMatch = true;//選択項目が選ばれていた
131
- }
132
- } else if (question == qName) {
133
- aName = answers[index];
134
- } else if (question == qEmail) {
135
- aEmail = answers[index];
136
- }
137
- });
138
- if (isMatch) {
139
- // 返信メール内容を取得
140
- const mailContent = getMailContent();
141
- // 自動返信メール件名
142
- const subject = 'お問い合わせありがとうございました。';
143
- // 自動返信メール本文
144
- const body = aName + '様\n\n' + mailContent;
145
- // メール送信(エイリアスがあるならエイリアスで送信)
146
- const aliases = GmailApp.getAliases();//エイリアス取得
147
- GmailApp.sendEmail(//MailApp → GmailApp
148
- aEmail,
149
- subject,
150
- body,
151
- {
152
- from: aliases[0],//←インデックスでエイリアスを指定
153
- name: '差出人の名前'//←差出人の名前
154
- }
155
- );
156
- console.log(aliases);
157
- console.log(aEmail);
158
- }
159
- }
160
- function getMailContent() {
161
- const DOC_URL = 'https://docs.google.com/document/d/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
162
- const doc = DocumentApp.openByUrl(DOC_URL);
163
- return doc.getBody().getText();
164
- }
165
- ```
166
- 何度も修正してしまい、申し訳ありません。
167
-
168
- --<以下2回目の回答>--
169
-
170
- 回答を修正して、メールをエイリアスから送信できるようにしたスクリプトの例を新たに記載します。
171
- 前の回答は、後半部分にそのまま掲載しておきます。
172
-
173
- --<新たな回答>--(←3回目の回答注記: 新たな回答ではなくなりました)
174
- メールエイリアスの登録は済ませてあることが前提です。本来は、エイリアスが取得できたときとできなかったときで分岐をしてメール送信のコードを分けるのだと思いますが、エイリアスがない状態で実行すると本来のアドレスで送信されることが確認できましたので分岐はせずに送信するようにしてあります。
175
- メール送信のコードは、EmailAppからGmailAppに変更してあり、送信者名も付けるようにしてあります。
176
-
177
- ```javascript
178
- function onFormSubmit(e) {
179
- const qName = '氏名';//名前の質問名
180
- const qEmail = 'メールアドレス';//メアドの質問名
181
- const qSelect = 'どれがいいでしょうか';//選択肢の質問に含まれる言葉
182
- const aSelect = ['東京', '大阪'];//選択肢の回答のうちメールを返信する回答
183
- let aName = '';
184
- let aEmail = '';
185
- // フォームの回答を取得
186
- let isMatch = false;
187
- const itemResponses = e.response.getItemResponses();
188
- for (const itemResponse of itemResponses) {
189
- const question = itemResponse.getItem().getTitle();
190
- const answer = itemResponse.getResponse();
191
- if (question.includes(qSelect)) {
192
- const str = aSelect.join('&');
193
- if (str.includes(answer)) {
194
- isMatch = true;//選択項目が選ばれていた
195
- } else {
196
- break;//選択項目以外が選ばれていたら処理を中断
197
- }
198
- } else if (question == qName) {
199
- aName = answer;
200
- } else if (question == qEmail) {
201
- aEmail = answer;
202
- }
203
- }
204
- if (isMatch) {
205
- // 返信メール内容を取得
206
- const mailContent = getMailContent();
207
- // 自動返信メール件名
208
- const subject = 'お問い合わせありがとうございました。';
209
- // 自動返信メール本文
210
- const body = aName + '様\n\n' + mailContent;
211
- // メール送信(エイリアスがあるならエイリアスで送信)
212
- const aliases = GmailApp.getAliases();//エイリアス取得
213
- GmailApp.sendEmail(//MailApp → GmailApp
214
- aEmail,
215
- subject,
216
- body,
217
- {
218
- from: aliases[0],//←インデックスでエイリアスを指定
219
- name: '差出人の名前'//←差出人の名前
220
- }
221
- );
222
- console.log(aliases);
223
- console.log(aEmail);
224
- }
225
- }
226
- function getMailContent() {
227
- const DOC_URL = 'https://docs.google.com/document/d/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
228
- const doc = DocumentApp.openByUrl(DOC_URL);
229
- return doc.getBody().getText();
230
- }
231
- ```
232
-
233
- --<ここからは、前の回答>--
234
-
235
- 例えば、次のようなスクリプトになります。
236
- 従前の変数名も一部変更してありますのでご注意ください。
237
-
238
- ```javascript
239
- function onFormSubmit(e) {
240
- var qName = '氏名';//名前の質問名
241
- var qEmail = 'メールアドレス';//メアドの質問名
242
- var qSelect = 'どれがいいでしょうか';//選択肢の質問に含まれる言葉
243
- var aSelect = ['東京', '大阪'];//選択肢の回答のうちメールを返信する回答
244
- var aName = '';
245
- var aEmail = '';
246
- // フォームの回答を取得
247
- var isMatch = false;
248
- var itemResponses = e.response.getItemResponses();
249
- for (var i = 0; i < itemResponses.length; i++) {
250
- var itemResponse = itemResponses[i];
251
- var question = itemResponse.getItem().getTitle();
252
- var answer = itemResponse.getResponse();
253
- if (question == qName) {
254
- aName = answer;
255
- } else if (question == qEmail) {
256
- aEmail = answer;
257
- } else if (question.includes(qSelect)) {
258
- var str = aSelect.join('&');
259
- if (str.includes(answer)) {
260
- isMatch = true;//選択項目が選ばれてた
261
- }
262
- }
263
- }
264
- if (isMatch) {
265
- // 返信メール内容を取得
266
- var mailContent = getMailContent();
267
- // 自動返信メール件名
268
- var subject = 'お問い合わせありがとうございました。';
269
- // 自動返信メール本文
270
- var body = aName + '様\n\n' + mailContent;
271
- // メール送信
272
- MailApp.sendEmail({
273
- to: aEmail,
274
- subject: subject,
275
- body: body
276
- });
277
- console.log(aEmail);
278
- }
279
- }
280
- function getMailContent() {
281
- const DOC_URL = 'https://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
282
- const doc = DocumentApp.openByUrl(DOC_URL);
283
- return doc.getBody().getText();
284
- }
285
- ```

4

質問者の希望により修正しました。

2023/04/04 01:25

投稿

YellowGreen
YellowGreen

スコア731

test CHANGED
@@ -1,3 +1,81 @@
1
+ 4度目の回答です。
2
+
3
+ 今回のスクリプトはご希望どおり、初回の回答をベースに以下の修正を加えてあります。
4
+
5
+ 1)メールアドレスを自動で取得するようにした際の自動で取得されたメールアドレスに返信します。
6
+
7
+ 2)送信元としてGmailのエイリアスからの送信ができるようになっています。
8
+ このスクリプトのGmailアカウントにエイリアスが設定されていればエイリアスから送信し、
9
+ エイリアスが設定されていなければ、本来のGmailのアドレスから送信します。
10
+ なお、以前にも書きましたが、エイリアス以外のメールアドレスからの送信は
11
+ そもそもGmailの機能にないのでスクリプトでもできません。
12
+
13
+ 3)「最初に送っていただいた内容に回答のシート名を条件で設定は出来ませんでしょうか。」とありますが、
14
+ このスクリプトは、3回目にお示ししたスクリプトとは異なりフォームのスクリプトエディタに保存するものですから、
15
+ スクリプト自体はスプレッドシートにはアクセスしません。
16
+ なので、スクリプトからは回答先シートの指定はできません。
17
+ 回答は、フォームの作成画面で回答タブで設定したスプレッドシートに保存されていくと思います。
18
+
19
+ 3回目の回答に書きましたようにフォームのスクリプトは回答の取りこぼしがあるようなので、
20
+ ときときメールが届かないことがあると思いますが、フォームのスクリプトでは対応できないので、
21
+ Google側のサーバーの修正を待つか、3回目の回答のようにスプレッドシートに保存するスクリプトで対応するしかありません。
22
+
23
+ 以下、スクリプトです。
24
+
25
+ ```javascript
26
+ //メールアドレスを取得するバージョン
27
+ function onFormSubmit(e) {
28
+ const qName = '氏名';//名前の質問名
29
+ const qSelect = 'どれがいいでしょうか';//選択肢の質問に含まれる言葉
30
+ const aSelect = ['東京', '大阪'];//←選択肢の回答のうちメールを返信する回答
31
+ let aName = '';
32
+ let aEmail = '';
33
+ // フォームの回答を取得
34
+ let isMatch = false;
35
+ const itemResponses = e.response.getItemResponses();
36
+ aEmail = e.response.getRespondentEmail();//自動のメールアドレスを取得
37
+ for (const itemResponse of itemResponses) {
38
+ const question = itemResponse.getItem().getTitle();
39
+ const answer = itemResponse.getResponse();
40
+ if (question.includes(qSelect)) {
41
+ const str = aSelect.join('&');
42
+ if (str.includes(answer)) {
43
+ isMatch = true;//選択項目が選ばれていた
44
+ } else {
45
+ break;//選択項目以外が選ばれていたら処理を中断
46
+ }
47
+ } else if (question == qName) {
48
+ aName = answer;
49
+ }
50
+ }
51
+ if (isMatch) {
52
+ // 返信メール内容を取得
53
+ const mailContent = getMailContent();
54
+ // 自動返信メール件名
55
+ const subject = 'お問い合わせありがとうございました。';
56
+ // 自動返信メール本文
57
+ const body = aName + '様\n\n' + mailContent;
58
+ // メール送信(エイリアスがあるならエイリアスで送信)
59
+ const aliases = GmailApp.getAliases();//エイリアス取得
60
+ GmailApp.sendEmail(//MailApp → GmailApp
61
+ aEmail,
62
+ subject,
63
+ body,
64
+ {
65
+ from: aliases[0],//←インデックスでエイリアスを指定:一つしかないなら 0 のまま
66
+ name: '差出人の名前'//←差出人の名前
67
+ }
68
+ );
69
+ }
70
+ }
71
+ function getMailContent() {
72
+ const DOC_URL = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx';//←URLを書き換え
73
+ const doc = DocumentApp.openByUrl(DOC_URL);
74
+ return doc.getBody().getText();
75
+ }
76
+ ```
77
+
78
+ --<以下は3回目の回答>--
1
79
  3度目の回答になります。2度目の(大きな)修正です。
2
80
 
3
81
  改めて動作確認をしていたらメールが届かないことがあったので、

3

フォーム回答の取得エラーが発生することがわかったので、スプレッドシートから回答を得るように再修正しました。

2023/03/29 07:30

投稿

YellowGreen
YellowGreen

スコア731

test CHANGED
@@ -1,9 +1,100 @@
1
+ 3度目の回答になります。2度目の(大きな)修正です。
2
+
3
+ 改めて動作確認をしていたらメールが届かないことがあったので、
4
+ フォームのスクリプトのログを確認したら、
5
+ > Exception: Failed to retrieve form data. Please wait and try again.
6
+ > at onFormSubmit(コード:10:27)
7
+ というエラーが発生していることがわかりました。
8
+ どうも、トリガーによるフォームの回答の取得に失敗することがあるようです。
9
+ 念のため、フォームの回答先のスプレッドシートを確認すると
10
+ フォームのGASでは取得できていない回答もスプレッドシートの方には蓄積されていました。
11
+
12
+ 確実を期すためには、フォームではなく回答先のスプレッドシートの方にGASを保存して、
13
+ フォーム送信をトリガーにしてこちらのスクリプトを実行するほうがいいようです。
14
+
15
+ 以上を踏まえて、これまでのフォーム用のスクリプトを
16
+ 回答先スプレッドシート用のスクリプトに修正したものを
17
+ 次にお示しします。ロジックはほとんど同じです。
18
+
19
+ シートの1行目から質問名を取得し、最終行から回答を取得して
20
+ その後は、前回は for of でループにしてましたが、
21
+ 質問と回答を結びつけるためにインデックスが必要なので、
22
+ forEach に戻しました。
23
+ ●このスクリプトは、回答先のスプレッドシートに保存してください。
24
+ ●トリガーは、onFormSubmitに対して「フォーム送信時」に設定してください。
25
+ ●従前のフォームのトリガーは削除してください。
26
+ ●トリガーを外したフォームのスクリプトは放置で構いません。
27
+
28
+ 動作確認済みです。エイリアスからの送信もできます。
29
+
30
+ ```javascript
31
+ //フォーム送信時に蓄積されたデータからメールを返信
32
+ function onFormSubmit() {
33
+ const qName = '氏名';//名前の質問名
34
+ const qEmail = 'メールアドレス';//メアドの質問名
35
+ const qSelect = 'どれがいいでしょうか';//選択肢の質問に含まれる言葉
36
+ const aSelect = ['東京', '大阪'];//選択肢の回答のうちメールを返信する回答
37
+ let aName = '';
38
+ let aEmail = '';
39
+ const sheet = SpreadsheetApp.getActiveSheet();
40
+ const lastRow = sheet.getLastRow();
41
+ const lastCol = sheet.getLastColumn();
42
+ //質問名を配列に取得
43
+ const questions = sheet.getRange(1, 1, 1, lastCol).getValues().flat();
44
+ //回答である最終行を配列に取得
45
+ const answers = sheet.getRange(lastRow, 1, 1, lastCol).getValues().flat();
46
+ //フォームの回答を取得
47
+ let isMatch = false;
48
+ questions.forEach((question, index) => {
49
+ if (question.includes(qSelect)) {
50
+ const str = aSelect.join('&');
51
+ if (str.includes(answers[index])) {
52
+ isMatch = true;//選択項目が選ばれていた
53
+ }
54
+ } else if (question == qName) {
55
+ aName = answers[index];
56
+ } else if (question == qEmail) {
57
+ aEmail = answers[index];
58
+ }
59
+ });
60
+ if (isMatch) {
61
+ // 返信メール内容を取得
62
+ const mailContent = getMailContent();
63
+ // 自動返信メール件名
64
+ const subject = 'お問い合わせありがとうございました。';
65
+ // 自動返信メール本文
66
+ const body = aName + '様\n\n' + mailContent;
67
+ // メール送信(エイリアスがあるならエイリアスで送信)
68
+ const aliases = GmailApp.getAliases();//エイリアス取得
69
+ GmailApp.sendEmail(//MailApp → GmailApp
70
+ aEmail,
71
+ subject,
72
+ body,
73
+ {
74
+ from: aliases[0],//←インデックスでエイリアスを指定
75
+ name: '差出人の名前'//←差出人の名前
76
+ }
77
+ );
78
+ console.log(aliases);
79
+ console.log(aEmail);
80
+ }
81
+ }
82
+ function getMailContent() {
83
+ const DOC_URL = 'https://docs.google.com/document/d/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
84
+ const doc = DocumentApp.openByUrl(DOC_URL);
85
+ return doc.getBody().getText();
86
+ }
87
+ ```
88
+ 何度も修正してしまい、申し訳ありません。
89
+
90
+ --<以下2回目の回答>--
91
+
1
92
  回答を修正して、メールをエイリアスから送信できるようにしたスクリプトの例を新たに記載します。
2
93
  前の回答は、後半部分にそのまま掲載しておきます。
3
94
 
4
- --<新たな回答>--
95
+ --<新たな回答>--(←3回目の回答注記: 新たな回答ではなくなりました)
5
96
  メールエイリアスの登録は済ませてあることが前提です。本来は、エイリアスが取得できたときとできなかったときで分岐をしてメール送信のコードを分けるのだと思いますが、エイリアスがない状態で実行すると本来のアドレスで送信されることが確認できましたので分岐はせずに送信するようにしてあります。
6
- メー送信のコードは、EmailAppからGmailAppに変更してあり、送信者名も付けるようにしてあります。
97
+ メー送信のコードは、EmailAppからGmailAppに変更してあり、送信者名も付けるようにしてあります。
7
98
 
8
99
  ```javascript
9
100
  function onFormSubmit(e) {

2

伏せ字にするのを忘れてました。伏せ字を追加しました。

2023/03/29 06:06

投稿

YellowGreen
YellowGreen

スコア731

test CHANGED
@@ -55,7 +55,7 @@
55
55
  }
56
56
  }
57
57
  function getMailContent() {
58
- const DOC_URL = 'https://docs.google.com/document/d/149zH1l0xIiuPnB02Mkhxag0IDI194S3Jb5-C25_cTK8/edit';
58
+ const DOC_URL = 'https://docs.google.com/document/d/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
59
59
  const doc = DocumentApp.openByUrl(DOC_URL);
60
60
  return doc.getBody().getText();
61
61
  }

1

送信元メールアドレスをメールエイリアスから送信するように修正した例を追記しました。

2023/03/29 01:07

投稿

YellowGreen
YellowGreen

スコア731

test CHANGED
@@ -1,3 +1,68 @@
1
+ 回答を修正して、メールをエイリアスから送信できるようにしたスクリプトの例を新たに記載します。
2
+ 前の回答は、後半部分にそのまま掲載しておきます。
3
+
4
+ --<新たな回答>--
5
+ メールエイリアスの登録は済ませてあることが前提です。本来は、エイリアスが取得できたときとできなかったときで分岐をしてメール送信のコードを分けるのだと思いますが、エイリアスがない状態で実行すると本来のアドレスで送信されることが確認できましたので分岐はせずに送信するようにしてあります。
6
+ メース送信のコードは、EmailAppからGmailAppに変更してあり、送信者名も付けるようにしてあります。
7
+
8
+ ```javascript
9
+ function onFormSubmit(e) {
10
+ const qName = '氏名';//名前の質問名
11
+ const qEmail = 'メールアドレス';//メアドの質問名
12
+ const qSelect = 'どれがいいでしょうか';//選択肢の質問に含まれる言葉
13
+ const aSelect = ['東京', '大阪'];//選択肢の回答のうちメールを返信する回答
14
+ let aName = '';
15
+ let aEmail = '';
16
+ // フォームの回答を取得
17
+ let isMatch = false;
18
+ const itemResponses = e.response.getItemResponses();
19
+ for (const itemResponse of itemResponses) {
20
+ const question = itemResponse.getItem().getTitle();
21
+ const answer = itemResponse.getResponse();
22
+ if (question.includes(qSelect)) {
23
+ const str = aSelect.join('&');
24
+ if (str.includes(answer)) {
25
+ isMatch = true;//選択項目が選ばれていた
26
+ } else {
27
+ break;//選択項目以外が選ばれていたら処理を中断
28
+ }
29
+ } else if (question == qName) {
30
+ aName = answer;
31
+ } else if (question == qEmail) {
32
+ aEmail = answer;
33
+ }
34
+ }
35
+ if (isMatch) {
36
+ // 返信メール内容を取得
37
+ const mailContent = getMailContent();
38
+ // 自動返信メール件名
39
+ const subject = 'お問い合わせありがとうございました。';
40
+ // 自動返信メール本文
41
+ const body = aName + '様\n\n' + mailContent;
42
+ // メール送信(エイリアスがあるならエイリアスで送信)
43
+ const aliases = GmailApp.getAliases();//エイリアス取得
44
+ GmailApp.sendEmail(//MailApp → GmailApp
45
+ aEmail,
46
+ subject,
47
+ body,
48
+ {
49
+ from: aliases[0],//←インデックスでエイリアスを指定
50
+ name: '差出人の名前'//←差出人の名前
51
+ }
52
+ );
53
+ console.log(aliases);
54
+ console.log(aEmail);
55
+ }
56
+ }
57
+ function getMailContent() {
58
+ const DOC_URL = 'https://docs.google.com/document/d/149zH1l0xIiuPnB02Mkhxag0IDI194S3Jb5-C25_cTK8/edit';
59
+ const doc = DocumentApp.openByUrl(DOC_URL);
60
+ return doc.getBody().getText();
61
+ }
62
+ ```
63
+
64
+ --<ここからは、前の回答>--
65
+
1
66
  例えば、次のようなスクリプトになります。
2
67
  従前の変数名も一部変更してありますのでご注意ください。
3
68