実現したいこと
2段階の承認フローを作成したいが、時間が正しく表示されないので修正したい
前提
Googleフォームを利用して休暇申請を上長・社長の承認を2段階で取るシステムを作成しています。
①Googleフォームで内容を送信
②入力内容が上長にメールで届く[sendMessage1(e)起動]
※メールで送るメッセージをプレーンでもHTMLでも送れるよう[generateBodies1(values)]を使用
③上長がメール内の「承認」ボタンを押すと、回答集計スプレッドシートの状況列が"二次確認中"に書き換えられる+承認者に承認内容のWebページが表示[doGet(e)起動]
④時間トリガーで回答集計スプレッドシートの状況列が「二次確認中」の場合に社長にメールを送信[sendMessage2()起動]
⑤社長がメール内の「承認」ボタンを押すと、回答集計スプレッドシートの状況列が"承諾"に書き換えられる+承認者に承認内容のWebページが表示+申請者に承認メール送信[doGet(e)起動]
以下の【発生している問題・エラーメッセージ】は、休暇種類項目「特別休暇」・期間項目「2023/05/17」・時間「11:00」でフォーム回答した場合に、Webページで表示される内容になります。
時間に関して、どの時間を入力してもフローの③以降9:00しか表示されません。
発生している問題・エラーメッセージ
休暇申請の承認 あなたは以下の備品購入申請を承認しました 休暇種類: 特別休暇 期間: 2023-05-17 時間: 9:00 備考:
該当のソースコード
function sendMessage1(e) { const row = e.range.getRow(); const sheet = e.range.getSheet(); sheet.getRange(row, 7).setValue('一次確認中'); const bodies = generateBodies1(e.values); let url = 'https://~exec'; //公開したウェブアプリケーションのURL url += `?row=${row}&answer=`; const recipient = '~@gmail.com'; //承認者メールアドレス 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>をクリックしてください</p>`; html += `<p>否認する場合は、<a href="${url}ng">[否認]</a>をクリックしてください</p>`; GmailApp.sendEmail(recipient, subject, body, { htmlBody: html }); } function generateBodies1(values) { const [timeStamp, email, kinds, day, time, memo] = values; const dayDate = new Date(day); const todayStr = Utilities.formatDate(dayDate, 'Asia/Tokyo', 'yyyy-MM-dd'); const timeDate = new Date(day + " " + time); const totimeStr = Utilities.formatDate(timeDate, 'Asia/Tokyo', "H:mm"); let plain = ''; plain += `・休暇種類: ${kinds}\n`; plain += `・期間: ${todayStr}\n`; plain += `・時間: ${totimeStr} \n`; plain += `・備考: ${memo}\n`; let html = '<ul>'; html += `<li>休暇種類: ${kinds}</li>`; html += `<li>期間: ${todayStr}</li>`; html += `<li>時間: ${totimeStr}</li>`; html += `<li>備考: ${memo}</li>`; html += '</ul>'; return { email: email, plain: plain, html: html }; } function doGet(e) { const row = e.parameter.row; const sheet = SpreadsheetApp.getActiveSheet(); const values = sheet.getRange(row, 1, 1, 6).getValues()[0]; const bodies = generateBodies1(values); const answer = e.parameter.answer; const result = { ok: '承認', ng: '否認' }; var situation = sheet.getRange(row, 7).getValue(); if (result[answer] === '承認') { if (situation === '一次確認中') { //1回目の場合 sheet.getRange(row, 7).setValue("二次確認中"); html = ''; html += `<h1>休暇申請の${result[answer]}</h1>`; html += `<p>あなたは以下の休暇申請を${result[answer]}しました</p>`; html += bodies.html; return HtmlService.createHtmlOutput(html); } else { sheet.getRange(row, 7).setValue("承認"); 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); } } else if (result[answer] === '否認') { sheet.getRange(row, 7).setValue("否認"); 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 sendMessage2() { var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('フォームの回答 1'); //「確認用」シートを取得 var lastRow = sheet.getRange(1, 1).getNextDataCell(SpreadsheetApp.Direction.DOWN).getRow(); //「工事名称」列の最終行を取得 //https://tinyurl.com/27kh998w for (var i = 1; i <= lastRow; i++) { //17行目から工事名称が入っている最終行まで繰り返し const row = i; const values = sheet.getRange(row, 1, 1, 6).getValues()[0]; const bodies1 = generateBodies1(values); let url = 'https://~/exec'; //公開したウェブアプリケーションのURL url += `?row=${row}&answer=`; const recipient = '~@gmail.com'; //承認者メールアドレス const subject = '休暇申請のお知らせ'; var val = sheet.getRange(row, 7).getValue()//「状況」セル取得 if (val === "二次確認中") {/* 「一次確認中」なら何もしない */; let body = ''; body += '以下の休暇申請がありました。\n\n'; body += bodies1.plain; + "\n\n" body += '承認する場合は、以下URLをクリックしてください\n'; body += url + 'ok'; body += '否認する場合は、以下URLをクリックしてください\n'; body += url + 'ng'; let html = ''; html += '<h1>休暇申請のお知らせ</h1>'; html += '<p>以下の休暇申請がありました。</p>'; html += bodies1.html; + "\n\n" html += `<p>承認する場合は、<a href="${url}ok">[承認]</a>をクリックしてください</p>`; html += `<p>否認する場合は、<a href="${url}ng">[否認]</a>をクリックしてください</p>`; GmailApp.sendEmail(recipient, subject, body, { htmlBody: html }); } else {/* 「二次承認」なら何もしない */; ; } } }
試したこと
補足情報(FW/ツールのバージョンなど)

あなたの回答
tips
プレビュー