実現したいこと
googleフォームで申請を受け、スプレッドシートに反映、メールにて承認操作を行いたい
前提
以前、有給申請のフローのアドバイスを頂き、同じ形で作成しています。
フォームで申請を受け、担当者に「~申請がありました」という内容のメールが届くのですが、その内容の部分で指定したい内容が表示されず、悩んでいます。
該当のソースコード
function sendMessage(e) { /* <summary> Formで登録された内容をeパラメタとして受け取り、SS上から必要データを取り出して、 承認者向けにメールを送付する。メールの内容として、承認・否認の選択肢を付与する。 SSには登録されたデータのStatusを”申請中”として登録する */ //eパラメタ等から対象シートのRowを取得、ついでにSSに申請中と登録 var row = e.range.getRow(); var sheet = SpreadsheetApp.openById("1hk_hbd1HvkvJZ4EX_Gi7HK0Lp9BNKcnKt8CLnimXrDo").getSheetByName("ボランティア申込"); //XXXXをSSのIDへ変更 sheet.getRange(row,5).setValue("申請中"); // メールに貼り付けるBodyをgenerateBody関数から作成 var bodies = generateBody(e.values); // urlはこのGASをウェブアプリで公開した、アドレス+パラメータとして、rowとanswerをつける var url = "https://script.google.com/macros/s/AKfycby_yz-GEv-Rg3plypCBh95IH3ILkIrHD_tFlPM18i5T0MY0tZCQL2F19cC85VzqF1G5Rw/exec"+ "?row=" + row +"&answer="; //https:...以下ををスクリプトをウェブアプリケーションとして公開した際に表示されるURLへ変更 var recipient = 'XXXXXXX@gmail.com'; var subject = "ボランティア申込みのお知らせ"; var body = ""; body += 'ボランティアの申込みがありました\n\n'; body += bodies.plane; body += "承認する場合は以下をクリック"; body += url + "ok"; body += "承認しない場合は以下をクリック"; body += url + "ng"; var html =""; html += '<h1>ボランティアの申込みがありました</h1>'; html += '<p>以下の申込みがありました</p>'; html += bodies.plane; html += "<p>承認する場合は、<a href="+ url + "ok>【承認する】</a>をクリックしてください</p>" html += "<p>承認しない場合は、<a href="+ url + "ng>【否認する】</a>をクリックしてください</p>" GmailApp.sendEmail(recipient, subject, body, {htmlBody:html}); } function doGet(e) { /* <summary> 承認者がメールで選択したのち、選択した結果をSSのStatus項目に反映する。 また、申請者には結果をメールする。そして、承認者には選択した結果をブラウザ画面で表示する */ // エディタでdoGetを実行したときの承認メール送信確認用 // e = {}; // e.parameter = {}; // e.parameter.row = 10;//有効なメアドがある行 // e.parameter.answer = 'ok'; const row = e.parameter.row; const sheet = SpreadsheetApp.openById('1hk_hbd1HvkvJZ4EX_Gi7HK0Lp9BNKcnKt8CLnimXrDo').getSheetByName('ボランティア申込'); //XXXXをSSのIDで書換え const values = sheet.getRange(row, 1, 1, 8).getValues()[0]; Logger.log(values); const bodies = generateBody(values); const answers = e.parameter.answer; const result = { ok: '承認', ng: '否認' }; const recipient = values[3]; if (answers) { sheet.getRange(row, 5).setValue(result[answers]); const subject = 'ボランティア申込' + result[answers] + 'のお知らせ'; let body = ''; body += '以下の内容でボランティアの申込が' + result[answers] + 'されました。\n\n'; body += bodies.html; let html = ''; html += '<h1>ボランティア申込' + result[answers] + 'のお知らせ</h1>'; html += '<p>以下の内容でボランティアの申込が' + result[answers] + 'されました。</p>'; html += bodies.html; GmailApp.sendEmail(recipient, subject, body, { htmlBody: html }); html = '';// 元のコードではhtmlをvarで再宣言していたが、letで宣言したので再利用に変更 html += '<h1>ボランティア申込' + result[answers] + '</h1>'; html += '<p>あなたは以下のボランティア申込を' + result[answers] + 'しました</p>'; html += bodies.html; return HtmlService.createHtmlOutput(html); }; } function generateBody(values){ var name = values[1]; var p_name = values[2]; var mail = values[3]; var syozoku = values[6]; var bora = values[7]; var bikou = values[8]; var plane = ""; plane += '<ul>'; plane += '<li>児童名: ' + name + '</li>'; plane += '<li>保護者名: ' + p_name + '</li>'; plane += '<li>担当メールアドレス: ' + mail + '</li>'; plane += '<li>所属: ' + syozoku + '</li>'; plane += '<li>参加希望のボランティア: ' + bora + '</li>'; plane += '<li>備考: ' + bikou + ' </li>'; plane += '</ul>'; var html = ''; html += '<ul>'; html += '<li>児童名: ' + name + '</li>'; html += '<li>保護者名: ' + p_name + '</li>'; html += '<li>担当メールアドレス: ' + mail + '</li>'; html += '<li>所属: ' + syozoku + '</li>'; html += '<li>参加希望のボランティア: ' + bora + '</li>'; html += '<li>備考: ' + bikou + ' </li>'; html += '</ul>'; return {plane:plane, html:html}; }
試したこと
function generateBody(values){
var name=values[1]←この数字の部分を色々と変えてみましたが、変化がありません。
補足情報(FW/ツールのバージョンなど)
generateBody(values)
を呼び出している元の関数はどうなっていますか?
var body = generateBody(values);
GmailApp.sendEmail(..., ..., ...);
のような部分がある関数です。
前回に引き続きコメントありがとうございます。
下記の部分が該当箇所でしょうか
var recipient = 'ーーーーーー@gmail.com';
var subject = "ボランティア申込みのお知らせ";
var body = "";
body += 'ボランティアの申込みがありました\n\n';
body += bodies.plane;
body += "承認する場合は以下をクリック";
body += url + "ok";
body += "承認しない場合は以下をクリック";
body += url + "ng";
var html ="";
html += '<h1>ボランティアの申込みがありました</h1>';
html += '<p>以下の申込みがありました</p>';
html += bodies.plane;
html += "<p>承認する場合は、<a href="+ url + "ok>【承認する】</a>をクリックしてください</p>"
html += "<p>承認しない場合は、<a href="+ url + "ng>【否認する】</a>をクリックしてください</p>"
GmailApp.sendEmail(recipient, subject, body, {htmlBody:html});
}
var body = generateBody(values);
が記載されていませんねぇ。
他に関数はないのでしょうか?
参考にされたサイトなど。
すいません💦上部にこの関数がありました。
// メールに貼り付けるBodyをgenerateBody関数から作成
var bodies = generateBody(e.values);
// urlはこのGASをウェブアプリで公開した、アドレス+パラメータとして、rowとanswerをつける
var url = "https://script.google.com/macros/s/AKfycby_yz-GEv-Rg3plypCBh95IH3ILkIrHD_tFlPM18i5T0MY0tZCQL2F19cC85VzqF1G5Rw/exec"+ "?row=" + row +"&answer="; //https:...以下ををスクリプトをウェブアプリケーションとして公開した際に表示されるURLへ変更
基本的には前回YellowGreenさんにアドバイス頂き作成したGASを引用しています。
コードを細切れに出すのではなく、質問を編集して全体を出したほうが伝わりやすいかと思います。
また、なんでプレーンテキストにHTMLタグを書いているんでしょうか?
あと、過去の質問は解決しているのであれば解決済みとしてください。
全体を出したほうが分かりやすいんですね、ありがとうございます。
テラテイルについて不勉強で、HTMLタグを記載する方法が分かりませんでした。
編集してみました。
過去の質問はコメント欄で解決して頂いたので、回答がゼロの状態でベストアンサーが選べません。
このような状態でも解決済みにする方法があるのでしょうか、、
>テラテイルについて不勉強で、HTMLタグを記載する方法が分かりませんでした
いえ、そうではなくメールのプレーンテキストは通常のテキストを記述するものです。
HTMLメール部分であれば、「<li>児童名: なまえ</li>」と書けば「・児童名: なまえ」といった感じに表示されますが、プレーンテキスト部に書けば「<li>児童名: なまえ</li>」とそのまま表示されることになります。
なので、プレーンテキストには「児童名: なまえ」とタグを使用しないで書くべきです。
>過去の質問はコメント欄で解決して頂いたので、回答がゼロの状態でベストアンサーが選べません。
>このような状態でも解決済みにする方法があるのでしょうか、、
こういった場合は、自分で回答に「〇〇さんに頂いたコメントでこのようにしたので解決しました」など誰のアドバイスでどのように解決したのか具体的に書いて自己解決としましょう。
> フォームで申請を受け、担当者に「~申請がありました」という内容のメールが届くのですが、その内容の部分で指定したい内容が表示されず、
は、どのように表示されていますか。
YAmaGNZ様の2023/10/26 04:49のコメントの前半部分の
アドバイスにしたがって修正を試してみましたか。
それでも解決していないなら、
現時点でのメールの内容を一部を伏せ字にして構いませんので
アップできますでしょうか。
YAmaGNZ様
2023/10/26 04:49
失礼致しました。。
そういうことですね。
変更してみましたが、思うようにはいきませんでした。
メールにはHTMLメールの部分が表示されているようなので、プレーンテキストの部分を変えても特に変化がありませんでした。
ベストアンサーの部分の解決方法教えて頂きありがとうございました。
YellowGreenさん
YAmaGNZ様にもお返事させて頂きました。
メールをコピペします。
↓
ボランティアの申込みがありました
以下の申込みがありました
所属: やまもとたろう
児童氏名: やまもとはなこ
保護者氏名: ×××@gmail.com
参加希望のボランティア: 1年1組
備考: 懇談会
担当メールアドレス: テスト
承認する場合は、【承認する】をクリックしてください
承認しない場合は、【否認する】をクリックしてください
という形で、所属のところに児童名・児童氏名のところに保護者名・保護者名のところにメールアドレス・・・というようにズレてしまっているのです。
1) このちぐはぐになっているのは、承認したときに届くメール(doGetからのメール)も申込のときに届くメール(sendMessageから届くメール)もどちらも同じようにずれていますか?
2) フォームから回答した内容が蓄積されるスプレッドシートには、
メールに表示する値が転記されていると思いますが、
A列には(タイムスタンプ:使わない)
B列には?
C列には?
D列には?
E列 (使わない)
F列 (使わない)
G列 には?
H列 には?
I列 には?
それぞれ実際に転記されているのは何の値ですか?
1)はい、承認メールも申込の際に届くメールも全く同じようにずれています。
2)スプレッドシートには、
A列:タイムスタンプ
B列:児童名(やまもとたろう)
C列:保護者名(やまもとはなこ)
D列:メールアドレス(×××@gmail.com)
E列:申請中(申請中)
F列:学年・クラス(承認)
G列:参加希望のボランティア(懇談会)
H列:備考欄(テスト)
最初はきちんとフォームに入力して頂いた通り表示されていたのですが、色々といじっているうちにF列の部分の学年クラスがずれてしまいました💦
>所属: やまもとたろう
>児童氏名: やまもとはなこ
>保護者氏名: ×××@gmail.com
>参加希望のボランティア: 1年1組
>備考: 懇談会
>担当メールアドレス: テスト
提示されているコードと順番が違いませんか?
提示されたコードは
html += '<li>児童名: ' + name + '</li>';
html += '<li>保護者名: ' + p_name + '</li>';
html += '<li>担当メールアドレス: ' + mail + '</li>';
html += '<li>所属: ' + syozoku + '</li>';
html += '<li>参加希望のボランティア: ' + bora + '</li>';
html += '<li>備考: ' + bikou + ' </li>';
ですよね?
何故「所属」が一番最初になっているのでしょうか?
また、スプレッドシートには「所属」がなさそうですがコードですとvalues[6](G列)みたいですが?
本当に「メールのコピペ」は提示したコードの結果ですか?
デプロイしなおしていないなどありませんか?
function generateBody(values){
のところが
var name = values[1];
var p_name = values[2];
var mail = values[3];
var syozoku = values[6];
var bora = values[7];
var bikou = values[8];
となっていますが、
これだと、B列からI列までの値を取得するようになっていて、実際にはH列までのデータがずれているとしても入っているので、
この部分は、今現在のコードが上の質問に書いてあるのとは変わっていませんか?
例えば、上の回答の
var bikou = values[8]はI列のデータが入るはずなのですが。
既にご指摘があるようにデプロイを新バージョンに更新されていないか、上の回答のコードが古いものかのどちらかだと思います。
あと、F列は1年1組?承認?どちらでしょうか。
YAmaGNZ様
再度デプロイし直しましたが、送られてくるメールの結果は変わりませんでした。
コードで示している順番と、メールで送られてくる順番がちぐはぐなので、困惑しています。
デプロイの仕方やトリガーの設定の仕方が間違っているのが、もう一度見直してみます。
YellowGreen様
var name = values[1];
var p_name = values[2];
var mail = values[3];
var syozoku = values[6];
var bora = values[7];
var bikou = values[8];
この部分がタイムスタンプの列を入れた数字にしてしまっていた所があるので、下記のように編集しました。
var name = values[1];
var p_name = values[2];
var mail = values[3];
var syozoku = values[5];
var bora = values[6];
var bikou = values[7];
が、送られてくるメールに変化はありませんでした。。
デプロイも再度し直しました。コードも大きく変えた所はないと思います。。
念のため次のコメントに現在のコードをコピペします。
function sendMessage(e) {
/*
<summary>
Formで登録された内容をeパラメタとして受け取り、SS上から必要データを取り出して、
承認者向けにメールを送付する。メールの内容として、承認・否認の選択肢を付与する。
SSには登録されたデータのStatusを”申請中”として登録する
*/
//eパラメタ等から対象シートのRowを取得、ついでにSSに申請中と登録
var row = e.range.getRow();
var sheet = SpreadsheetApp.openById("1hk_hbd1HvkvJZ4EX_Gi7HK0Lp9BNKcnKt8CLnimXrDo").getSheetByName("ボランティア申込"); //XXXXをSSのIDへ変更
sheet.getRange(row,5).setValue("申請中");
// メールに貼り付けるBodyをgenerateBody関数から作成
var bodies = generateBody(e.values);
// urlはこのGASをウェブアプリで公開した、アドレス+パラメータとして、rowとanswerをつける
var url = "https://script.google.com/macros/s/AKfycbwMbMbZ-yW3Q1QDC7R9_Wri2ir9ia0wY5gvOARyZefGyVDpeilXMecakWPXDxNPRliPIw/exec"+ "?row=" + row +"&answer="; //https:...以下ををスクリプトをウェブアプリケーションとして公開した際に表示されるURLへ変更
var recipient = '×××@gmail.com';
var subject = "ボランティア申込みのお知らせ";
var body = "";
body += 'ボランティアの申込みがありました\n\n';
body += bodies.plane;
body += "承認する場合は以下をクリック";
body += url + "ok";
body += "承認しない場合は以下をクリック";
body += url + "ng";
var html ="";
html += '<h1>ボランティアの申込みがありました</h1>';
html += '<p>以下の申込みがありました</p>';
html += bodies.plane;
html += "<p>承認する場合は、<a href="+ url + "ok>【承認する】</a>をクリックしてください</p>"
html += "<p>承認しない場合は、<a href="+ url + "ng>【否認する】</a>をクリックしてください</p>"
GmailApp.sendEmail(recipient, subject, body, {htmlBody:html});
}
function doGet(e) {
/*
<summary>
承認者がメールで選択したのち、選択した結果をSSのStatus項目に反映する。
また、申請者には結果をメールする。そして、承認者には選択した結果をブラウザ画面で表示する
*/
// エディタでdoGetを実行したときの承認メール送信確認用
// e = {};
// e.parameter = {};
// e.parameter.row = 10;//有効なメアドがある行
// e.parameter.answer = 'ok';
const row = e.parameter.row;
const sheet = SpreadsheetApp.openById('1hk_hbd1HvkvJZ4EX_Gi7HK0Lp9BNKcnKt8CLnimXrDo').getSheetByName('ボランティア申込'); //XXXXをSSのIDで書換え
const values = sheet.getRange(row, 1, 1, 8).getValues()[0];
Logger.log(values);
const bodies = generateBody(values);
const answers = e.parameter.answer;
const result = {
ok: '承認',
ng: '否認'
};
const recipient = values[3];
if (answers) {
sheet.getRange(row, 4).setValue(result[answers]);
const subject = 'ボランティア申込' + result[answers] + 'のお知らせ';
let body = '';
body += '以下の内容でボランティアの申込が' + result[answers] + 'されました。\n\n';
body += bodies.html;
let html = '';
html += '<h1>ボランティア申込' + result[answers] + 'のお知らせ</h1>';
html += '<p>以下の内容でボランティアの申込が' + result[answers] + 'されました。</p>';
html += bodies.html;
GmailApp.sendEmail(recipient, subject, body, { htmlBody: html });
html = '';// 元のコードではhtmlをvarで再宣言していたが、letで宣言したので再利用に変更
html += '<h1>ボランティア申込' + result[answers] + '</h1>';
html += '<p>あなたは以下のボランティア申込を' + result[answers] + 'しました</p>';
html += bodies.html;
return HtmlService.createHtmlOutput(html);
};
}
function generateBody(values){
var name = values[1];
var p_name = values[2];
var mail = values[3];
var syozoku = values[5];
var bora = values[6];
var bikou = values[7];
var plane = "";
plane += '<ul>';
plane += '<li>児童名: ' + name + '</li>';
plane += '<li>保護者名: ' + p_name + '</li>';
plane += '<li>担当メールアドレス: ' + mail + '</li>';
plane += '<li>所属: ' + syozoku + '</li>';
plane += '<li>参加希望のボランティア: ' + bora + '</li>';
plane += '<li>備考: ' + bikou + ' </li>';
plane += '</ul>';
var html = '';
html += '<ul>';
html += '<li>児童名: ' + name + '</li>';
html += '<li>保護者名: ' + p_name + '</li>';
html += '<li>担当メールアドレス: ' + mail + '</li>';
html += '<li>所属: ' + syozoku + '</li>';
html += '<li>参加希望のボランティア: ' + bora + '</li>';
html += '<li>備考: ' + bikou + ' </li>';
html += '</ul>';
return {plane:plane, html:html};
}
うっかりしていたことがありました。
e.valuesには、E列の値が含まれていないので、
データF列以降のデータの位置がずれてしまいます。
function sendMessage(e) {
の方の
// メールに貼り付けるBodyをgenerateBody関数から作成
var bodies = generateBody(e.values);
を
// メールに貼り付けるBodyをgenerateBody関数から作成
// var bodies = generateBody(e.values);
var values = sheet.getRange(row, 1, 1, 8).getValues()[0];
var bodies = generateBody(values);
にしてみましょう。
(追記:↑の部分を変更しています。)
また、
var html =""; html += '<h1>ボランティアの申込みがありました</h1>'; html += '<p>以下の申込みがありました</p>'; html += bodies.plane;
の += bodies.plane;
は += bodies.html;
だと思います。
それから
function doGet() {
の方は、
sheet.getRange(row, 4).setValue(result[answers]);
を
sheet.getRange(row, 5).setValue(result[answers]);
として、承認・不承認をE列に記入するようにします。
これら2つの修正をした後のメールの結果を教えてください。
上のコメントを修正してあります。
doGet()も修正するので、保存後にデプロイを新バージョンにすることをお忘れなく。
ここからコピペすると改行がなくなるので、回答欄に参考例をアップしました。