Google Sheet Apps Script报错:TypeError: 无法读取undefined的'Plate'属性
解决Google Apps Script TypeError: Cannot read properties of undefined (reading 'Plate')问题
问题分析
报错TypeError: Cannot read properties of undefined (reading 'Plate')出现在ACar.gs第14行,说明代码尝试读取formData.Plate时,formData变量为undefined。结合代码场景,主要触发原因是:
- 直接在脚本编辑器中手动运行
addDataToCar函数,此时未传入formData参数,导致参数为空; - 同时代码存在隐性问题:收集好的
data数组未被使用,最终写入工作表的是空数组newRow,会导致提交后无数据写入。
修复步骤
- 仅通过表单提交触发
addDataToCar函数,禁止直接在脚本编辑器中运行该函数; - 修正数据写入逻辑,将收集好的
data数组传入appendRow方法; - 添加参数校验和错误处理,避免因参数缺失或异常导致的报错,同时提升用户反馈体验。
修改后的完整代码
Google Apps Script(ACar.gs)
function openForm() { var html = HtmlService.createHtmlOutputFromFile('AddCar') .setWidth(400) .setHeight(600); SpreadsheetApp.getUi() .showModalDialog(html, 'Add Car'); } function addDataToCar(formData) { // 参数校验:避免formData为空时报错 if (!formData) { SpreadsheetApp.getUi().alert('数据传递异常,请通过表单提交数据'); return; } // 校验工作表是否存在 var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Car'); if (!sheet) { SpreadsheetApp.getUi().alert('未找到名为"Car"的工作表'); return; } var data = []; data.push(formData.Plate); data.push(formData.Province); data.push(formData.Type); data.push(formData.Brand); data.push(formData.Model); data.push(formData.License_date); data.push(formData.Chassise); data.push(formData.Engine); data.push(formData.HorsePower); data.push(formData.Size); data.push(formData.Owner); data.push(formData.be_under); data.push(formData.Extra); // 使用收集好的data数组写入工作表 sheet.appendRow(data); // 提交成功提示 SpreadsheetApp.getUi().alert('数据添加成功'); }
HTML代码(AddCar.html)
<!DOCTYPE html> <html> <head> <base target="_top"> </head> <body> <form id="carForm"> <label for="Plate">ทะเบียนรถ:</label> <input type="text" id="Plate" name="Plate"><br><br> <label for="Province">จังหวัด:</label> <input type="text" id="Province" name="Province"><br><br> <label for="Type">ประเภทรถ:</label> <input type="text" id="Type" name="Type"><br><br> <label for="Brand">ยี่ห้อ:</label> <input type="text" id="Brand" name="Brand"><br><br> <label for="Model">รุ่น:</label> <input type="text" id="Model" name="Model"><br><br> <label for="License_date">วันจดทะเบียน:</label> <input type="date" id="License_date" name="License_date"><br><br> <label for="Chassise">เลขคัสซี:</label> <input type="text" id="Chassise" name="Chassise"><br><br> <label for="Engine">เลขเครื่อง:</label> <input type="text" id="Engine" name="Engine"><br><br> <label for="HorsePower">แรงม้า:</label> <input type="text" id="HorsePower" name="HorsePower"><br><br> <label for="Size">ขนาด:</label> <input type="text" id="Size" name="Size"><br><br> <label for="Owner">เจ้าของ:</label> <input type="text" id="Owner" name="Owner"><br><br> <label for="be_under">ผู้ดูแล:</label> <input type="text" id="be_under" name="be_under"><br><br> <label for="Extra">หมายเหตุเพิ่มเติม:</label> <textarea id="Extra" name="Extra" rows="3" cols="50"></textarea><br><br> <input type="button" value="เพิ่มข้อมูล" onclick="submitCData()"> </form> <script> function submitCData() { var formData = { Plate: document.getElementById('Plate').value, Province: document.getElementById('Province').value, Type: document.getElementById('Type').value, Brand: document.getElementById('Brand').value, Model: document.getElementById('Model').value, License_date: document.getElementById('License_date').value, Chassise: document.getElementById('Chassise').value, Engine: document.getElementById('Engine').value, HorsePower: document.getElementById('HorsePower').value, Size: document.getElementById('Size').value, Owner: document.getElementById('Owner').value, be_under: document.getElementById('be_under').value, Extra: document.getElementById('Extra').value }; console.log(formData); // 添加失败处理逻辑 google.script.run .withFailureHandler(function(error) { alert('提交失败: ' + error.message); }) .addDataToCar(formData); google.script.host.close(); } </script> </body> </html>
使用说明
- 确保Google表格中存在名为
Car的工作表,且表头数量与表单字段数量匹配; - 在脚本编辑器中运行
openForm函数打开弹窗表单,禁止直接运行addDataToCar; - 填写表单后点击提交按钮,数据将自动写入
Car工作表,同时会收到操作结果提示。
内容的提问来源于stack exchange,提问作者JIWJIWWANTSHELP
相关产品推荐
相关产品推荐

