Google Apps Script(GAS)とHTMLを使って、スプレッドシート「予約管理」の情報を検索・表示する仕組みを作っています。
📌 現在の状況
- スプレッドシートの「新規予約」シートを対象にしています(※下記にスクリーンショット添付予定)
- チェックイン日やコードなどで検索できるようにしています
- GAS側の
searchNewReservations()
をtestSearchDirect()
で実行すると、ログにはヒット件数も正しく出ます - しかし HTML 側で検索を実行すると、データが表示されず
null
や[]
が返ってきてしまいます
🧪 試したこと
parseDate()
の書き換え(Date型か文字列かなどをいろいろ試しました)- チェックイン・チェックアウト列のセル書式を Google スプレッドシートで「日付」に明示
- GAS内の return 値が
[]
ではないことを Logger で確認済み - JS 側の
console.log(results)
にもnull
や[]
が表示されてしまいます - 条件をゆるめたり、パラメータを空にしても変化なし
🤔 知りたいこと
- GASの関数ではヒットしているのに、なぜ HTML 側に結果が渡ってこないのでしょうか?
results
がnull
または[]
になる原因として、他に考えられる可能性はありますか?- JS側で
google.script.run.withSuccessHandler(...)
を使っていても、このような症状になる要因があれば教えていただきたいです
🧩 使用中のコード
code.gs
javascript
1// code.gs 2function doGet() { 3 return HtmlService.createHtmlOutputFromFile('search'); 4} 5 6function searchNewReservations(params = {}) { 7 try { 8 const sheet = SpreadsheetApp.openById("188gf3L00CMpHWWVa1HHJxoHbKB6sYTorS0dKR-_Rt8s") 9 .getSheetByName("新規予約"); 10 const data = sheet.getDataRange().getValues(); 11 const results = []; 12 13 const parseDate = d => { 14 if (!d) return null; 15 if (Object.prototype.toString.call(d) === "[object Date]") return d; 16 return new Date(d.toString().replace(/-/g, "/")); 17 }; 18 19 const checkinStart = parseDate(params.checkinStart); 20 const checkinEnd = parseDate(params.checkinEnd); 21 const checkoutStart = parseDate(params.checkoutStart); 22 const checkoutEnd = parseDate(params.checkoutEnd); 23 24 if (checkinStart) checkinStart.setHours(0, 0, 0, 0); 25 if (checkinEnd) checkinEnd.setHours(0, 0, 0, 0); 26 if (checkoutStart) checkoutStart.setHours(0, 0, 0, 0); 27 if (checkoutEnd) checkoutEnd.setHours(0, 0, 0, 0); 28 29 for (let i = 1; i < data.length; i++) { 30 const row = data[i]; 31 const property = row[1]; 32 const code = row[2]; 33 const checkin = parseDate(row[3]); 34 const checkout = parseDate(row[4]); 35 36 if (!checkin || !checkout) continue; 37 38 checkin.setHours(0, 0, 0, 0); 39 checkout.setHours(0, 0, 0, 0); 40 41 const match = 42 (!params.property || property === params.property) && 43 (!params.code || code === params.code) && 44 (!checkinStart || checkin >= checkinStart) && 45 (!checkinEnd || checkin <= checkinEnd) && 46 (!checkoutStart || checkout >= checkoutStart) && 47 (!checkoutEnd || checkout <= checkoutEnd); 48 49 if (match) { 50 results.push({ rowIndex: i + 1, row }); 51 } 52 } 53 54 return results; 55 56 } catch (error) { 57 Logger.log("❌ searchNewReservationsでエラー:"); 58 Logger.log(error.message); 59 Logger.log(error.stack); 60 return []; 61 } 62} 63 64### `search.html` 65 66```html 67// search.html 68 69<script> 70 function searchReservations() { 71 const checkinStart = document.getElementById('checkinStart').value; 72 const checkinEnd = document.getElementById('checkinEnd').value; 73 74 const params = { 75 checkinStart, 76 checkinEnd, 77 }; 78 79 google.script.run 80 .withSuccessHandler(results => { 81 console.log("📦 JSで受け取った結果:", results); // ← nullや[]になる 82 renderTable(results); 83 }) 84 .searchNewReservations(params); 85 } 86 87 function renderTable(results) { 88 const table = document.getElementById('results'); 89 table.innerHTML = ''; 90 91 if (!results || results.length === 0) { 92 table.innerHTML = '<tr><td>該当データがありません</td></tr>'; 93 return; 94 } 95 96 results.forEach(({ row }) => { 97 const tr = document.createElement('tr'); 98 row.forEach(cell => { 99 const td = document.createElement('td'); 100 td.textContent = cell; 101 tr.appendChild(td); 102 }); 103 table.appendChild(tr); 104 }); 105 } 106</script> 107

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。