Google Sheets表单复选框值获取异常问题求助
解决Google Sheets侧边栏复选框值返回undefined的问题
我来帮你搞定这个复选框取值的问题,咱们先说说问题出在哪,再给你修复后的代码:
问题根源
- 表单对象的局限性:默认的表单提交对象(
formObject)只会包含被选中的复选框,未选中的复选框不会出现在这个对象里,所以你在Google Apps Script里尝试获取object.sunday这类未选中的复选框值时,自然会得到undefined。 - name属性不匹配:你在HTML里给工作日复选框统一设置了
name="Workdays",但在GS里却试图用object.sunday来取值,这完全对应不上;另外OOO复选框的name="ooo",但你用object.isOOO去取,也是不匹配的。
修复方案
我们需要手动收集所有表单元素的值(包括复选框的选中状态),确保每个选项都能传递正确的true/false值,而不是依赖默认的表单对象。
修改后的HTML代码
<!DOCTYPE html> <html> <head> <base target="_top"> <script> function preventFormSubmit() { var forms = document.querySelectorAll('form'); for (var i = 0; i < forms.length; i++) { forms[i].addEventListener('submit', function(event) { event.preventDefault(); }); } } window.addEventListener('load', preventFormSubmit); function submitForm() { // 手动收集所有表单数据,包括每个复选框的选中状态 var formData = { employeename: document.querySelector('[name="employeename"]').value, sunday: document.querySelector('[name="sunday"]').checked, monday: document.querySelector('[name="monday"]').checked, tuesday: document.querySelector('[name="tuesday"]').checked, wednesday: document.querySelector('[name="wednesday"]').checked, thursday: document.querySelector('[name="thursday"]').checked, friday: document.querySelector('[name="friday"]').checked, saturday: document.querySelector('[name="saturday"]').checked, isOOO: document.querySelector('[name="ooo"]').checked }; google.script.run.submitAddEmployee(formData); // 提交后重置表单,提升用户体验 document.getElementById("AddEmployee").reset(); } </script> </head> <body> <form id="AddEmployee" onsubmit="submitForm()"> Employee Name:<br /> <input type="text" name="employeename" /> <hr /><br /> Check boxes that Employee Works:<br /> <input type="checkbox" name="sunday"> Sunday<br /> <input type="checkbox" name="monday" /> Monday<br /> <input type="checkbox" name="tuesday" /> Tuesday<br /> <input type="checkbox" name="wednesday" /> Wednesday<br /> <input type="checkbox" name="thursday" /> Thursday<br /> <input type="checkbox" name="friday" /> Friday<br /> <input type="checkbox" name="saturday" /> Saturday <hr /><br /> <input type="checkbox" name="ooo" />OOO Employee? <br /> <br /> <input type="submit" value="Submit" /> </form> <div id="output"></div> </body> </html>
修改后的Google Apps Script代码
function submitAddEmployee(object) { var emName = object.employeename; // 现在每个日期和OOO的状态都是明确的true/false var sunday = object.sunday; var monday = object.monday; var tuesday = object.tuesday; var wednesday = object.wednesday; var thursday = object.thursday; var friday = object.friday; var saturday = object.saturday; var isOOO = object.isOOO; var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Data"); if (sheet != null) { var nextRow = sheet.getLastRow() + 1; // 一次性写入整行数据,比多次调用setValue更高效 sheet.getRange(nextRow, 1, 1, 10).setValues([[ emName, sunday, monday, tuesday, wednesday, thursday, friday, saturday, isOOO, "False" ]]); } else { // 修正了原代码里的Sheet名称错误(原写的Tasks,应该是Data) Browser.msgBox('Sheet "Data" was not found.'); } }
额外优化点
- 用
setValues一次性写入整行数据,减少对Google Sheets服务的调用次数,提升性能; - 提交表单后自动重置表单,优化用户体验;
- 修正了原GS代码中Sheet名称的错误(把"Tasks"改成了"Data",和你代码里的目标Sheet对应)。
内容的提问来源于stack exchange,提问作者Anthony Bahl
相关产品推荐
相关产品推荐

