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

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

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

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

Q&A

0回答

362閲覧

【GAS】時間表記が9:00で固定されている問題を解決したい

take0509

総合スコア0

Google スプレッドシート

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

0グッド

1クリップ

投稿2023/05/09 01:26

実現したいこと

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

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

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

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

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

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

int32_t

2023/05/09 02:04

> const timeDate = new Date(day + " " + time); 問題が出るときに変数 day と time の内容はどうなっていますか。
take0509

2023/05/09 02:38

コメントありがとうございます。 day=2023/05/17、time=11:00:00 となっております。
bebebe_

2023/05/09 02:57

「あなたは以下の備品購入申請を承認しました」 と表示されるようにはなっていなさそうですがここは想定どおりですか?
take0509

2023/05/09 04:03

すいません、そちらは修正前の表記ミスです… その為ここは想定通りになります。
YellowGreen

2023/05/09 23:08 編集

9:00になるのは時刻timeDateが無効な値から生成されているからだと思われます。(JSTの時差9:00だけになる) 時刻の生成前のところで、 console.log(day + " " + time); のコードを追加して値が 2023/05/17 11:00:00 かどうか確認できます。 まず、 function sendMessage2() { の中の const values = sheet.getRange(row, 1, 1, 6).getValues()[0]; で、時刻の値が引数として渡されているかどうかご確認を。 それから function generateBodies1(values) { の中で const timeDate = new Date(day + " " + time); のところは、 const timeDate = new Date(todayStr+ " " + time); か const timeDate = new Date("1970/01/01 " + time); //(1970/01/01の後ろに半角スペースがあります。) としてみてはどうでしょうか? それでも変わらなければ、 function sendMessage2() { の中の const values = sheet.getRange(row, 1, 1, 6).getValues()[0]; のgetValues()[0]を getDisplayValues().flat(); にしてみるとどうなりますか?
take0509

2023/05/10 08:09

ご記載いただいた通り、 function sendMessage2() { と function doGet(e) { の getValues()[0] を getDisplayValues().flat(); に変えることで正しく時間を取得することができました…! また、「9:00になるのは時刻timeDateが無効な値から生成されている」とのこと、勉強になりました。 本当にありがとうございます。
take0509

2023/05/10 08:10

コメントくださった皆様、ありがとうございました。 またマルチポスト非推奨とのこと、把握しておらず申し訳ございません。 以後気を付けてまいります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問