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

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

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

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

Google フォーム

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

Google Apps Script

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

Q&A

1回答

507閲覧

GASを使った申請、承認について

kanakoji

総合スコア2

Google スプレッドシート

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

Google フォーム

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

Google Apps Script

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

0グッド

2クリップ

投稿2023/10/25 07:55

編集2023/10/25 11:40

実現したいこと

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/ツールのバージョンなど)

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

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

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

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

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

YellowGreen

2023/10/25 08:30 編集

generateBody(values) を呼び出している元の関数はどうなっていますか? var body = generateBody(values); GmailApp.sendEmail(..., ..., ...); のような部分がある関数です。
kanakoji

2023/10/25 09:30

前回に引き続きコメントありがとうございます。 下記の部分が該当箇所でしょうか 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}); }
YellowGreen

2023/10/25 09:35 編集

var body = generateBody(values); が記載されていませんねぇ。 他に関数はないのでしょうか? 参考にされたサイトなど。
kanakoji

2023/10/25 10:09

すいません💦上部にこの関数がありました。 // メールに貼り付ける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を引用しています。
YAmaGNZ

2023/10/25 11:28 編集

コードを細切れに出すのではなく、質問を編集して全体を出したほうが伝わりやすいかと思います。 また、なんでプレーンテキストにHTMLタグを書いているんでしょうか? あと、過去の質問は解決しているのであれば解決済みとしてください。
kanakoji

2023/10/25 11:38

全体を出したほうが分かりやすいんですね、ありがとうございます。 テラテイルについて不勉強で、HTMLタグを記載する方法が分かりませんでした。 編集してみました。 過去の質問はコメント欄で解決して頂いたので、回答がゼロの状態でベストアンサーが選べません。 このような状態でも解決済みにする方法があるのでしょうか、、
YAmaGNZ

2023/10/25 19:49

>テラテイルについて不勉強で、HTMLタグを記載する方法が分かりませんでした いえ、そうではなくメールのプレーンテキストは通常のテキストを記述するものです。 HTMLメール部分であれば、「<li>児童名: なまえ</li>」と書けば「・児童名: なまえ」といった感じに表示されますが、プレーンテキスト部に書けば「<li>児童名: なまえ</li>」とそのまま表示されることになります。 なので、プレーンテキストには「児童名: なまえ」とタグを使用しないで書くべきです。 >過去の質問はコメント欄で解決して頂いたので、回答がゼロの状態でベストアンサーが選べません。 >このような状態でも解決済みにする方法があるのでしょうか、、 こういった場合は、自分で回答に「〇〇さんに頂いたコメントでこのようにしたので解決しました」など誰のアドバイスでどのように解決したのか具体的に書いて自己解決としましょう。
YellowGreen

2023/10/26 03:23

> フォームで申請を受け、担当者に「~申請がありました」という内容のメールが届くのですが、その内容の部分で指定したい内容が表示されず、 は、どのように表示されていますか。 YAmaGNZ様の2023/10/26 04:49のコメントの前半部分の アドバイスにしたがって修正を試してみましたか。 それでも解決していないなら、 現時点でのメールの内容を一部を伏せ字にして構いませんので アップできますでしょうか。
kanakoji

2023/10/27 05:45

YAmaGNZ様 2023/10/26 04:49 失礼致しました。。 そういうことですね。 変更してみましたが、思うようにはいきませんでした。 メールにはHTMLメールの部分が表示されているようなので、プレーンテキストの部分を変えても特に変化がありませんでした。 ベストアンサーの部分の解決方法教えて頂きありがとうございました。
kanakoji

2023/10/27 05:48

YellowGreenさん YAmaGNZ様にもお返事させて頂きました。 メールをコピペします。 ↓ ボランティアの申込みがありました 以下の申込みがありました 所属: やまもとたろう 児童氏名: やまもとはなこ 保護者氏名: ×××@gmail.com 参加希望のボランティア: 1年1組 備考: 懇談会 担当メールアドレス: テスト 承認する場合は、【承認する】をクリックしてください 承認しない場合は、【否認する】をクリックしてください という形で、所属のところに児童名・児童氏名のところに保護者名・保護者名のところにメールアドレス・・・というようにズレてしまっているのです。
YellowGreen

2023/10/27 06:29 編集

1) このちぐはぐになっているのは、承認したときに届くメール(doGetからのメール)も申込のときに届くメール(sendMessageから届くメール)もどちらも同じようにずれていますか? 2) フォームから回答した内容が蓄積されるスプレッドシートには、 メールに表示する値が転記されていると思いますが、 A列には(タイムスタンプ:使わない) B列には? C列には? D列には? E列 (使わない) F列 (使わない) G列 には? H列 には? I列 には? それぞれ実際に転記されているのは何の値ですか?
kanakoji

2023/10/27 07:18

1)はい、承認メールも申込の際に届くメールも全く同じようにずれています。 2)スプレッドシートには、 A列:タイムスタンプ B列:児童名(やまもとたろう) C列:保護者名(やまもとはなこ) D列:メールアドレス(×××@gmail.com) E列:申請中(申請中) F列:学年・クラス(承認) G列:参加希望のボランティア(懇談会) H列:備考欄(テスト) 最初はきちんとフォームに入力して頂いた通り表示されていたのですが、色々といじっているうちにF列の部分の学年クラスがずれてしまいました💦
YAmaGNZ

2023/10/27 07:46

>所属: やまもとたろう >児童氏名: やまもとはなこ >保護者氏名: ×××@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列)みたいですが? 本当に「メールのコピペ」は提示したコードの結果ですか? デプロイしなおしていないなどありませんか?
YellowGreen

2023/10/27 09:05 編集

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組?承認?どちらでしょうか。
kanakoji

2023/10/27 10:28

YAmaGNZ様 再度デプロイし直しましたが、送られてくるメールの結果は変わりませんでした。 コードで示している順番と、メールで送られてくる順番がちぐはぐなので、困惑しています。 デプロイの仕方やトリガーの設定の仕方が間違っているのが、もう一度見直してみます。
kanakoji

2023/10/27 10:33

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]; が、送られてくるメールに変化はありませんでした。。 デプロイも再度し直しました。コードも大きく変えた所はないと思います。。 念のため次のコメントに現在のコードをコピペします。
kanakoji

2023/10/27 10:34

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}; }
YellowGreen

2023/10/28 01:30 編集

うっかりしていたことがありました。 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つの修正をした後のメールの結果を教えてください。
YellowGreen

2023/10/28 01:31

上のコメントを修正してあります。 doGet()も修正するので、保存後にデプロイを新バージョンにすることをお忘れなく。
YellowGreen

2023/10/28 02:18

ここからコピペすると改行がなくなるので、回答欄に参考例をアップしました。
guest

回答1

0

スプレッドシートの各列の値がコメントで回答いただいたとおりであるなら、
次のスクリプトで私のところでは、正常に動作しましたので、
参考までにアップしておきます。
環境に合わせて修正が必要な部分を冒頭にまとめました。
その他ちょっとした修正を加えてあります。

JavaScript

1const SS_ID = 'xxxxxx'; // xxxxxxはスプレッドシートIDに 2const SHEET_NAME = 'xxxxxx'; // xxxxxxはシート名 3const MAIL_ADDRESS = 'xxxxxx@xxxxxx.xxx'; // xxxxxx@xxxxxx.xxxは、承認者のメールアドレス 4const WEBAPP_URL = 'xxxxxx'; // xxxxxxはデプロイしたウェブアプリのURL 5// フォームの回答から承認・不承認の確認メールを送信 6function sendMessage(e) { 7 /* 8 <summary> 9 Formで登録された内容をeパラメタとして受け取り、SS上から必要データを取り出して、 10 承認者向けにメールを送付する。メールの内容として、承認・否認の選択肢を付与する。 11 SSには登録されたデータのStatusを”申請中”として登録する 12 */ 13 //eパラメタ等から対象シートのRowを取得、ついでにSSに申請中と登録 14 const row = e.range.getRow(); 15 const sheet = SpreadsheetApp.openById(SS_ID).getSheetByName(SHEET_NAME); 16 sheet.getRange(row, 5).setValue("申請中"); 17 // メールに貼り付けるBodyをgenerateBody関数から作成 18 // var bodies = generateBody(e.values); 19 const values = sheet.getRange(row, 1, 1, 8).getValues()[0]; 20 const bodies = generateBody(values); 21 // ウェブアプリのurlにパラメータとして、rowとanswerをつける 22 const url = WEBAPP_URL + "?row=" + row + "&answer="; 23 const recipient = MAIL_ADDRESS; 24 const subject = "ボランティア申込みのお知らせ"; 25 let body = ""; 26 body += 'ボランティアの申込みがありました\n\n'; 27 body += bodies.plane; 28 body += "\n承認する場合は以下をクリック\n"; 29 body += url + "ok" + '\n'; 30 body += "承認しない場合は以下をクリック\n"; 31 body += url + "ng"; 32 let html = ""; 33 html += '<h1>ボランティアの申込みがありました</h1>'; 34 html += '<p>以下の申込みがありました</p>'; 35 html += bodies.html; 36 html += "<p>承認する場合は、<a href=" + url + "ok>【承認する】</a>をクリックしてください</p>"; 37 html += "<p>承認しない場合は、<a href=" + url + "ng>【否認する】</a>をクリックしてください</p>"; 38 GmailApp.sendEmail(recipient, subject, body, { htmlBody: html }); 39} 40 41// 承認・不承認を確認しメールを送信 42function doGet(e) { 43 /* 44 <summary> 45 承認者がメールで選択したのち、選択した結果をSSのStatus項目に反映する。 46 また、申請者には結果をメールする。そして、承者には選択した結果をブラウザ画面で表示する 47 */ 48 // エディタでdoGetを実行したときの承認メール送信確認用 49 // e = {}; 50 // e.parameter = {}; 51 // e.parameter.row = 10; 52 //有効なメアドがある行 53 // e.parameter.answer = 'ok'; 54 const row = e.parameter.row; 55 const sheet = SpreadsheetApp.openById(SS_ID).getSheetByName(SHEET_NAME); 56 const values = sheet.getRange(row, 1, 1, 8).getValues()[0]; 57 const bodies = generateBody(values); 58 const answers = e.parameter.answer; 59 const result = { ok: '承認', ng: '否認' }; 60 const recipient = values[3]; // D列([3])がメールアドレス 61 if (answers) { 62 sheet.getRange(row, 5).setValue(result[answers]); 63 const subject = 'ボランティア申込' + result[answers] + 'のお知らせ'; 64 let body = ''; 65 body += '以下の内容でボランティアの申込が' + result[answers] + 'されました。\n\n'; 66 body += bodies.html; 67 let html = ''; 68 html += '<h1>ボランティア申込' + result[answers] + 'のお知らせ</h1>'; 69 html += '<p>以下の内容でボランティアの申込が' + result[answers] + 'されました。</p>'; 70 html += bodies.html; 71 GmailApp.sendEmail(recipient, subject, body, { htmlBody: html }); 72 html = ''; 73 html += '<h1>ボランティア申込' + result[answers] + '</h1>'; 74 html += '<p>あなたは以下のボランティア申込を' + result[answers] + 'しました</p>'; 75 html += bodies.html; 76 return HtmlService.createHtmlOutput(html); 77 }; 78} 79 80//引数で渡された配列から本文を作成して返す 81function generateBody(values) { 82 // var name = values[1]; 83 // var p_name = values[2]; 84 // var mail = values[3]; 85 // var syozoku = values[5]; 86 // var bora = values[6]; 87 // var bikou = values[7]; 88 // 次の行の変数は、シートのA列からの順序に合わせる(必要ない分は,,としてもよい) 89 // const [timeStamp, name, p_name, mail, syounin, syozoku, bora, bikou] = values; 90 const [, name, p_name, mail, , syozoku, bora, bikou] = values; 91 92 // 本文テキスト 93 let plane = ""; 94 // plane += '<ul>'; 95 // plane += '<li>児童名: ' + name + '</li>'; 96 // plane += '<li>保護者名: ' + p_name + '</li>'; 97 // plane += '<li>担当メールアドレス: ' + mail + '</li>'; 98 // plane += '<li>所属: ' + syozoku + '</li>'; 99 // plane += '<li>参加希望のボランティア: ' + bora + '</li>'; 100 // plane += '<li>備考: ' + bikou + ' </li>'; 101 // plane += '</ul>'; 102 plane += '児童名: ' + name + '\n'; 103 plane += '保護者名: ' + p_name + '\n'; 104 plane += '担当メールアドレス: ' + mail + '\n'; 105 plane += '所属: ' + syozoku + '\n'; 106 plane += '参加希望のボランティア: ' + bora + '\n'; 107 plane += '備考: ' + bikou + '\n'; 108 109 // 本文HTML 110 let html = ''; 111 html += '<ul>'; 112 html += '<li>児童名: ' + name + '</li>'; 113 html += '<li>保護者名: ' + p_name + '</li>'; 114 html += '<li>担当メールアドレス: ' + mail + '</li>'; 115 html += '<li>所属: ' + syozoku + '</li>'; 116 html += '<li>参加希望のボランティア: ' + bora + '</li>'; 117 html += '<li>備考: ' + bikou + ' </li>'; 118 html += '</ul>'; 119 120 // 本文を返す 121 // return { plane: plane, html: html }; // キー名と変数名が同じなのでキーを省略できる 122 return { plane, html }; 123}

投稿2023/10/28 02:00

編集2023/10/28 02:08
YellowGreen

総合スコア772

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

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

YellowGreen

2023/10/28 02:01

例によって、修正、保存後はデプロイの新バージョンへの更新を。
kanakoji

2023/10/28 11:20

ありがとうございます。 2023/10/27 19:34に載せたコードの後に、デプロイやトリガーの設定の仕方が悪いのかと何度か試しているうちに、今度は「申請がありました」のメール自体が届かなくなってしまい、E列に「申請中」の文字も表示されなくなってしましました。 YellowGreenさんにお示し頂いたコードをコピペし、新しくデプロイし、トリガーの設定も新しくデプロイしたバージョンに合わせました。 トリガーのsendmessegeにエラーが出てしまっています。 エラーの内容は、 TypeError: Cannot read properties of null (reading 'getRange') at sendMessage(コード:16:9) と表示されています。
YellowGreen

2023/10/28 18:40 編集

シート名が違っているときのエラーです。 なぜか、スクリプトを作ったばかりのときに、 名前は合っているのにそのエラーになることもあります。 シート名は、コピペで設定してみるか、 それでもそのエラーになるときは、私の場合は、 一度シート名とスクリプトの記述を 違う名前に変更して実行してみると エラーが消えるので、 その後に元の名前に再設定しています。
kanakoji

2023/10/30 01:47

ありがとうございます。 頂いたコードで何度も試してみましたが、やはり申請がありましたのメールが届きません。 初歩的な質問かと思いますが、確認させて下さい。 ①デプロイとトリガーの仕方として、新しいバージョンのデプロイを作成する際に、スクリプトの画面上部にある「実行する関数を選択」の部分は特に気にしなくて大丈夫でしょうか? ②トリガーは下記2点で合ってますでしょうか? ・「実行する関数」sendmessege「実行するデプロイ」バージョン1(新しく作成したもの)イベントのソース「スプレッドシートから」イベントの種類「フォーム送信時」 ・「実行する関数」doget「実行するデプロイ」バージョン1(新しく作成したもの)イベントのソース「スプレッドシートから」イベントの種類「編集時」
kanakoji

2023/10/30 01:49

2023/10/28 20:20 こちらの問題のE列の申請中の文字は表示され、トリガーのエラーも0%になりました! ありがとうございます!
YellowGreen

2023/10/30 03:32 編集

1) トリガー(sendMessage関数) 一つだけ設定しますので、現在二つあるなら一度全てを削除してください。 新たなトリガーの設定画面で 実行する関数を選択: sendMessage デプロイ時に実行: Head イベントのソースを選択: スプレッドシートから イベントの種類を選択: フォーム送信時 として保存します。 doGetはデプロイするとアクセスできるようになりますので トリガーの設定は不要です。 2)デプロイ(doGet関数) 右上の青い「デプロイ▽」をクリックします。 一度でもデプロイ済みなら「デプロイを管理」を選択 アクティブの欄のバージョンを選び、右上の鉛筆マークをクリック バージョン: 新バージョン(プルダウンから選べます) 次のユーザーとして実行: 自分のアカウント名(xxxx@gmail.com) アクセスできるユーザー: 全員(Googleアカウントを持つ全員の下にあります。) として右下のデプロイボタンを押します。 こちらは、関数名の選択はありませんが doGet関数を変更したときは改めて新バージョンに更新する必要があります。 またデプロイしていないなら右上の青い「デプロイ▽」から 新しいデプロイを選んで設定画面を表示して 歯車のマークからウェブアプリを選んで 上と同様に設定してから右下のデプロイボタンを押します。
YellowGreen

2023/10/30 09:34

> デプロイを作成する際に、スクリプトの画面上部にある「実行する関数を選択」の部分は特に気にしなくて大丈夫でしょうか? スクリプトエディタ画面上部のデバッグの右にあるプルダウンのことなら、デプロイの時に何が選択されているかを気にしなくて大丈夫です。
kanakoji

2023/10/31 03:47

詳しく教えて頂きありがとうございます。 トリガー・デプロイの設定をしなおしましたが申請がありましたのメールが届かず、前回ご相談にのって頂いた有給申請フォームと異なる箇所を探しておりました。 非常に初歩的なミスで申し訳ありませんが、今回承認申請のメールの宛先は、誰が申請しても固定のメールアドレスに届くようにしたいのです。 do GET関数のconst values = sheet.getRange(row, 1, 1, 8).getValues()[0]; この部分を変える必要があるのかなと思いますが、どのように変えたら良いかご教授下さると幸いです。
YellowGreen

2023/10/31 08:14 編集

申請のときのメールなら3行目のMAIL_ADDRESSで指定した承認者のアドレスにとどくようになってます。 承認したときのメールを申請者ではなく他の方に送りたいのですか? そうであれば、 3行目の次に const MAIL_ADDRESS_2 = 'yyyyyy@yyyyyy.yyy'; //承認結果のメール送付先 を追加した上で、 60行目の const recipient = values[3]; // D列([3])がメールアドレス を const recipient = MAIL_ADDRESS_2; に変更してみてください。
kanakoji

2023/11/12 09:50

Yellow Green様 返信大変遅くなり申し訳ございません。 申請のときのメールが承認者のアドレスに届くようになっているとのこと、理解しました。 承認したときのメールを申請者ではなく他の方に送りたいわけではないので、このままで大丈夫のようです。 やはり何度試してみても、トリガーのsendmessegeにエラーが出てしまうため、申請のメールが届きません。 エラーの内容は、以前から同じで TypeError: Cannot read properties of null (reading 'getRange') at sendMessage(コード:16:9) と表示されています。 シート名のエラーというお話でしたが、もう少し詳しく修正方法を教えて頂くことは出来ますでしょうか?
YellowGreen

2023/11/12 10:51

そのエラーはどのようにして確認していますか?
kanakoji

2023/11/15 11:08

GASのトリガーの画面にて、 sendmessegeのエラー率が100%になっており、そこの一番右の三つの点をクリック、「失敗した実行」をクリック、ステータスに失敗しましたとなっているところをクリックするとエラーの内容が出てきます。
YellowGreen

2023/11/15 23:52 編集

2行目の const SHEET_NAME = 'xxxxxx'; // xxxxxxはシート名 で引用符 ' ' の中に設定しているシート名を引用符を含めずにコピーして、 実際のシート名として貼り付けてからお試しください。 全角半角の違いや空白の有無、記号など見た目でわからないところが違っているのかと思います。 前にも書きましたが、間違えようがない新たなシート名を 2行目の引用符の中に記入して、それをコピペで実際のシートの名前として貼り付けてもいいかと。 エラーが16行目で、15行目ではないので、 1行目の const SS_ID = 'xxxxxx'; // xxxxxxはスプレッドシートIDに の設定は合っていると思います。 もしも、シート名を直してもエラーになるようなら、 const sheet = SpreadsheetApp.openById(SS_ID).getSheetByName(SHEET_NAME); を const sheet = SpreadsheetApp.openById(SS_ID).getSheets()[0];//左端のシートのとき const sheet = SpreadsheetApp.openById(SS_ID).getSheets()[1];//左から2番目のシートのとき const sheet = SpreadsheetApp.openById(SS_ID).getSheets()[2];//左から3番目のシートのとき などのように、シートの場所に応じて最後の[]の中の数字を変えて試してみてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.41%

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

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

質問する

関連した質問