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

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

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

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

Google フォーム

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

Google Apps Script

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

Q&A

解決済

1回答

5254閲覧

GASで「Exception 無効なメール」というエラーが「GmailApp.sendEmail」の行で出る

mkkc

総合スコア2

Google スプレッドシート

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

Google フォーム

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

Google Apps Script

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

0グッド

2クリップ

投稿2023/06/14 09:29

実現したいこと

googleフォームから研修参加の申し込みをしてもらい、
必要事項を記入後、送信してもらう。すると
その受講者にその研修参加時の受付QRコードをメールで送信する。

研修当日に受付で、そのQRコードを読み取ると、
研修の受講者に

受付完了とアンケートURLをメール

に送るようにしたいです。色々と調べて

前提

参考ホームページ
https://note.com/0375/n/n57d84bb08936
にたどり着きました。
とても希望に合っている内容で、ほぼコピペできたのですが、
上記の
_受付完了とアンケートURLをメール_を送信
というところだけがなく、自分で他のページを見たりしながら、
やっていました。

発生している問題・エラーメッセージ

しかしQRコードを読み取ると、
「Exception 無効なメール:1(行 60、ファイル「doGet」)」
と出て、メールが飛びません。

該当のソースコード

/**

  • 出欠状況(登録済かどうか)を画面に表示する。
  • 出席管理シートには、QRを最初に読み込んだ時の日時を反映する。
  • doGetシートには、毎回のQRを読み込んだ時の日時を反映する(一つのQRコードを何度も読み込んだ場合、同一IDのログが残る)
  • @param {object} e イベントオブジェクト
  • @return {string}出欠状況(登録済がどうか)を画面に表示する

*/

function doGet(e) {

console.log(e)
const ss = SpreadsheetApp.getActiveSpreadsheet();
const id = e.parameter.id;
const time = Utilities.formatDate(new Date(), 'JST', 'yyyy/MM/dd HH:mm:ss aaa');

const recordSHT = ss.getSheetByName('doGet');
const recordVAL = [id, time];
recordSHT.appendRow(recordVAL);

const answerSHT = ss.getSheetByName('出席管理');
const asnwerRNG = answerSHT.getDataRange();
const answerVALS = asnwerRNG.getValues();
const idCOL = answerVALS[0].indexOf('ID');
const attendCOL = answerVALS[0].indexOf('出席');
const nameCOL = answerVALS[0].indexOf('氏名');
const mail_address = answerVALS[0].indexOf('メールアドレス');

let textOutput = msgTextGet();//msgTextGet関数からテキスト本文を呼び出し

for (const answer of answerVALS) {
//IDがヒットした時だけ処理する
if (answer[idCOL] === id) {
textOutput = textOutput
.replace(/{{id}}/, answer[idCOL])
.replace(/{{氏名}}/, answer[nameCOL]);

//まだ出席登録されていない if (!answer[attendCOL]) { answer[attendCOL] = time; textOutput = textOutput .replace(/{{本文}}/, '出欠登録を受け付けました。') .replace(/{{時刻}}/, time); //すでに出席登録されている } else { textOutput = textOutput .replace(/{{本文}}/, '出欠登録は受付済みです') .replace(/{{時刻}}/, `(初回受付)${answer[attendCOL]}`); } break; }

//メールを送信

const title = "研修受付完了メール"; const main = "本日の研修の受付ありがとうございました。研修終了後、本日の研修内容についてのアンケート(https://forms.gle/〇〇〇)にお答えください。どうぞよろしくお願いします。" const options = { bcc: 'teacher001@〇〇〇.jp', from: 'teacher001@〇〇〇.jp', name: 'センター 情報担当' }; GmailApp.sendEmail(mail_address, title, main,options);

}

asnwerRNG.setValues(answerVALS);

return ContentService.createTextOutput(textOutput);
}

/**

  • 画面に表示するテキスト本文を生成する。
  • @return {string}テキスト

*/

function msgTextGet() {

const textOutput = `
ご来場ありがとうございます!

{{本文}}
ID:{{id}}
氏名:{{氏名}}
時刻:{{時刻}}
`;

return textOutput;
}

試したこと

GmailApp.sendEmailの行の位置を変えてみたりしました。

補足情報(FW/ツールのバージョンなど)

GASの初心者です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答1

0

ベストアンサー

修正が必要と思われる箇所が2つあります。

1番目)
メールの送信は、for(of)ループの中でIDが一致した場合に行われるのであれば、

js

1//メールを送信 2const title = "研修受付完了メール"; 3const main = "本日の研修の受付ありがとうございました。研修終了後、本日の研修内容についてのアンケート(https://forms.gle/〇〇〇)にお答えください。どうぞよろしくお願いします。" 4const options = { bcc: 'teacher001@〇〇〇.jp', 5 from: 'teacher001@〇〇〇.jp', 6 name: 'センター 情報担当' }; 7GmailApp.sendEmail(mail_address, title, main,options);

これらメール送信のコードは、
for(of)ループの最初のif文(IDがヒット)の中の最後のところの

js

1 break; 2}

の直前に配置して

js

1 //メールを送信 2 const title = "研修受付完了メール"; 3 const main = "本日の研修の受付ありがとうございました。研修終了後、本日の研修内容についてのアンケート(https://forms.gle/〇〇〇)にお答えください。どうぞよろしくお願いします。" 4 const options = { bcc: 'teacher001@〇〇〇.jp', 5 from: 'teacher001@〇〇〇.jp', 6 name: 'センター 情報担当' }; 7 GmailApp.sendEmail(mail_address, title, main,options); 8 break; 9}

のようにするといいと思います。
そうでないと、IDに関係なく何通もメールが送られると思います。

2番目)
こちらは、エラーの原因だと思いますが、

js

1 const mail_address = answerVALS[0].indexOf('メールアドレス');

は、メールアドレスの見出しの位置(インデックス)をアドレスに代入していますので、宛先が数字になってしまいます。
こちらは、if文の中に移動した後の

js

1 //メールを送信 2 const title = "研修受付完了メール";

のところに

js

1 //メールを送信 2 const mail_address = answer[answerVALS[0].indexOf('メールアドレス')]; 3 const title = "研修受付完了メール";

としてインデックスから取得した値を代入してはいかがでしょうか。

なお、変数のスコープの関係で
メールアドレスの取得をif文の中に入れるとif文の外から変数mail_addressを参照できなくなるので、アドレスの取得とメール送信を両方ともif文の中に移動する修正は同じタイミングで行う必要があります。

投稿2023/06/15 05:43

編集2023/06/15 05:45
YellowGreen

総合スコア861

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

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

YellowGreen

2023/06/15 06:04 編集

2番目は、他の部分と書き方をあわせるために、 const mail_address = answerVALS[0].indexOf('メールアドレス'); を移動して変更するのではなくて、 移動せずに変数名を修正することにして const mail_address = answerVALS[0].indexOf('メールアドレス'); の変数名を const mailCOL = answerVALS[0].indexOf('メールアドレス'); に変更しておいて、 メール送信の修正部分を、 const mail_address = answer[answerVALS[0].indexOf('メールアドレス')]; ではなく、 const mail_address = answer[mailCOL]; として書き方を合わせた方がいいかもしれません。
mkkc

2023/06/17 03:21

ありがとうございます。 うわ~すばらしい!!すごいです!! あんなに時間をかけてできなかったことがついにできました。 猛烈に感動です。 大変わかりやすく丁寧で、助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問