
本文旨在解决在使用 Google App Script 构建表单时,动态生成的 HTML `
在使用 Google App Script 构建交互式 Web 应用时,我们常会遇到需要从后端(如 Google Sheet)动态加载数据填充前端 HTML <select> 下拉列表的场景。尽管用户界面上可以看到并选择了正确的选项,但在表单提交时,该下拉列表的值却未能被正确捕获或传输到后端。
造成此问题的原因通常有以下几点:
解决动态下拉列表值提交问题的关键在于两点:一是使用正确且健壮的 JavaScript 方法获取选中值;二是将这个值明确地整合到表单提交的数据中。
针对 jQuery 环境,获取 <select> 元素选中值的最可靠方法是:
$('#CATEGORY').find(":selected").val();注意: 在大多数现代 jQuery 版本中,直接使用 $('#CATEGORY').val() 也能获取到选中 option 的 value 属性。find(":selected").val() 提供了更明确的语义,在某些边缘情况下可能更为稳健。
由于原 onSelect 函数没有实际作用,我们需要修改表单的提交处理函数 handleFormSubmit,以确保在将数据发送到 Google App Script 后端之前,手动将 CATEGORY 的选中值添加到 formdata 中。
原始 handleFormSubmit 结构:
function handleFormSubmit() {
var formdata = $('#myForm').serializeArray()
formdata.push({
name: 'myfile',
value: myfile
})
google.script.run.withSuccessHandler(success).processForm(formdata);
}修改后的 handleFormSubmit:
function handleFormSubmit() {
var formdata = $('#myForm').serializeArray();
// 确保 CATEGORY 的值被正确获取并添加到 formdata
var categoryValue = $('#CATEGORY').find(":selected").val();
// 检查是否已存在 CATEGORY 字段,如果存在则更新,否则添加
var categoryExists = false;
for (var i = 0; i < formdata.length; i++) {
if (formdata[i].name === 'CATEGORY') {
formdata[i].value = categoryValue;
categoryExists = true;
break;
}
}
if (!categoryExists) {
formdata.push({
name: 'CATEGORY',
value: categoryValue
});
}
// 处理文件上传(如果适用)
formdata.push({
name: 'myfile',
value: myfile
});
google.script.run.withSuccessHandler(success).processForm(formdata);
}这段代码首先通过 serializeArray() 获取了大部分表单数据,然后显式地获取了 CATEGORY 下拉列表的选中值。接着,它会检查 formdata 中是否已经存在 CATEGORY 字段(如果 serializeArray() 已经成功捕获到),如果存在则更新其值,否则就将其作为一个新字段添加到 formdata 数组中。
下面是整合了上述解决方案的客户端 JavaScript 和 HTML 代码片段。
HTML (保持不变,但强调 name 属性):
<label for="CATEGORY"><strong>CATEGORY</strong></label>
<select id="CATEGORY" onchange="onSelect()" class="form-control" name="CATEGORY" required>
</select>
<script>
loadItem(); // 页面加载时调用,填充下拉列表
</script>注意: <select> 标签的 name="CATEGORY" 属性至关重要,它决定了在表单提交时该字段的名称。
JavaScript (客户端部分):
<script>
// 负责从 Google App Script 获取数据并填充下拉列表
function loadItem() {
google.script.run.withSuccessHandler(function(ar) {
var itemSelect = document.getElementById("CATEGORY");
console.log("Category data received:", ar);
// 添加一个空选项作为占位符或提示
let defaultOption = document.createElement("option");
defaultOption.value = "";
defaultOption.text = "-- Select a Category --"; // 更好的用户体验
itemSelect.appendChild(defaultOption);
// 遍历数组,为每个项目创建选项
ar.forEach(function(item) {
let option = document.createElement("option");
option.value = item[1]; // 确保这里的值是您希望提交的实际数据
option.text = item[0]; // 显示给用户看的文本
itemSelect.appendChild(option);
});
}).getList(); // 调用 Code.gs 中的 getList 函数
}
// onSelect 函数现在可以移除或根据需要进行其他操作
// 如果不需要实时响应,可以将其留空或移除
function onSelect() {
console.log("Selected category value:", $('#CATEGORY').find(":selected").val());
// 如果需要,可以在这里执行其他操作,例如根据选择动态改变其他字段
}
// 阻止表单默认提交行为,并处理自定义提交逻辑
function preventFormSubmit() {
var forms = document.querySelectorAll('form');
for (var i = 0; i < forms.length; i++) {
forms[i].addEventListener('submit', function (event) {
event.preventDefault();
handleFormSubmit(); // 调用自定义的提交处理函数
});
}
}
window.addEventListener('load', preventFormSubmit);
// 自定义表单提交处理函数
function handleFormSubmit() {
var formdata = $('#myForm').serializeArray();
// 确保 CATEGORY 的值被正确获取并添加到 formdata
var categoryValue = $('#CATEGORY').find(":selected").val();
var categoryExists = false;
for (var i = 0; i < formdata.length; i++) {
if (formdata[i].name === 'CATEGORY') {
formdata[i].value = categoryValue;
categoryExists = true;
break;
}
}
if (!categoryExists) {
formdata.push({
name: 'CATEGORY',
value: categoryValue
});
}
// 处理文件上传(如果您的表单包含文件)
formdata.push({
name: 'myfile',
value: myfile // 确保 myfile 变量在全局或可访问范围内定义
});
console.log("Form data to be submitted:", formdata); // 调试用
google.script.run.withSuccessHandler(success).processForm(formdata);
}
// 提交成功后的处理函数
function success(){
document.getElementById("myForm").reset();
Swal.fire({
position: 'center',
icon: 'success',
title: 'THE FILE HAS BEEN ADDED!',
showConfirmButton: false,
timer: 3500,
});
// 延迟重定向
setTimeout(function() {
window.location.reload(); // 刷新页面
}, 3000);
}
// 文件上传相关代码 (保持不变)
var myfile = {}, file, reader = new FileReader();
reader.onloadend = function(e) {
myfile.data = e.target.result;
myfile.name = file.name;
console.log("File data loaded:", myfile);
};
$('#file').change(function(){
file = $('#file')[0].files[0];
reader.readAsDataURL(file);
});
</script>Google Apps Script (Code.gs) 中的 getList() 和 processForm() 函数基本保持不变,因为前端已经确保了 formdata 数组中包含了正确的 CATEGORY 值。
Code.gs (获取列表数据):
function getList() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var dataSheet = ss.getSheetByName('Category');
var getLastRow = dataSheet.getLastRow();
// 返回从第二行第二列开始,到倒数第二行、两列的数据
// 确保 item[1] 是您希望作为 value 的数据,item[0] 是作为 text 的数据
return dataSheet.getRange(2, 2, getLastRow - 1, 2).getValues();
}Code.gs (处理表单提交):
function processForm(formdata){
// 假设 SuperScript.initSuper 和 uploadFile 已经定义
// var superscript = SuperScript.initSuper(url,sh); // 根据您的实际情况初始化
var formObject = {};
formdata.forEach(element => formObject[element.name] = element.value);
// 如果有文件上传,处理文件
// var file = superscript.uploadFile(folderId,formObject.myfile.data,formObject.myfile.name);
var ss= SpreadsheetApp.openByUrl(url); // 确保 url 变量已定义
var ws=ss.getSheets()[0]; // 或者通过名称获取 ws = ss.getSheetByName('Sheet1');
// 将数据追加到工作表
ws.appendRow([
formObject.col1, // 确保这些字段在 formdata 中存在
formObject.col2,
new Date(),
formObject.TITLE,
formObject.SUBTITLE,
formObject.DESCRIPTION,
formObject.TYPE,
formObject.YEAR_RELEASED,
formObject.CATEGORY, // 现在这个值应该能正确获取到
// file ? file.getUrl() : '' // 如果有文件上传,则添加文件URL
]);
}在 processForm 函数中
以上就是Google App Script 中动态下拉列表值获取与提交指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号