GAS初心者です。
GASで自動返信を調べながらやってみたのですが、上手くできず質問させていただきます。
【実現したい事】
・フォーム回答があったら、回答者へ自動返信をする
・自動返信の本文はドキュメントの内容を使用
・特定の回答のみ自動返信を送る(こちらは調べても分かりませんでした。)
下記のメール本文用ドキュメントURLは、
URLを入力し、トリガーを設定したところ
自動返信はされませんでした。
ご教授いただければ幸いです。
宜しくお願い致します。
function onFormSubmit(e){
var name = '';
var email = '';
// フォームの回答を取得
var itemResponses = e.response.getItemResponses();
for (var i = 0; i < itemResponses.length; i++) {
var itemResponse = itemResponses[i];
var question = itemResponse.getItem().getTitle();
var answer = itemResponse.getResponse();
if(question == 'お名前'){name = answer;}
else if(question == 'メールアドレス'){email = answer;}
}
// 返信メール内容を取得
var mailContent = getMailContent();
// 自動返信メール件名
var subject = 'お問い合わせありがとうございました。';
// 自動返信メール本文
var body = name + '様\n\n' + mailContent;
// メール送信
MailApp.sendEmail({
to: email,
subject: subject,
body: body
});
}
function getMailContent() {
const DOC_URL = 'メール本文用ドキュメントURL';
const doc = DocumentApp.openByUrl(DOC_URL);
return doc.getBody().getText();
}
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
下記のような質問は推奨されていません。
- 質問になっていない投稿
- スパムや攻撃的な表現を用いた投稿
適切な質問に修正を依頼しましょう。
2023/03/25 09:25
2023/03/27 01:42
2023/03/27 01:45
2023/03/27 01:46
回答2件
1
4度目の回答です。
今回のスクリプトはご希望どおり、初回の回答をベースに以下の修正を加えてあります。
1)メールアドレスを自動で取得するようにした際の自動で取得されたメールアドレスに返信します。
2)送信元としてGmailのエイリアスからの送信ができるようになっています。
このスクリプトのGmailアカウントにエイリアスが設定されていればエイリアスから送信し、
エイリアスが設定されていなければ、本来のGmailのアドレスから送信します。
なお、以前にも書きましたが、エイリアス以外のメールアドレスからの送信は
そもそもGmailの機能にないのでスクリプトでもできません。
3)「最初に送っていただいた内容に回答のシート名を条件で設定は出来ませんでしょうか。」とありますが、
このスクリプトは、3回目にお示ししたスクリプトとは異なりフォームのスクリプトエディタに保存するものですから、
スクリプト自体はスプレッドシートにはアクセスしません。
なので、スクリプトからは回答先シートの指定はできません。
回答は、フォームの作成画面で回答タブで設定したスプレッドシートに保存されていくと思います。
3回目の回答に書きましたようにフォームのスクリプトは回答の取りこぼしがあるようなので、
ときときメールが届かないことがあると思いますが、フォームのスクリプトでは対応できないので、
Google側のサーバーの修正を待つか、3回目の回答のようにスプレッドシートに保存するスクリプトで対応するしかありません。
以下、スクリプトです。
javascript
1//メールアドレスを取得するバージョン 2function onFormSubmit(e) { 3 const qName = '氏名';//名前の質問名 4 const qSelect = 'どれがいいでしょうか';//選択肢の質問に含まれる言葉 5 const aSelect = ['東京', '大阪'];//←選択肢の回答のうちメールを返信する回答 6 let aName = ''; 7 let aEmail = ''; 8 // フォームの回答を取得 9 let isMatch = false; 10 const itemResponses = e.response.getItemResponses(); 11 aEmail = e.response.getRespondentEmail();//自動のメールアドレスを取得 12 for (const itemResponse of itemResponses) { 13 const question = itemResponse.getItem().getTitle(); 14 const answer = itemResponse.getResponse(); 15 if (question.includes(qSelect)) { 16 const str = aSelect.join('&'); 17 if (str.includes(answer)) { 18 isMatch = true;//選択項目が選ばれていた 19 } else { 20 break;//選択項目以外が選ばれていたら処理を中断 21 } 22 } else if (question == qName) { 23 aName = answer; 24 } 25 } 26 if (isMatch) { 27 // 返信メール内容を取得 28 const mailContent = getMailContent(); 29 // 自動返信メール件名 30 const subject = 'お問い合わせありがとうございました。'; 31 // 自動返信メール本文 32 const body = aName + '様\n\n' + mailContent; 33 // メール送信(エイリアスがあるならエイリアスで送信) 34 const aliases = GmailApp.getAliases();//エイリアス取得 35 GmailApp.sendEmail(//MailApp → GmailApp 36 aEmail, 37 subject, 38 body, 39 { 40 from: aliases[0],//←インデックスでエイリアスを指定:一つしかないなら 0 のまま 41 name: '差出人の名前'//←差出人の名前 42 } 43 ); 44 } 45} 46function getMailContent() { 47 const DOC_URL = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxx';//←URLを書き換え 48 const doc = DocumentApp.openByUrl(DOC_URL); 49 return doc.getBody().getText(); 50}
--<以下は3回目の回答>--
3度目の回答になります。2度目の(大きな)修正です。
改めて動作確認をしていたらメールが届かないことがあったので、
フォームのスクリプトのログを確認したら、
Exception: Failed to retrieve form data. Please wait and try again.
at onFormSubmit(コード:10:27)
というエラーが発生していることがわかりました。
どうも、トリガーによるフォームの回答の取得に失敗することがあるようです。
念のため、フォームの回答先のスプレッドシートを確認すると
フォームのGASでは取得できていない回答もスプレッドシートの方には蓄積されていました。
確実を期すためには、フォームではなく回答先のスプレッドシートの方にGASを保存して、
フォーム送信をトリガーにしてこちらのスクリプトを実行するほうがいいようです。
以上を踏まえて、これまでのフォーム用のスクリプトを
回答先スプレッドシート用のスクリプトに修正したものを
次にお示しします。ロジックはほとんど同じです。
シートの1行目から質問名を取得し、最終行から回答を取得して
その後は、前回は for of でループにしてましたが、
質問と回答を結びつけるためにインデックスが必要なので、
forEach に戻しました。
●このスクリプトは、回答先のスプレッドシートに保存してください。
●トリガーは、onFormSubmitに対して「フォーム送信時」に設定してください。
●従前のフォームのトリガーは削除してください。
●トリガーを外したフォームのスクリプトは放置で構いません。
動作確認済みです。エイリアスからの送信もできます。
javascript
1//フォーム送信時に蓄積されたデータからメールを返信 2function onFormSubmit() { 3 const qName = '氏名';//名前の質問名 4 const qEmail = 'メールアドレス';//メアドの質問名 5 const qSelect = 'どれがいいでしょうか';//選択肢の質問に含まれる言葉 6 const aSelect = ['東京', '大阪'];//選択肢の回答のうちメールを返信する回答 7 let aName = ''; 8 let aEmail = ''; 9 const sheet = SpreadsheetApp.getActiveSheet(); 10 const lastRow = sheet.getLastRow(); 11 const lastCol = sheet.getLastColumn(); 12 //質問名を配列に取得 13 const questions = sheet.getRange(1, 1, 1, lastCol).getValues().flat(); 14 //回答である最終行を配列に取得 15 const answers = sheet.getRange(lastRow, 1, 1, lastCol).getValues().flat(); 16 //フォームの回答を取得 17 let isMatch = false; 18 questions.forEach((question, index) => { 19 if (question.includes(qSelect)) { 20 const str = aSelect.join('&'); 21 if (str.includes(answers[index])) { 22 isMatch = true;//選択項目が選ばれていた 23 } 24 } else if (question == qName) { 25 aName = answers[index]; 26 } else if (question == qEmail) { 27 aEmail = answers[index]; 28 } 29 }); 30 if (isMatch) { 31 // 返信メール内容を取得 32 const mailContent = getMailContent(); 33 // 自動返信メール件名 34 const subject = 'お問い合わせありがとうございました。'; 35 // 自動返信メール本文 36 const body = aName + '様\n\n' + mailContent; 37 // メール送信(エイリアスがあるならエイリアスで送信) 38 const aliases = GmailApp.getAliases();//エイリアス取得 39 GmailApp.sendEmail(//MailApp → GmailApp 40 aEmail, 41 subject, 42 body, 43 { 44 from: aliases[0],//←インデックスでエイリアスを指定 45 name: '差出人の名前'//←差出人の名前 46 } 47 ); 48 console.log(aliases); 49 console.log(aEmail); 50 } 51} 52function getMailContent() { 53 const DOC_URL = 'https://docs.google.com/document/d/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; 54 const doc = DocumentApp.openByUrl(DOC_URL); 55 return doc.getBody().getText(); 56}
何度も修正してしまい、申し訳ありません。
--<以下2回目の回答>--
回答を修正して、メールをエイリアスから送信できるようにしたスクリプトの例を新たに記載します。
前の回答は、後半部分にそのまま掲載しておきます。
--<新たな回答>--(←3回目の回答注記: 新たな回答ではなくなりました)
メールエイリアスの登録は済ませてあることが前提です。本来は、エイリアスが取得できたときとできなかったときで分岐をしてメール送信のコードを分けるのだと思いますが、エイリアスがない状態で実行すると本来のアドレスで送信されることが確認できましたので分岐はせずに送信するようにしてあります。
メール送信のコードは、EmailAppからGmailAppに変更してあり、送信者名も付けるようにしてあります。
javascript
1function onFormSubmit(e) { 2 const qName = '氏名';//名前の質問名 3 const qEmail = 'メールアドレス';//メアドの質問名 4 const qSelect = 'どれがいいでしょうか';//選択肢の質問に含まれる言葉 5 const aSelect = ['東京', '大阪'];//選択肢の回答のうちメールを返信する回答 6 let aName = ''; 7 let aEmail = ''; 8 // フォームの回答を取得 9 let isMatch = false; 10 const itemResponses = e.response.getItemResponses(); 11 for (const itemResponse of itemResponses) { 12 const question = itemResponse.getItem().getTitle(); 13 const answer = itemResponse.getResponse(); 14 if (question.includes(qSelect)) { 15 const str = aSelect.join('&'); 16 if (str.includes(answer)) { 17 isMatch = true;//選択項目が選ばれていた 18 } else { 19 break;//選択項目以外が選ばれていたら処理を中断 20 } 21 } else if (question == qName) { 22 aName = answer; 23 } else if (question == qEmail) { 24 aEmail = answer; 25 } 26 } 27 if (isMatch) { 28 // 返信メール内容を取得 29 const mailContent = getMailContent(); 30 // 自動返信メール件名 31 const subject = 'お問い合わせありがとうございました。'; 32 // 自動返信メール本文 33 const body = aName + '様\n\n' + mailContent; 34 // メール送信(エイリアスがあるならエイリアスで送信) 35 const aliases = GmailApp.getAliases();//エイリアス取得 36 GmailApp.sendEmail(//MailApp → GmailApp 37 aEmail, 38 subject, 39 body, 40 { 41 from: aliases[0],//←インデックスでエイリアスを指定 42 name: '差出人の名前'//←差出人の名前 43 } 44 ); 45 console.log(aliases); 46 console.log(aEmail); 47 } 48} 49function getMailContent() { 50 const DOC_URL = 'https://docs.google.com/document/d/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; 51 const doc = DocumentApp.openByUrl(DOC_URL); 52 return doc.getBody().getText(); 53}
--<ここからは、前の回答>--
例えば、次のようなスクリプトになります。
従前の変数名も一部変更してありますのでご注意ください。
javascript
1function onFormSubmit(e) { 2 var qName = '氏名';//名前の質問名 3 var qEmail = 'メールアドレス';//メアドの質問名 4 var qSelect = 'どれがいいでしょうか';//選択肢の質問に含まれる言葉 5 var aSelect = ['東京', '大阪'];//選択肢の回答のうちメールを返信する回答 6 var aName = ''; 7 var aEmail = ''; 8 // フォームの回答を取得 9 var isMatch = false; 10 var itemResponses = e.response.getItemResponses(); 11 for (var i = 0; i < itemResponses.length; i++) { 12 var itemResponse = itemResponses[i]; 13 var question = itemResponse.getItem().getTitle(); 14 var answer = itemResponse.getResponse(); 15 if (question == qName) { 16 aName = answer; 17 } else if (question == qEmail) { 18 aEmail = answer; 19 } else if (question.includes(qSelect)) { 20 var str = aSelect.join('&'); 21 if (str.includes(answer)) { 22 isMatch = true;//選択項目が選ばれてた 23 } 24 } 25 } 26 if (isMatch) { 27 // 返信メール内容を取得 28 var mailContent = getMailContent(); 29 // 自動返信メール件名 30 var subject = 'お問い合わせありがとうございました。'; 31 // 自動返信メール本文 32 var body = aName + '様\n\n' + mailContent; 33 // メール送信 34 MailApp.sendEmail({ 35 to: aEmail, 36 subject: subject, 37 body: body 38 }); 39 console.log(aEmail); 40 } 41} 42function getMailContent() { 43 const DOC_URL = 'https://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; 44 const doc = DocumentApp.openByUrl(DOC_URL); 45 return doc.getBody().getText(); 46}
投稿2023/03/27 08:13
編集2023/04/04 01:25総合スコア296
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
0
こちらは、紛らわしくならないよう、新たな回答としてアップしました。
老婆心ながら、回答の取りこぼしを防ぐためにスプレッドシートの方に保存するスクリプトもお示ししておきます。
【ご希望されていた最初の回答を修正したものは、4回目の回答をご覧ください。】
回答先のスプレッドシートのシート名を指定して返信できるようにしてあります。
回答先のシート名の指定のほか、フォームメールアドレスを取得したアドレスへの返信、送信元としてエイリアスのメールアドレスからの返信に対応しております。
複数のフォームの回答先になっているスプレッドシートに保存してトリガーを設定した上で動作することを確認してあります。
繰り返しますが、こちらのスクリプトは、スプレッドシートの方に保存するものです。
こちらを利用されるときは、スプレッドシートの拡張機能からApps Scriptを開いてエディタに保存してください。
こちらを利用してスプレッドシートの方にトリガー設定されるときは、フォームのトリガーを削除してください。
しないとメールが2通届きます。
//←のところを環境に合わせて書き換えてから利用します。
javascript
1//フォーム送信時に蓄積されたシートのデータからメールを返信 2function onFormSubmit() { 3 const nameSheet = 'フォームの回答 1';//←返信するフォームの回答が蓄積されるシート名 4 const qName = '氏名';//←名前の質問名 5 const qEmail = 'メールアドレス';//←メールアドレスを収集する場合は変更しない 6 const qSelect = 'どれがいいでしょうか';//←選択肢の質問に含まれる言葉 7 const aSelect = ['東京', '大阪'];//←選択肢の回答のうちメールを返信する回答 8 let aName = ''; 9 let aEmail = ''; 10 const sheet = SpreadsheetApp.getActiveSheet(); 11 //対象のシートでないなら処理を中断 12 if (sheet.getName() != nameSheet) { 13 console.log(sheet.getName()); 14 return; 15 } 16 const lastRow = sheet.getLastRow(); 17 const lastCol = sheet.getLastColumn(); 18 //質問名を配列に取得 19 const questions = sheet.getRange(1, 1, 1, lastCol).getValues().flat(); 20 //回答である最終行を配列に取得 21 const answers = sheet.getRange(lastRow, 1, 1, lastCol).getValues().flat(); 22 //フォームの回答を取得 23 let isMatch = false; 24 questions.forEach((question, index) => { 25 if (question.includes(qSelect)) { 26 const str = aSelect.join('&'); 27 if (str.includes(answers[index])) { 28 isMatch = true;//選択項目が選ばれていた 29 } 30 } else if (question == qName) { 31 aName = answers[index]; 32 } else if (question == qEmail) { 33 aEmail = answers[index]; 34 } 35 }); 36 if (isMatch) { 37 // 返信メール内容を取得 38 const mailContent = getMailContent(); 39 // 自動返信メール件名 40 const subject = 'お問い合わせありがとうございました。'; 41 // 自動返信メール本文 42 const body = aName + '様\n\n' + mailContent; 43 // メール送信(エイリアスがあるならエイリアスで送信) 44 const aliases = GmailApp.getAliases();//エイリアス取得 45 GmailApp.sendEmail(//MailApp → GmailApp 46 aEmail, 47 subject, 48 body, 49 { 50 from: aliases[0],//←インデックスでエイリアスを指定 51 name: '差出人の名前'//←差出人の名前 52 } 53 ); 54 console.log(aliases); 55 console.log(aEmail); 56 } 57} 58function getMailContent() { 59 const DOC_URL = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';//←URLを書き換え 60 const doc = DocumentApp.openByUrl(DOC_URL); 61 return doc.getBody().getText(); 62}
投稿2023/04/04 02:39
総合スコア296
下記のような回答は推奨されていません。
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
このような回答には修正を依頼しましょう。
回答へのコメント
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
関連した質問
Q&A
解決済
GASで特定の列に更新があると自動で通知メールが飛ぶようにしたいが、rangeが定義されていないとエラーが出る
回答1
クリップ1
更新
2023/05/29
Q&A
受付中
[php][javascript]ボタンが押されたかどうかを検証するページを作りたい
回答2
クリップ0
更新
2023/06/02
Q&A
解決済
ジャバ教えてください
回答1
クリップ1
更新
2023/05/25
Q&A
解決済
Ajaxでフォームの内容をPHPに渡してPDFを作成し文字列を引き渡し、受け取った文字列をjavascriptでPDF化したい
回答2
クリップ0
更新
2023/06/02
Q&A
解決済
htmlの検索フォームにcssを適用させたいです。
回答1
クリップ0
更新
2023/06/02
Q&A
受付中
【GAS】同じスプレッドシート内で同じ関数のスクリプトを、対象を変えて複数動かしたい場合はどうすれば良いか
回答1
クリップ1
更新
2023/06/03
Q&A
受付中
お問合せフォームから送信したデータを正しくphpmyadminに登録したい
回答1
クリップ1
更新
2023/06/03
Q&A
受付中
JavaScriptファイルが「読まれなかった」時点で検知する方法
回答4
クリップ1
更新
2023/05/12
同じタグがついた質問を見る
Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。
Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。
Google ドキュメントは、Google社が提供している文書作成ツール。Googleアカウントがあれば無料で利用できます。ブラウザ上で文書作成を行い、複数人での同時編集がで可能。スマホやタブレットでも利用できる他、オフラインでの編集もできます。
Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。