実現したいこと
スプレッドシートにリストを持っている
html(gas作成)にスプレッドシートのリスト(jsで作成するカレンダーとマージして)を表示させたい
前提
予約システムを作成中
gasでHTMLを作成中(googlesフォームだとエラーチェックができないため)
詳しくないため、いろいろなページを見ながら作成中(なのでコードがごちゃごちゃしています)
スプレッドシートに予約可能数は保存されています
スプレッドシートイメージ
|日付|予約上限|予約数|予約可能数
|3/1|10|2|8
|3/2|10|3|7
|3/3|10|2|8
|3/4|30|28|2
※スプレッドシートの予約数は関数を組んで実際の予約から計算して表示しています
※予約可能数は予約上限-予約数です
できていること
◇カレンダーの表示
html(calender.html)にはJSを利用してカレンダーを表示しています
(一か月先まで受付可能としたく、2か月分のカレンダーを表示)
◇スプレッドシートデータ取得
bodyに<? ?>と埋め込み式に表示することは可能
こまっていること と やったこと
①<? の内容をJSに移動すると何も表示されなくなる
→var をconstにしたら改善したことがあったので変更してみましたがNGでした
②予約表は以前からの日付が入っており、カレンダーとマージしたい
→①ができないので実現できなかった。今日日付は取得できているので、スプレッドシートの値を入れたdateのdate[i][0]をforで回せば取得できますでしょうか?
③スプレッドシートの値(日付)が長くなる
:Wed Mar 01 2023 00:00:00 GMT+0900 (日本標準時)
→toStringDateや toDateが使えるとありましたがいずれもダメでした
発生している問題・エラーメッセージ
エラーメッセージは表示されずそもそもカレンダーが表示されない
OKなソースコード(ただしカレンダーとリストが別々に表示される)
<!DOCTYPE html> <html> <head> <base target="_top"> </head> <body> <div id="calendar" class="field"></div> </body> <h2>Gas埋め込みテスト</h2> <br /> <? var ssId = 'XXXXXXXXXXXXXXXX'; var ss = SpreadsheetApp.openById(ssId); var sheetName = 'シート1'; var data = ss.getSheetByName(sheetName).getDataRange().getValues(); var result = '<table border="1">'; for(var i=0; i<data.length; i++){ result += '<tr>'; result += "<td>" + data[i][0].toString() + "</td>"; result += "<td>" + data[i][3].toString() + "</td>"; result += '</tr>'; } result += '</table>'; output._ = result; ?> <script> function goToNext() { google.script.run .withSuccessHandler(function(result) { // 成功 // resultとしてHTMLが返されます。 }) .withFailureHandler(function(result) { // 失敗 }).gotoSecondPages(/*渡したいデータ*/); } const weeks = ['日', '月', '火', '水', '木', '金', '土'] const date = new Date() let year = date.getFullYear() let month = date.getMonth() + 1 const config = { show: 2, } function showCalendar(year, month) { for ( i = 0; i < config.show; i++) { const calendarHtml = createCalendar(year, month) const sec = document.createElement('section') sec.innerHTML = calendarHtml document.querySelector('#calendar').appendChild(sec) month++ if (month > 12) { year++ month = 1 } } } function createCalendar(year, month) { const today_day = new Date().getDate() const today_month = new Date().getMonth() +1 const startDate = new Date(year, month - 1, 1) // 月の最初の日を取得 const endDate = new Date(year, month, 0) // 月の最後の日を取得 const endDayCount = endDate.getDate() // 月の末日 const lastMonthEndDate = new Date(year, month - 2, 0) // 前月の最後の日の情報 const lastMonthendDayCount = lastMonthEndDate.getDate() // 前月の末日 const startDay = startDate.getDay() // 月の最初の日の曜日を取得 let dayCount = 1 // 日にちのカウント let calendarHtml = '' // HTMLを組み立てる変数 calendarHtml += '<h1>' + year + '/' + month + '</h1>' calendarHtml += '<table>' // 曜日の行を作成 for (let i = 0; i < weeks.length; i++) { calendarHtml += '<td>' + weeks[i] + '</td>' } for (let w = 0; w < 6; w++) { calendarHtml += '<tr>' for (let d = 0; d < 7; d++) { if (w == 0 && d < startDay) { // 1行目で1日の曜日の前 let num = lastMonthendDayCount - startDay + d + 1 calendarHtml += '<td class="is-disabled">' + num + '</td>' } else if (dayCount > endDayCount) { // 末尾の日数を超えた let num = dayCount - endDayCount calendarHtml += '<td class="is-disabled">' + num + '</td>' dayCount++ } else { if( month == today_month && dayCount <= today_day){ calendarHtml += `<td class="is-disabled">${dayCount}</td>` //calendarHtml += `<td class="calendar_td" data-date="${year}/${month}/${dayCount}">${dayCount}</td>` }else{ calendarHtml += `<td class="calendar_td" data-date="${year}/${month}/${dayCount}">${dayCount}</br>予約数</td>` } dayCount++ } } calendarHtml += '</tr>' } calendarHtml += '</table>' return calendarHtml } showCalendar(year, month) </script>
NGなソースコード(何も表示されない)
<!DOCTYPE html> <html> <head> <base target="_top"> </head> <body> <div id="calendar" class="field"></div> </body> <h2>Gas埋め込みテスト</h2> <br /> <script> function goToNext() { google.script.run .withSuccessHandler(function(result) { // 成功 // resultとしてHTMLが返されます。 }) .withFailureHandler(function(result) { // 失敗 }).gotoSecondPages(/*渡したいデータ*/); } const weeks = ['日', '月', '火', '水', '木', '金', '土'] const date = new Date() let year = date.getFullYear() let month = date.getMonth() + 1 const config = { show: 2, } function showCalendar(year, month) { for ( i = 0; i < config.show; i++) { const calendarHtml = createCalendar(year, month) const sec = document.createElement('section') sec.innerHTML = calendarHtml document.querySelector('#calendar').appendChild(sec) month++ if (month > 12) { year++ month = 1 } } } function createCalendar(year, month) { var ssId = 'XXXXXXXXXXXXXXXX'; var ss = SpreadsheetApp.openById(ssId); var sheetName = 'シート1'; var data = ss.getSheetByName(sheetName).getDataRange().getValues(); const today_day = new Date().getDate() const today_month = new Date().getMonth() +1 const startDate = new Date(year, month - 1, 1) // 月の最初の日を取得 const endDate = new Date(year, month, 0) // 月の最後の日を取得 const endDayCount = endDate.getDate() // 月の末日 const lastMonthEndDate = new Date(year, month - 2, 0) // 前月の最後の日の情報 const lastMonthendDayCount = lastMonthEndDate.getDate() // 前月の末日 const startDay = startDate.getDay() // 月の最初の日の曜日を取得 let dayCount = 1 // 日にちのカウント let calendarHtml = '' // HTMLを組み立てる変数 calendarHtml += '<h1>' + year + '/' + month + '</h1>' calendarHtml += '<table>' // 曜日の行を作成 for (let i = 0; i < weeks.length; i++) { calendarHtml += '<td>' + weeks[i] + '</td>' } for (let w = 0; w < 6; w++) { calendarHtml += '<tr>' for (let d = 0; d < 7; d++) { if (w == 0 && d < startDay) { // 1行目で1日の曜日の前 let num = lastMonthendDayCount - startDay + d + 1 calendarHtml += '<td class="is-disabled">' + num + '</td>' } else if (dayCount > endDayCount) { // 末尾の日数を超えた let num = dayCount - endDayCount calendarHtml += '<td class="is-disabled">' + num + '</td>' dayCount++ } else { if( month == today_month && dayCount <= today_day){ calendarHtml += `<td class="is-disabled">${dayCount}</td>` //calendarHtml += `<td class="calendar_td" data-date="${year}/${month}/${dayCount}">${dayCount}</td>` }else{ calendarHtml += `<td class="calendar_td" data-date="${year}/${month}/${dayCount}">${dayCount}</td>` } dayCount++ } } calendarHtml += '</tr>' } calendarHtml += '</table>' return calendarHtml } ) showCalendar(year, month) </script>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/03/26 12:20
2023/03/26 14:14