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

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

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

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

Google フォーム

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

Google Apps Script

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

Q&A

解決済

1回答

2880閲覧

Googleフォームを使った承認ワークフローで送信されるメールの日付と文字列が正常に反映されない

catmail

総合スコア2

Google スプレッドシート

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

Google フォーム

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

Google Apps Script

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

0グッド

2クリップ

投稿2022/07/14 07:12

前提

https://tonari-it.com/gas-workflow-url-parameter/
こちらのシリーズを参考に、Googleフォームでワークフローを作成しています。
承認の項目を付けるところまでは問題なく作れたのですが、
この最後のページの「承認」と「否認」を選択できるように作成を試みたところ、承認or否認後のメール本文内、クリック後のページの両方に表示される日付の形式が変換されてしまうことと、選択によって変更する「承認」と「否認」の文字列が正常に反映しない状態になりました。

実現したいこと

  • 日付を yyyy/mm/dd の形式で表示したい
  • ${result[answer]} と表示されてしまう部分を、回答結果により 承認 否認 と表示されるようにしたい

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

↓フォーム送信後に承認者へ配信されるメール本文(問題なし)

イメージ説明

↓承認or否認後に送信されるメール本文&クリック後に表示されるページ(文字列と日付に不具合あり)

イメージ説明

表示上ではおかしいのですが、スプレッドシートに記録されるデータは正常に記録されています。

メール送信のコード

function sendMessage(e) { const row = e.range.getRow(); const sheet = e.range.getSheet(); sheet.getRange(row, 11).setValue('申請中'); const bodies = generateBodies(e.values); let url = 'ウェブアプリケーションのURL'; url += `?row=${row}&answer=`; const recipient = '承認者のメールアドレス'; const subject = '●●●●●承認依頼'; let body = ''; body += '以下の●●●申請がありました。\n\n'; body += bodies.plain; body += '承認する場合は、以下URLをクリックしてください\n'; body += url + 'ok'; body += '否認する場合は、以下URLをクリックしてください\n'; body += url + 'ng'; let html = ''; html += '<h1>●●●●●承認依頼</h1>'; html += '<p>以下の●●●申請がありました。</p>'; html += bodies.html; html += `<p><a href="${url}ok">[ 承認 ]</a>  <a href="${url}ng">[ 否認 ]</a></p>`; GmailApp.sendEmail(recipient, subject, body, {htmlBody: html}); }

承認・否認機能のコード

function doGet(e) { const row = e.parameter.row; const sheet = SpreadsheetApp.getActiveSheet(); const values = sheet.getRange(row, 1, 1, 11).getValues()[0]; const bodies = generateBodies(values); const answer = e.parameter.answer; const result = { ok: '承認', ng: '否認' }; sheet.getRange(row, 11).setValue(result[answer]); const recipient = bodies.email; const subject = '●●●申請 ${result[answer]}通知'; let body = ''; body += '以下の●●●申請が${result[answer]}されました。\n\n'; body += bodies.plain; let html = ''; html += '<h1>●●●申請 ${result[answer]}通知</h1>'; html += '<p>以下の●●●申請が${result[answer]}されました。</p>'; html += bodies.html; GmailApp.sendEmail(recipient, subject, body, {htmlBody: html}); html = ''; html += '<h1>●●●申請 ${result[answer]}</h1>'; html += '<p>以下の●●●申請を${result[answer]}しました。</p>'; html += bodies.html; return HtmlService.createHtmlOutput(html); }

メールのテンプレート化コード

function generateBodies(values){ const [timeStamp, email, dept , name , day , ●●●, ●●●, ●●●, ●●●, ●●●] = values; let plain = ''; plain += `・営業所: ${dept}\n`; plain += `・申請者名: ${name}\n`; plain += `・使用希望日: ${day}\n`; plain += `・●●●: ${●●●}\n`; plain += `・●●●: ${●●●}\n`; plain += `・●●●: ${●●●}\n`; plain += `・●●●: ${●●●}\n\n`; let html = '<ul>'; html += `<li>営業所: ${dept}</li>`; html += `<li>申請者名: ${name}</li>`; html += `<li>使用希望日: ${day}</li>`; html += `<li>●●●: ${●●●} (${no})</li>`; html += `<li>●●●: ${●●●}</li>`; html += `<li>●●●: ${●●●}</li>`; html += `<li>●●●: ${●●●}</li>`; html += '</ul>'; return { email: email, plain: plain, html: html }; }

マニフェストファイル

{ "timeZone": "Asia/Tokyo", "dependencies": {}, "exceptionLogging": "STACKDRIVER", "oauthScopes": [ "https://www.googleapis.com/auth/spreadsheets.currentonly", "https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/forms", "https://www.googleapis.com/auth/gmail.send", "https://www.googleapis.com/auth/gmail.compose", "https://www.googleapis.com/auth/gmail.modify", "https://mail.google.com/", "https://www.googleapis.com/auth/gmail.addons.current.action.compose", "https://www.googleapis.com/auth/script.external_request" ], "runtimeVersion": "V8", "webapp": { "executeAs": "USER_DEPLOYING", "access": "DOMAIN" } }

試したこと

以前の質問でシングルクオーテーションの入力ミスを指摘していただいたので、間違って入力しないよう参考先からコピペしてきたのですが、正常に機能しませんでした。

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

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

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

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

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

catmail

2022/07/19 04:57

ご回答ありがとうございます。 日付について、const formattedDay= Utilities.formatDate(day , 'Asia/Tokyo', 'yyyy/MM/dd');を追加したところ、メールが送信されてこなくなりました。 トリガーのエラーを確認したところ Exception: パラメータ(String,String,String)が Utilities.formatDate のメソッドのシグネチャと一致しません。 というエラーが発生しております。 ${result[answer]} の表示については、バッククオートに変更したところ無事に正常に反映するようになりました。
退会済みユーザー

退会済みユーザー

2022/07/19 13:35

修正しました
guest

回答1

0

ベストアンサー

日付を yyyy/mm/dd の形式で表示したい

メールのテンプレート化コード内で、日付(day)に対して Utilities.formatDate を使用します。
ただし、フォームから渡される回答データ( sendMessage(e) の eに渡されるデータ)の日付は文字列である一方、
スプレッドシートからgetValues() で取得したデータの日付は、Dateオブジェクトです。
前者に対して、そのまま Utilities.formatDate を適用するとエラーになります。

そこで、両方に対応できるように、generateBodies の中で、day を Dateオブジェクトのコンストラクタの引数に指定します。

Utilities.formatDate(new Date(day) , 'Asia/Tokyo', 'yyyy/MM/dd');

修正後の generateBodies 関数の全体は下記の通りです。

js

1function generateBodies(values){ 2 const [timeStamp, email, dept , name , day , ●●●, ●●●, ●●●, ●●●, ●●●] = values; 3 let plain = ''; 4 const formattedDay= Utilities.formatDate(new Date(day) , 'Asia/Tokyo', 'yyyy/MM/dd'); 5 plain += `・営業所: ${dept}\n`; 6 plain += `・申請者名: ${name}\n`; 7 plain += `・使用希望日: ${formattedDay}\n`; 8 plain += `・●●●: ${●●●}\n`; 9 plain += `・●●●: ${●●●}\n`; 10 plain += `・●●●: ${●●●}\n`; 11 plain += `・●●●: ${●●●}\n\n`; 12 let html = '<ul>'; 13 html += `<li>営業所: ${dept}</li>`; 14 html += `<li>申請者名: ${name}</li>`; 15 html += `<li>使用希望日: ${formattedDay}</li>`; 16 html += `<li>●●●: ${●●●}${no})</li>`; 17 html += `<li>●●●: ${●●●}</li>`; 18 html += `<li>●●●: ${●●●}</li>`; 19 html += `<li>●●●: ${●●●}</li>`; 20 html += '</ul>'; 21 return { 22 email: email, 23 plain: plain, 24 html: html 25 }; 26}

${result[answer]} と表示されてしまう部分を、回答結果により 承認 否認 と表示されるようにしたい

→承認・否認機能のコード中で${□□}を使っている部分が、すべてシングルクオーテーション(「'」)で囲まれてしまっています。
シングルクォーテーションではなく、バッククオート(「`」)で囲まないと正常に反映されません。

例)

js

1html += '<h1>●●●申請 ${result[answer]}通知</h1>';


シングルクォーテーションをバッククオートに変える

js

1html += `<h1>●●●申請 ${result[answer]}通知</h1>`;

投稿2022/07/14 11:06

編集2022/07/19 13:34
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

catmail

2022/07/20 07:43

回答、修正等ありがとうございました!2箇所とも無事に解決致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問