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();
}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/03/25 09:25
2023/03/27 00:38
2023/03/27 00:40
2023/03/27 00:42
2023/03/27 00:48
2023/03/27 01:42
2023/03/27 01:45
2023/03/27 01:46
回答3件
0
(こちらは古い回答ですので5回目の回答をご覧ください。)
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}
投稿2023/03/27 08:13
編集2023/09/16 06:46総合スコア731
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/03/27 14:00 編集
2023/03/27 19:35
2023/03/29 00:58
2023/03/29 01:05
2023/03/29 01:10
2023/03/29 01:15
2023/03/29 07:37 編集
2023/03/29 07:52
2023/03/29 16:13 編集
2023/03/29 16:16
2023/03/30 07:21 編集
2023/03/30 02:38
2023/03/30 08:59
2023/03/30 09:07 編集
2023/03/30 09:42
2023/03/30 09:43
2023/03/31 21:58 編集
2023/03/31 22:15 編集
2023/03/31 22:01
2023/04/03 13:19
2023/04/04 01:27
2023/04/05 14:14
2023/04/05 14:55 編集
2023/04/05 22:54
2023/04/05 23:06
2023/04/05 23:10
2023/04/05 23:13
2023/04/10 08:00
2023/04/10 08:01
2023/04/10 08:06
2023/04/10 08:09
2023/04/10 09:22 編集
2023/04/10 09:18 編集
2023/04/10 23:20
2023/04/10 23:21
2023/04/11 00:41 編集
2023/04/15 01:28
2023/04/15 01:51
2023/04/15 02:05
2023/04/15 02:25 編集
2023/04/15 02:27
2023/04/15 02:28
2023/04/15 02:35
2023/04/15 02:44
2023/04/15 02:48 編集
2023/04/15 02:45
2023/04/15 02:49
2023/04/15 02:51
2023/04/15 02:53
2023/04/15 03:07
2023/04/17 09:49
2023/04/17 10:36 編集
2023/04/18 14:51
2023/04/18 14:57 編集
2023/04/18 15:01
2023/04/19 19:00 編集
2023/04/20 15:13 編集
2023/04/20 15:16 編集
2023/04/20 18:24 編集
2023/04/20 23:30
2023/04/21 01:10 編集
2023/04/21 09:36 編集
2023/04/21 09:44
2023/04/21 09:47 編集
2023/04/21 20:21
2023/04/21 21:14 編集
2023/05/19 23:03
2023/05/19 23:37
2023/05/19 23:43 編集
2023/06/04 23:32
2023/06/04 23:45
2023/06/04 23:51
2023/08/15 17:53 編集
0
5度目の回答です。
選択肢の回答との一致の確認を文字列から配列要素に変更しました。
また、一致、不一致のいずれでも実行数にログが残るようにしました。
フォームで回答を送信後、しばらくしてからエディタの実行数に残るログを確認してみてください。
ログが表示されないときは、ブラウザをリロードしてみてください。
JavaScript
1function onFormSubmit(e) { 2 //送信メールの内容以外で実行環境にあわせて書き換える部分は次の6行とドキュメントのIDです 3 const qName = '氏名';//←名前の質問名 4 const qSelect = 'どれがいいでしょうか';//←選択肢の質問に含まれる言葉 5 const aSelect = [ 6 '東京',//←選択肢のうち返信対象の回答を引用符の中に記載(複数ならカンマで区切る) 7 '大阪',//←選択肢が数値のときは、引用符を付けずに直接記載( 9, などのように) 8 ]; 9 //エディタから実行したとき 10 if (e === undefined) { 11 console.log('エディタからは実行できません。フォームから回答してください。'); 12 return; 13 } 14 let aName = ''; 15 let aEmail = ''; 16 // フォームの回答を取得 17 let isMatch = false; 18 const itemResponses = e.response.getItemResponses(); 19 aEmail = e.response.getRespondentEmail();//←自動のメールアドレスを取得 20 for (const itemResponse of itemResponses) { 21 const question = itemResponse.getItem().getTitle();//質問項目名 22 const answer = itemResponse.getResponse();//質問項目への回答 23 if (question.includes(qSelect)) {//選択肢の質問項目への回答のとき 24 const match = aSelect.find(v => v == answer);//一致する選択肢を確認 25 if (match) {//選択肢のいずれかに一致するものがある 26 isMatch = true; 27 //返信対象項目が選ばれた。 28 console.log('回答がいずれかの選択肢と一致しました。'); 29 console.log('一致した選択肢:[' + match + ']' + ' フォームの回答:[' + answer + ']'); 30 } else {//一致する選択肢が無い 31 //返信対象項目が選ばれなかった。 32 console.log('回答がいずれの選択肢とも一致しませんでした。'); 33 aSelect.forEach((v, i) => console.log('選択肢' + (i + 1) + ':[' + v + ']' + ' フォームの回答:[' + answer + ']')); 34 break;//選択項目以外が選ばれていたら処理を中断 35 } 36 } else if (question == qName) { 37 aName = answer; 38 } 39 } 40 if (isMatch) { 41 // 返信メール内容を取得 42 const mailContent = getMailContent(); 43 // 自動返信メール件名 44 const subject = 'お問い合わせありがとうございました。'; 45 // 自動返信メール本文 46 const body = aName + '様\n\n' + mailContent; 47 // メール送信(エイリアスがあるならエイリアスで送信) 48 const aliases = GmailApp.getAliases();//エイリアス取得 49 console.log('to: ' + aEmail + '\nsub: ' + subject + '\nbd: ' + body); 50 console.log(aliases); 51 GmailApp.sendEmail(//MailApp → GmailApp 52 aEmail, 53 subject, 54 body, 55 { 56 from: aliases[0],//←インデックスでエイリアスを指定 57 name: '差出人の表示' //←差出人の名前 58 } 59 ); 60 } 61} 62function getMailContent() { 63 const DOC_URL = 'xxxxxxxxxx'; 64 const doc = DocumentApp.openByUrl(DOC_URL); 65 return doc.getBody().getText(); 66}
投稿2023/06/05 00:42
編集2023/06/05 07:49総合スコア731
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/06/05 00:44
2023/06/09 06:24
2023/08/15 17:55 編集
2023/09/16 06:40
2023/09/16 06:42
2024/02/27 10:40
0
(こちらは古い回答ですので、5回目の回答をご確認ください。)
こちらはスプレッドシートに保存するスクリプトです。
紛らわしくならないよう、新たな回答としてアップしました。
老婆心ながら、回答の取りこぼしを防ぐためにスプレッドシートの方に保存するスクリプトもお示ししておきます。
【ご希望されていた最初の回答を修正したものは、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
編集2023/09/16 06:47総合スコア731
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/04/05 14:58
2023/04/05 22:44
2023/04/05 23:17
2023/09/16 06:51 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。