質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.53%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google ドキュメント

Google ドキュメントは、Google社が提供している文書作成ツール。Googleアカウントがあれば無料で利用できます。ブラウザ上で文書作成を行い、複数人での同時編集がで可能。スマホやタブレットでも利用できる他、オフラインでの編集もできます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

3回答

1704閲覧

GASを使ってフォームの自動返信

nissy0715

総合スコア0

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google フォーム

Google フォームは、 Google社が提供しているアンケートフォーム作成および集計ができる無料のツール。Googleアカウントがあれば利用が可能です。集計データは、スプレッドシートに収集され、データ分析もできます。

Google ドキュメント

Google ドキュメントは、Google社が提供している文書作成ツール。Googleアカウントがあれば無料で利用できます。ブラウザ上で文書作成を行い、複数人での同時編集がで可能。スマホやタブレットでも利用できる他、オフラインでの編集もできます。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

2クリップ

投稿2023/03/25 02:25

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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YellowGreen

2023/03/25 06:27

試してみましたが、何の問題もなくドキュメントの内容が本文になってメールが返信されました。 1) スクリプトは、フォームのスクリプトエディタに保存 2) トリガー設定は、フォームのスクリプトエディタからフォーム送信時に設定 3) DOC_URLは本文用のドキュメントのURLをコピペ 4) 質問名は、スクリプトの設定「お名前」「メールアドレス」と合っている。 何か違っているところがありますか?
YAmaGNZ

2023/03/25 09:25

>特定の回答のみ自動返信を送る(こちらは調べても分かりませんでした。) if文を使用して条件を満たした時のみ送信するようにすればよろしいかと思います。
nissy0715

2023/03/27 00:38

YellowGreen様 コメントありがとうございます。 スクリプトは、回答用スプレッドシートに設定をしておりました。 質問名は「お名前」→「氏名」となっております。 2と3については正しい内容で出来ております。
nissy0715

2023/03/27 00:40

YAmaGNZ様 コメントありがとうございます。 例えば「A・B・Cどれが良いですか」という質問で 「A」と「B」を選択した人のみメールを返信したいのですが その操作も可能でしょうか。 また、if分を組み込む場所が分からずご教授いただければ幸いです。 宜しくお願い致します。
nissy0715

2023/03/27 00:42

【質問】 別のメールアドレスから返信を送る事は可能でしょうか。
nissy0715

2023/03/27 00:48

YellowGreen様 お教えいただいた内容で フォームのスクリプトエディタに貼り付けをして トリガーを設定し、試してみたのですが 自動返信メールは届きませんでした。 他に何か間違っている箇所がありますでしょうか。 宜しくお願い致します。
YellowGreen

2023/03/27 01:42

確認事項は残り3つです。 2) トリガー設定は、「フォームのスクリプトエディタから」、「フォーム送信時」に設定 3) DOC_URLは本文用のドキュメントのURLを「コピペ」 4) 質問名は、スクリプトの設定「お名前」「メールアドレス」と合っている。
YellowGreen

2023/03/27 01:45

フォームの質問名とスクリプで設定している質問名はコピペで完全に合わせてください。
YAmaGNZ

2023/03/27 01:46

>例えば「A・B・Cどれが良いですか」という質問で >「A」と「B」を選択した人のみメールを返信したいのですが AもしくはBの時にメールを送信する と記述することもできますし Cの時は何もしないといった記述することも可能です。 if文は下記のような書き方ですから if (条件) { // 条件を満たしたときに行う処理 } 条件分岐は「メールを送信する時」に下記のようにすればいいのではないですか? if (条件) { // メールを送信 }
guest

回答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
YellowGreen

総合スコア655

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nissy0715

2023/03/27 14:00 編集

YellowGreen様 回答ありがとうございます。 無事自動返信メールが到着しました。 度々申し訳ございません。 こちら自動返信のメールアドレスは、 別のアドレスで送付する事は可能でしょうか。 丁寧で的確な対応で心から感謝いたします。
YellowGreen

2023/03/27 19:35

まず、その前に、これまで返信メールが送信されなかった理由はわかったのでしょうか。当方としても気になっていたところですので、お教え願えますか。
nissy0715

2023/03/29 00:58

YellowGreen様 ご返信ありがとうございます。 これまで返信メールが送信されなかった理由については判明せず、以前お送りいただいた確認事項も 全て合っていましたが返信メールは届きませんでした。 原因解明ができず申し訳ございません。
nissy0715

2023/03/29 01:05

YellowGreen様 let fromAddress = "送信元メールアドレス" こちらを組み込んだところエラーとなってしまいました。
YellowGreen

2023/03/29 01:10

違うメールアドレスから送信する例をアップしました。 メールエイリアス以外のメールアドレスからは、手動でメールを送るときもできないので、GASでもできないと思います。エイリアスの登録方法がわからないときはGoogle検索するといろいろ出てきます。
YellowGreen

2023/03/29 01:15

あ、修正をいろいろやっているときに、変数宣言とループの処理を(自分に)わかりやすいように変えてしまっていました。ごめんなさい。
YellowGreen

2023/03/29 07:37 編集

何度もすみません。トリガーでフォーム回答の取得エラーがあることがわかったので、 スプレッドシートに蓄積されたデータから取得するように改めました。 フォームのトリガーでonFormSubmit(e)の e を取得できないことがあるようです。 e の取得エラーのときも回答先シートには蓄積されていたので、 スプレッドシートの方は e からではなく、シートの蓄積データを取得するようにしました。
YellowGreen

2023/03/29 07:52

念のためですが、スクリプトの保存とトリガー設定はスプレッドシートのエディタで行ってください。(念のためです。)
nissy0715

2023/03/29 16:13 編集

ありがとうございます。 こちら実際のフォームで使用すると動作確認が出来ませんでした。 テスト用だと動作確認ができています。 原因としては、実際に使用したい回答用スプレッドシートは 他にもシートがある為に動作しないのではないかと思います。 最初に回答頂いたスクリプトでシート名の選択は出来ますでしょうか。 何度も申し訳ございません。 宜しくお願い致します。
nissy0715

2023/03/29 16:16

また、フォームの設定で「メールアドレスを収集する」をオンにして メールアドレスを取得すると返信は届きませんでした。 こちらも何か関係がありますでしょうか?
YellowGreen

2023/03/30 07:21 編集

シート名の設定は、 // const sheet = SpreadsheetApp.getActiveSheet(); const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('フォームの回答 1'); とします。 シート名の全角半角空白などにご注意ください。 私は、シート名を変更するときに文字を選択できるので変更せずにコピペしています。 また、 > フォームの設定で「メールアドレスを収集する」をオンにして > メールアドレスを取得すると返信は届きませんでした。 につきましては、オンにすると回答先のシートに 「メールアドレス」という質問項目が列の最後に追加されて蓄積されます。 そのため、「メールアドレス」という質問名が2つになりましたが、 繰り返し処理で上書きされるので 後側(右側)に蓄積されたメールアドレスにスクリプトからの返信が届きました。 回答のコピーを回答者に送信を「常に表示」にすると、 スクリプトからの返信とフォームからの回答のコピーとの2通が 右側の列の「メールアドレス」に蓄積されたアドレスに送信されました。 シート名を正しく設定してもメールが送信されないときは、 質問名に空白が含まれていないかの確認後、 改めてシートの1行目から質問名をコピーしてスクリプトの冒頭の設定部分に貼り付けて一致させてみてください。
YellowGreen

2023/03/30 02:38

迷惑メールに分類されていたりはしませんよね。私は、icloudのアドレスを指定したときにそうなりました。
nissy0715

2023/03/30 08:59

ご回答ありがとうございます。 迷惑メールには分類されていませんでした。 お送り頂いた内容で再度動作確認を試してみます。
nissy0715

2023/03/30 09:07 編集

function onFormSubmit(e) { // const sheet = SpreadsheetApp.getActiveSheet(); const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('フォームの回答 1'); var qName = '氏名';//名前の質問名 var qEmail = 'メールアドレス';//メアドの質問名 var qSelect = 'どれがいいでしょうか';//選択肢の質問に含まれる言葉 var aSelect = ['東京', '大阪'];//選択肢の回答のうちメールを返信する回答 var aName = ''; var aEmail = ''; // フォームの回答を取得 長くなるため一部ですが、 スクリプトを入れる箇所が間違っていますでしょうか。 返信メールは届きませんでした。 シート名については、コピーしたものを貼り付けています。
YellowGreen

2023/03/30 09:42

一度私のお示ししたスクリプトを全部コピペしてから固有の値をコピペで設定し直ししてみて
YellowGreen

2023/03/31 21:58 編集

動作しなかったスクリプトに動作確認済みのスクリプトの一部分を貼り付けたつぎはぎのスクリプトは、エラーがどこにあるか特定するのが難しいです。 元々動作しなかった原因が究明できなかったのですから、そのスクリプトを原因がわからないまま修正しても動作するかどうか疑問です。 私がお示ししているスクリプトは動作確認してあり、違いはそちらで新たに変更するシート名や質問名だけですから動作しないときに原因の絞り込みがしやすいと思います。 最後にお示ししたスクリプトを全部コピペでその質問名やシート名の値を変更してから試してみてください。
YellowGreen

2023/03/31 22:15 編集

> テスト用だと動作確認ができています。 何故本番環境が動作しないのでしょうか。 エラーにもならないのですね。 本番環境とテスト用との違いはシート数以外では何でしょうか。
YellowGreen

2023/03/31 22:01

変数に代入する値以外で違いを考えると、トリガーの設定でしょうか。トリガーによる実行ログ(実行数)でもエラーが出ていないのですよね。
nissy0715

2023/04/03 13:19

YellowGreen様 お世話になっております。 動作確認をしたところ、やはり一番最初に送っていただいた内容が動作テストでも上手くいくため 最初に送っていただいた内容に回答のシート名を条件で設定は出来ませんでしょうか。 最初に送っていただいた内容で実現できなかった事は以下の通りです。 ①フォームの設定で「メールアドレスを収集する」をオンにすると返信が届かない ②テスト用でAのgmailで自動返信が確認出来たが、Bのgmailで送信できるようにしたい ③実際フォームだと動作確認出来ず (フォームの回答を複数まとめたシートで管理しているためかと考えます) 何度もご対応いただきありがとうございます。 またお時間ある時にご確認いただけますと幸いです。 何卒よろしくお願い申し上げます。
YellowGreen

2023/04/04 01:27

修正をアップしました。 当方では、自動取得のメールアドレスへに送信することも、送信元アドレスをエイリアスにすることも動作確認できています。
nissy0715

2023/04/05 14:14

YellowGreen様 ありがとうございます。 スクリプトをコピーし、フォームのスクリプトに追加を行い 変更箇所(選択肢の質問に含まれる言葉、選択肢の回答のうちメールを返信する回答、差出人名、本文用ドキュメント)を変更し動作確認を何度か行いましたが自動返信はありませんでした。 何か間違っている手順はありますでしょうか。 選択肢の質問に含まれる言葉などは動作確認ができた内容で貼り付けをしています。
nissy0715

2023/04/05 14:55 編集

何度か新しく回答いただいたスクリプトで試したのですが動作できず、 一番最初のスクリプトが問題なく動作をしています。 一番最初のスクリプトは、送信元メールアドレス変更が課題のため YellowGreen様にお教えいただいた内容を組み込んでみたり 調べた内容で試したのですが送信できませんでした。 エイリアスは確認したところ登録済みとなっています。 インデックスでエイリアスを指定とありますが、 こちらは登録されている順番の番号でお間違いありませんでしょうか。
YellowGreen

2023/04/05 22:54

最初のスクリプトが動作しているというのは、 最初のスクリプトが動作する条件が整っているけれども それ以外のスクリプトが動作する条件が整っていないということだと思いますが、 エディタは、既存のスクリプトはその都度削除してまっさらなところにコピペして 同じ名前のスクリプトは1つだけの状態で お試しいただいているのですよね。 トリガーの設定も更新されてますか。 エイリアスについては、0が1番目になります。
YellowGreen

2023/04/05 23:06

仮に、前のスクリプトもエディタに保存したい場合は、 名前を function old_onFormSubmit_001 () { function old_onFormSubmit_002 () { などとそれぞれ違う名前にしておきましょう。 実際にトリガーで起動したいスクリプトだけを function onFormSubmit() { という名前にしておきます。 トリガーは、 念の為、上の処理を済ませた後、 既存のトリガーを一度削除してから、 改めて一つだけの状態のonFormSubmit を指定してフォーム送信時で設定し直してみてください。
YellowGreen

2023/04/05 23:10

それ以外の可能性についても、検討してみます。 こちらでも、どうすればスクリプトから送信できなくなるのかを 環境をいろいろ変更しながら確認してみたいと思います。
YellowGreen

2023/04/05 23:13

スクリプトが保存されているエディタで画面左の実行数を開くと、 時刻とともにログを確認できます。 フォームの方とスプレッドシートの方を それぞれ実行数のログをご覧いただいて、 エラー等表示されていないかお教えいただけますか。 エラーがありましたら、どちらのエラーなのかと一緒に コピペしてアップしてみてください。
nissy0715

2023/04/10 08:00

51.28% エラーがあった実行の数: % 実行数 39 スクリプトが # 回実行されました ユーザー 1
nissy0715

2023/04/10 08:01

YellowGreen様 お世話になっております。 エラーのコピペはこちらでよろしかったでしょうか。 ご確認いただけますと幸いです。
nissy0715

2023/04/10 08:06

こちらの件ですが、 コメントを残している場所が複数になってしまっているため 別で質問あげ直した方が良いでしょうか。 また、teratailについては把握していないのですが DMのようなやり取りができる環境があれば そちらでご連絡させていただければ幸いです。 何卒よろしくお願い申し上げます。
YellowGreen

2023/04/10 08:09

エディタから左の実行数をクリックするとトリガーで実行された履歴が表示されますが、 その中で種類がトリガーでステータスが失敗しましたになっているものをクリックすると 赤い文字でエラーが表示されますので、それをコピペしてアップしていただけますでしょうか。 スプレッドシートのエディタなのかフォームのエディタなのかも併せてお知らせください。
YellowGreen

2023/04/10 09:22 編集

> teratailについては把握していないのですが DMのようなやり取りができる環境があれば 通知の設定で、コメントをいただくと、メールアドレスに即時通知が届きますので こちらは、実質的にDMをいただいているのと同じです。 このコメントは後で編集を入れているので遅めのコメントになっていますが、 上のコメントくらいのタイミングでは、返信可能ではあります。 基本的にコメントをいただいた通知メールはすぐに届くのですが、 多忙時や外出時、食事中その他速やかにリプライできない場合があることはご容赦ください。
YellowGreen

2023/04/10 09:18 編集

もう一つお願いがあります。 エディタに function onFormSubmit() { で始まる同じ名前の関数が2つ以上保存されていないでしょうか。 こちらもお知らせいただけますでしょうか。
nissy0715

2023/04/10 23:20

エディタから左の実行数をクリックするとトリガーで実行された履歴 >実行数を確認したところ、YellowGreen様にお教えいただいた内容(関数:onFormSubmit)は完了となっており、エラーが発生していませんでした。 別のトリガーでエラーが発生しており、そちらはオーナーでないため削除ができない状態となっています。 また、エラー内容については(関数:sendform)フォーム回答があった際に複数人に通知を送るスクリプトを使用しておりましたが、スクリプト削除したため「スクリプト関数が見つかりません: sendform」というエラーのみでした。
nissy0715

2023/04/10 23:21

function onFormSubmit() { で始まる同じ名前の関数が2つ以上保存されていないでしょうか。 >function onFormSubmit で始まる関数は1つのみ保存した状態になっています。
YellowGreen

2023/04/11 00:41 編集

まず、私のところではsakusaku様がどのスクリプトでお試しなのかわからないので、 1 確認したスクリプトはフォームの方(最新版?)かスプレッドシートの方(最新版?)かを教えてください。 2 エラーがなかった実行結果をクリックしてみてもログは何も表示されないでしょうか。 3 別のオーナーがトリガーを設定していたということは、共有設定がされているということでしょうか。 であれば、そのメールを送信しようとしているフォーム(またはスプレッドシート)の 所有者はsakusaku様なのでしょうか、それとも他の方が所有者なのでしょうか。 もう少し、スクリプト以外の部分も含めた動作環境をお教えいただけますでしょうか。
nissy0715

2023/04/15 01:28

1 確認したスクリプトはフォームの方となります。 2 ログの表示はされませんでした。 3 共有設定となっており、スクリプトやトリガーの編集が可能です。 フォームの所有者は他の方が所有者となります。 宜しくお願い致します。
YellowGreen

2023/04/15 01:51

同様の環境を再現するのにお時間ください。
YellowGreen

2023/04/15 02:05

共有編集者としてトリガー設定しましたが、 フォームを送信すると、 Exception: Action not allowed at getMailContent at onFormSubmit のエラーになり、メールは送信できませんでした。 もう少し追試してみます。
nissy0715

2023/04/15 02:25 編集

2の追記です。 この実行に関するログはありません という表示になりました。 フォームのオーナーが異なるため実行できていないという可能性はありますか? (動作テストの際は、フォームをコピーしたためオーナーは私となっておりました) また、実際にはオーナーのメールアドレスより自動返信を行いたいと考えています。 宜しくお願い致します。
nissy0715

2023/04/15 02:27

もしオーナーでないため動作が出来ない場合は、 トリガーのみ「オーナー」に対応いただくという事も可能かと思います。 その場合はオーナーのメールアドレスから自動返信となりますでしょうか。
YellowGreen

2023/04/15 02:28

確認調査中ですので、もうしばらくお待ちください。
YellowGreen

2023/04/15 02:35

結果ですが、共有編集者のアカウントでメール送信できました。 メールの送信元は、共有編集者(トリガー設定者)のエイリアスからになります。 上のエラーは、メール本文用のGoogleドキュメントがオーナーのものだったので、 共有編集者にドキュメントの共有設定がなかったから文書を開けなかったので発生したものでした。
nissy0715

2023/04/15 02:44

ありがとうございます。 動作テスト用 と 実際のフォーム どちらもスクリプト・トリガーは何度確認しても同じ内容でして、 相違点としては以下となります。 ・共同編集者となっている ・メールアドレス取得方法 実際のフォーム:メールアドレスを収集するをオン 動作テスト用:質問にメールアドレス(記述式テキスト)と設定
nissy0715

2023/04/15 02:48 編集

また、共同編集者のエイリアスからメール送信の場合の エイリアス設定について詳しくお教えて頂けますと幸いです。 動作テスト用でエイリアスからメールを送れるのか確認を行えたらと思っています。 gmailで送信したいメールアドレスのエイリアス設定は出来ています。
YellowGreen

2023/04/15 02:45

// メール送信(エイリアスがあるならエイリアスで送信) const aliases = GmailApp.getAliases();//エイリアス取得 の行の次に console.log('to: ' + aEmail + '\nsub: ' + subject + '\nbody: ' + body); console.log(aliases); の2行を追加して保存してから フォームを送信して、 実行数のログをクリックしてログをみてください。
YellowGreen

2023/04/15 02:49

> また、共同編集者のエイリアスからメール送信の場合の エイリアス設定について詳しくお教えて頂けますと幸いです。 については、コメントでは長くなるので、 「gmail エイリアス設定」 でGoogle検索していただいた方が画像付きでわかりやすい説明があると思います。
nissy0715

2023/04/15 02:51

動作テスト用(自動返信確認済み)で お送りいただいたスクリプトを設定していなかったのですが どのスクリプトを貼り付けて動作を行いますでしょうか。 たくさん回答いただき、どれが最新のものか分からなくなってしまい、 大変申し訳ございませんがご教授いただければ幸いです。
YellowGreen

2023/04/15 02:53

実際に動作していないオーナーのフォームで確認できないのですか?
YellowGreen

2023/04/15 03:07

今日のやりとりで、オーナーのフォームのスクリプトを私が最後(4度目の回答)にお示ししたスクリプトで書き換えても送信できていないということだと思っていました。
nissy0715

2023/04/17 09:49

YellowGreen様 説明文が分かりづらく申し訳ございません。 実際のフォームと動作テスト用はどちらも 一番最初のスクリプトを貼り付けています(動作確認が出来たため) 4度目回答のフォームに置き換えたところ、 動作テスト用で動作の確認ができないという事態がありましたので、 一旦一番最初のスクリプトに変更しています。 再度4度目の回答でいただいたスクリプトに変更し、テストを行ってみます。
YellowGreen

2023/04/17 10:36 編集

もしかして、実際のフォームでメールアドレスを収集するがオンになっておらず、通常の質問でメールアドレスの質問があるのではないでしょうか? 4度目の回答の冒頭に書いてありますように、 > 4度目の回答です。 > 今回のスクリプトはご希望どおり、初回の回答をベースに以下の修正を加えてあります。 > 1)メールアドレスを自動で取得するようにした際の自動で取得されたメールアドレスに返信します。 としてあるので、通常の質問でのメールアドレスには返信するようになっていません。 自動収集のメールアドレスに送信するのか、通常の質問の回答でのメールアドレスに送信するのかどちらをお望みでしょう?(動作テスト用ではなく、実際のフォームでのご希望をお伺いしています。)
nissy0715

2023/04/18 14:51

YellowGreen様 4回目の回答でいただいたスクリプトに修正し 動作テストを行ったところ、 自動返信はありませんでした。 実際のフォームと同じ、自動収集をオンにして試してみました。 希望としては、 自動収集のメールアドレス に自動返信です。
nissy0715

2023/04/18 14:57 編集

4回目の回答でいただいたスクリプトに修正し >修正した箇所は以下の通りです。 ①4回目回答のスクリプトの全て「フォームのスクリプトエディタ」に貼り付け ②選択肢の質問に含まれる言葉、選択肢の回答のうちメールを返信する回答 の内容を修正 ③自動返信内容のURLを書き換え 上記以外の部分は変更しておりません。 もし変更箇所が他にもあるようでしたら、お教えください。 宜しくお願い致します。
nissy0715

2023/04/18 15:01

度々すみません。 エラーはなしで、トリガーとスクリプトについては1つのみ(4回目の回答内容のみ)となっています。 また、迷惑メール等にもメールが届いていませんでした。
YellowGreen

2023/04/19 19:00 編集

// メール送信(エイリアスがあるならエイリアスで送信) const aliases = GmailApp.getAliases();//エイリアス取得 の行の次に console.log('to: ' + aEmail + '\nsub: ' + subject + '\nbody: ' + body); console.log(aliases); の2行を追加して保存してから フォームを送信して、 実行数のログをクリックしてログをみてください。 の結果はどうでしたか?実行数のログはすぐには表示されないので、画面をリロードするなどしてからご確認ください。変数が取得できていなくても to: sub; body [] などと表示されるようにしてあります。 ログに全く何も表示されていないのだとすると、 スクリプトが受信した回答がスクリプトに設定されている選択肢を選んでいなかったと判断されている(isMatchがfalseのまま)ことになります。 その場合は、スクリプトの回答とフォームの選択肢は完全に一致するようになっているかご確認を、また、スクリプトの選択肢を選ぶ言葉がフォームに設定されている言葉に含まれているのかあるいは同じ言葉を含む質問が他にもあるかどうかなどの再確認(半角文字と全角文字の違いなど)をお願いします。
nissy0715

2023/04/20 15:13 編集

上記の件ですが、この実行に関するログはありません という表示になりました。 スクリプトの回答とフォームの選択肢は、コピーして貼り付けをしているため同じ内容となっaており、 他に同じ言葉を含む質問はありません。
nissy0715

2023/04/20 15:16 編集

スクリプトエディタから実行をすると 以下のエラーが表示されますが、こちらは関係ありませんでしょうか。 エラー TypeError: Cannot read properties of undefined (reading 'response') onFormSubmit @ 自動返信用.gs:10
YellowGreen

2023/04/20 18:24 編集

1) 実行後、しばらく待ってからもログが表示されていないということであれば、選択肢の回答が選ばれているかどうかを判断するコードの部分が何かおかしいということになります。 let isMatch = false; の行から if (isMatch) { までの間の変数の値を確認したいので、改めてログの表示をお願いします。(後ほどコメントします。現在のconsole.log()の部分はそのまま残しておいてください。) 2) 質問に対するフォームからの回答がない状態で実行することになるので、エディタから実行すると必ずエラーになります。(エラーはそういうことを表示しています)
nissy0715

2023/04/20 23:30

ありがとうございます。 またコメントお待ちしております。
YellowGreen

2023/04/21 01:10 編集

以下の //←追加★ というコメントが行末にある4行をそれぞれの場所に手入力ではなくコピペで追加して フォームで返信がつく選択肢を選んだ回答を送信した時の トリガーの実行ログをご確認ください。 【重要】ログが多いので実行後しばらくしてから確認してみてください。 全ての質問と回答が表示されていると思います。 m: の後のメールアドレス qs: の後の選択肢を聞く質問の言葉 as: の後の選択肢(複数行となるかもしれません) q: の後の質問(複数行となります) a: の後の回答(複数行となります) 特に 1) m: のメールアドレスが取得できているか 2) qa: の選択肢を聞く質問の言葉が q: のいずれかの質問に含まれているかどうか 3) a: の後の選択肢の回答のうちいずれかが as: の選択肢のいずれかに一致しているものがあるかどうかを確認したいです。 4) bq: と ba: との表示の内容 返信メールが送信されず、前回のログがなかったので、 今回も、選択肢に一致している回答がないと思われますが、 それがなぜなのかを確認できます。 // フォームの回答を取得 let isMatch = false; const itemResponses = e.response.getItemResponses(); aEmail = e.response.getRespondentEmail();//←自動のメールアドレスを取得 console.log('m: [' + aEmail + ']' + '\nqs :[' + qSelect + ']');//←追加★ aSelect.forEach(v => console.log('as: [' + v + ']'));//←追加★ for (const itemResponse of itemResponses) { const question = itemResponse.getItem().getTitle(); const answer = itemResponse.getResponse(); console.log('q: [' + question + ']\na: [' + answer + ']');//←追加★ if (question.includes(qSelect)) { const str = aSelect.join('&'); if (str.includes(answer)) { isMatch = true;//選択項目が選ばれていた } else { console.log('bq: [' + question + ']\nba: [' + answer + ']');//←追加★ break;//選択項目以外が選ばれていたら処理を中断 } } else if (question == qName) { aName = answer; } }
nissy0715

2023/04/21 09:36 編集

お世話になっております。 お教えいただきました内容を試したところ デバッグについては以下の内容となりました。 個人情報を含むため実際の内容とは異なる文面にしています。 2023/04/21 18:30:16 デバッグ m: [入力したメールアドレスが入っていました] qs :[選択肢の質問に含まれる言葉] 2023/04/21 18:30:16 デバッグ as: [自動返信を送りたい選択肢の言葉] 2023/04/21 18:30:16 デバッグ q: [上記の理由について教えてください] a: [] 最後の2つの項目(下記に記載)については設定した記憶がないのですが、 表示されていました。 q: [上記の理由について教えてください] a: []
YellowGreen

2023/04/21 09:44

確認です。 1) q: とa: は1組だけがログに表示されたのでしょうか。時間をおいて確認しても1組だけなのですね。 2) なおかつ、1組しなかい q: [上記の回答理由について教えてください]はフォームの質問項目にない質問なのですね。なので、回答が[]と空になっているのだと思います。 3) bq: とba: も表示されず。他にq: とa: が表示されていないのですね。 4) [上記の回答理由について教えてください]という文言は、qs: に表示されている言葉とは全く違いますか?
YellowGreen

2023/04/21 09:47 編集

5) フォームの回答用リンクを改めて取得して、新しいリンクから回答してみるとどうなりますか?
nissy0715

2023/04/21 20:21

更新したところ表示されているログが変わりましたのでご報告いたします。 1)q:とa:は全てで5組表示されています 氏名、電話番号、選択肢としていない項目2組、自動返信対象の項目1組でした。 3) bq: とba: には、自動返信対象の項目が1組表示されました。 4)はい。qs:に表示されている言葉とは全く異なります。
YellowGreen

2023/04/21 21:14 編集

1) 5組は、メールアドレス以外のフォームにある質問とその回答ですね。 3) as: と ba: とを比べて違いを教えてください。明らかに違うのか、全角、半角、空白ピリオド、カンマなど厳密に比較したときの違いがあるのか。 6) 自動返信対象とは、選択肢の質問と回答のことでしょうか?
nissy0715

2023/05/19 23:03

ご無沙汰しております。 6)については、自動返信対象=選択肢としている回答となります。 よろしくお願いいたします
YellowGreen

2023/05/19 23:37

3) で解決したので返信がなくなったと思ってましたが、いかがでしたか?
YellowGreen

2023/05/19 23:43 編集

ログに ba: が表示されてしまったことでの推測ですが、フォームの選択肢に引用符が付いていたとかでしょうか。
nissy0715

2023/06/04 23:32

自動返信は出来ておらず、その後変化ない状態となっております。 引用符は付いていない状態かと思われます。
YellowGreen

2023/06/04 23:45

3) as: と ba: とを比べて違いを教えてください。明らかに違うのか、全角、半角、空白ピリオド、カンマなど厳密に比較したときの違いがあるのか。
YellowGreen

2023/06/04 23:51

ba:は、選択肢の回答のうち選択された回答です。 as:は、スクリプトに設定した返信対象の選択肢です。 ba:が表示されるのは、スクリプトの選択肢のいずれにもフォームの返信対象の回答と一致するものがないときです。
YellowGreen

2023/08/15 17:53 編集

5度目の回答をアップしましたので、 上の質問へのご返事も含め、 続きは5度目の回答へのコメントにお願いします。
guest

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
YellowGreen

総合スコア655

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YellowGreen

2023/06/05 00:44

改めて、スクリプト全文をアップしました。ご確認ください。
nissy0715

2023/06/09 06:24

3) as: と ba: とを比べて違いを教えてください。明らかに違うのか、全角、半角、空白ピリオド、カンマなど厳密に比較したときの違いがあるのか。 →as: と ba: は、同じ文面でした。(自動返信を送りたい対象の回答でした)
YellowGreen

2023/08/15 17:55 編集

ba:が表示されるということは、 as:と何かが違っているということです。 目で見てわからない違いかもしれません。 文面ということは、 例えばスクリプトが「東京」「大阪」で 回答の方が「東京がいいです」とかになってたりはしませんか? 今回のスクリプトでは どのように表示されますか?
YellowGreen

2023/09/16 06:40

5回目の回答をご提示してからしばらく経過しましたが、 原因はお分かりになったのでしょうか?
YellowGreen

2023/09/16 06:42

もし、お分かりになったのであれば、お教え願えませんでしょうか?
YellowGreen

2024/02/27 10:40

フォームの選択肢をGASを使って設定していて、 その選択肢に全角の空白が含まれていたりはしませんか。
guest

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
YellowGreen

総合スコア655

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nissy0715

2023/04/05 14:58

こちら試してみたところ、スプレッドシート(回答)のスクリプトエディタを開くと 以下のエラーが表示されるため動作を試すことが出来ませんでした。 Google ドキュメント内でエラーが発生しました。このページを再読み込みするか、数分後にこのページをもう一度開いてみてください。
YellowGreen

2023/04/05 22:44

> こちら試してみたところ、スプレッドシート(回答)のスクリプトエディタを開くと 以下のエラーが表示されるため動作を試すことが出来ませんでした。 こちらは、そのスプレッドシートに何かの問題があるということかもしれません。 別なスプレッドシートを改めて回答先に指定し直してからお試しいただくことは可能でしょうか?
YellowGreen

2023/04/05 23:17

複数のスプレッドシートや複数のフォームを同じブラウザで同時に開いた状態になっていたりしないでしょうか。 スプレッドシート(回答)のエディタはもう開くことができなくなってしまったのでしょうか。
YellowGreen

2023/09/16 06:51 編集

何度もコメントして申し訳ありません。 仮に、元のシートをエディタを開くことが可能になったり、 2023/04/06 07:44の私のコメントの他のシートで試すことができたらの話になりますが、 スプレッドシートに保存する方のスクリプトは、 エディタからも実行可能で、 その際は、蓄積された回答の中で一番最後の回答にあるメールアドレスに返信します。 その際に、画面にログが表示されますので、そのログを確認してアップしていただけますでしょうか。 なお、続きは5回目の回答へのコメントでお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.53%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問