javascript - HTML 表单中的依赖下拉列表
问题描述
我的 HTML 表单中需要一个依赖下拉列表。
我参考 了http://jsfiddle.net/k148pk76/1/ 来制作下面的代码。
“依赖”下拉列表没有被填充。
代码.gs
function doGet(request) {
return HtmlService.createTemplateFromFile('Index').evaluate();
}
/* @Include JavaScript and CSS Files */
function include(filename) {
return HtmlService.createHtmlOutputFromFile(filename)
.getContent();
}
/* @Process Form */
function processForm(formObject) {
var url = "https://docs.google.com/spreadsheets/d/1fCCi2-dvA9K_pxlOkO3BSLkUDPiphVtu2gkNp4_zQR4/edit#gid=284578578";
var ss = SpreadsheetApp.openByUrl(url);
var ws = ss.getSheetByName("Survey");
ws.appendRow(
[
new Date(),
formObject.surveyor,
formObject.company,
formObject.product,
formObject.rating,
formObject.rem,
]
);
}
索引.html
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<?!= include('JavaScript'); ?>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-6">
<form id="myForm" onsubmit="handleFormSubmit(this);">
<p class="h4 mb-4 text-left">Product satisfaction Survey</p>
<div class="form-group">
<label for="Surveyor">Surveyor (Select one)</label>
<select class="form-control" id="surveyor" name="surveyor" required>
<option selected disabled hidden style='display: none' value=''></option>
<option value="S1">S1</option>
<option value="S2">S2</option>
<option value="S3">S3</option>
<option value="S4">S4</option>
</select>
</div>
<div class="form-group">
<label for="company">company (Select one)</label>
<select name="company" id="company" onChange="changeCompany(this.value);"> <option value="" disabled selected>Select</option>
<option value="C1">C1</option>
<option value="C2">C2</option>
<option value="C3">C3</option>
</select>
</div>
<div class="form-group">
<label for="product">product (Select one)</label>
<select name="product" id="product">
<option value="" disabled selected>Select</option>
</select>
</div>
<div class="form-group">
<label for="Rating">Rating (Select one)</label>
<select class="form-control" id="rating" name="rating" required>
<option selected disabled hidden style='display: none' value=''></option>
<option value="1">1. Not Interested</option>
<option value="2">2. Minor Interest - Needs Some Changes</option>
<option value="3">3. Neutral</option>
<option value="4">4. Interested - Not a Major Priority. Work in When Appropriate</option>
<option value="5">5. Extremely Interested - Put into Testing Process</option>
</select>
</div>
<div class="form-group">
<label for="rem">Remark</label>
<input type="text" class="form-control" id="rem" name="rem">
</div>
<div class="form-group">
<input type="hidden" class="form-control" id="lat" name="lat">
<input type="hidden" class="form-control" id="long" name="long">
</div>
<button type="submit" class="btn btn-primary btn-block">Submit</button>
</form>
<div id="output"></div>
</div>
</div>
</div>
</body>
</html>
<script>
var productsByCompany = {
C1: ["C1P1", "C1P2", "C1P3"],
C2: ["C2P1", "C2P2"],
C3: ["C3P1", "C3P2", "C3P3","C4P4"]
}
function changeCompany(value) {
if (value.length == 0) document.getElementById("company").innerHTML = "<option></option>";
else {
var companyOptions = "";
for (comanyId in productsByCompany[value]) {
companyOptions += "<option>" + productsByCompany[value][categoryId] + "</option>";
}
document.getElementById("company").innerHTML = companyOptions;
}
}
</script>
JavaScript.html
<script>
// Prevent forms from submitting.
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);
window.addEventListener('load', showPosition);
function handleFormSubmit(formObject) {
google.script.run.processForm(formObject);
document.getElementById("myForm").reset();
//var formvals = Objapp.objectToArray(formObject);
alert('Your response was saved successfully');
}
</script>
所有值(“依赖”下拉列表除外)都填充在工作表中
通过网络应用程序
这是我尝试过的分支谷歌表单。但是,它需要 300 个分支并创建 600 列,这是我不想要的。
解决方案
你的 jsfiddle 有点不对劲。更改下拉项时,无需在 for 循环中引用选定的数组项。
所以你的初始 for 循环:
for (categoryId in mealsByCategory[value]) {
catOptions += "<option>" + mealsByCategory[value][categoryId] + "</option>";
}
对此的更改:
for (categoryId of mealsByCategory[value]) {
catOptions += "<option>" + categoryId + "</option>";
}
请记住,我们已经知道我们正在查看哪个餐食类别,因为它被声明为我们正在循环的集合。
var mealsByCategory = {
A: ["Soup", "Juice", "Tea", "Others"],
B: ["Soup", "Juice", "Water", "Others"],
C: ["Soup", "Juice", "Coffee", "Tea", "Others"]
}
function changecat(value) {
// Clear the target dropdown so that we don't stack results.
const categoryList = document.querySelector("#category");
categoryList.innerHTML = "";
if (value.length == 0)
{
categoryList.innerHTML = "<option></option>";
}
else {
let catOptions = "";
for (categoryId of mealsByCategory[value]) {
catOptions += "<option>" + categoryId + "</option>";
}
categoryList.innerHTML = catOptions;
}
}
<select name="meal" id="meal" onChange="changecat(this.value);">
<option value="" disabled selected>Select</option>
<option value="A">A</option>
<option value="B">B</option>
<option value="C">C</option>
</select>
<select name="category" id="category">
<option value="" disabled selected>Select</option>
</select>
推荐阅读
- c# - C#:在二叉搜索树中根据类别列出项目而不使用集合类
- google-sheets - 将雅虎金融股票价格刮到谷歌表格
- sql - 如何交叉 5 个不属于同一个表的 sql 查询,并且每个查询都有数百万个数据作为输出
- python - 如何在 ffmpeg-python 中使用多个地图值?
- c# - 在c#中使用[可选]参数后如何知道它是否由调用方法给出?
- python - 在 python 中,每个元素都是 1x1 矩阵,我如何使每个元素都不分开?
- android - Android Studio 中应用程序、项目、模块等的所有不同名称是什么
- python - 从python中的目录过滤文件列表
- html - iframe 中的内容安全策略设置
- android - 无法解决:com.github.KwabenBerko:News-API-Java:1.0.0