Javascript 如何基于所附电子表格中的列自动填充表单选项
我创建了一个新的谷歌表单来收集用户信息。在我的工作表脚本编辑器中,我创建了以下表单: 上面的表单有一个选择题,我需要使用所附电子表格中的特定列自动填充 我使用了下面的代码,但出于某种原因,更新函数没有读取表单选项或其他内容 当我运行updateform函数时,它给出“TypeError:无法在对象中找到函数getItemById” 是否有任何解决方案可以通过“工作表”列更新表单选项Javascript 如何基于所附电子表格中的列自动填充表单选项,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我创建了一个新的谷歌表单来收集用户信息。在我的工作表脚本编辑器中,我创建了以下表单: 上面的表单有一个选择题,我需要使用所附电子表格中的特定列自动填充 我使用了下面的代码,但出于某种原因,更新函数没有读取表单选项或其他内容 当我运行updateform函数时,它给出“TypeError:无法在对象中找到函数getItemById” 是否有任何解决方案可以通过“工作表”列更新表单选项 函数doGet(){ 返回HtmlService.createTemplateFromFile('form.ht
函数doGet(){
返回HtmlService.createTemplateFromFile('form.html')
.evaluate()//必须在设置沙盒模式之前进行评估
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
函数updateForm(){
//调用表单并连接到下拉项
变量形式=(”https://script.google.com/macros/s/AKfycbz6uGmXfSiXg4lYseeX0IN7Qv_9eM4eN9knUtBm5Co/exec");
var namesList=form.getItemById(“890244015”).asListItem();
//确定填充下拉列表所需的数据所在的工作表
var ss=SpreadsheetApp.getActive();
var name=ss.getSheetByName(“选项”);
//获取工作表第一列中的值-使用2跳过标题行
var namesValues=names.getRange(2,16,names.getMaxRows()-1.getValues();
var studentNames=[];
//转换数组时忽略空单元格
对于(var i=0;i
这是form.html代码:
<!DOCTYPE html>
<html>
<body>
<style>
body {
padding: 0px 0px 0px 0px;
margin: 0px 0px 0px 0px;
background-color: white;
}
</style>
<link href='/static/forms/client/css/3145455273-
mobile_formview_st_ltr.css' type='text/css' rel='stylesheet' media='screen
and
(max-device-width: 721px)'>
<div class="ss-form-container">
<div class="ss-header-image-container"><div class="ss-header-image-image">
<div class="ss-header-image-sizer"></div></div></div>
<div class="ss-top-of-page"><div class="ss-form-heading"><h1 class="ss-
form-title" dir="ltr">Test</h1>
<div class="ss-form-desc ss-no-ignore-whitespace" dir="ltr">WELD DATE
00</div>
<div class="ss-required-asterisk" aria-hidden="true" id="Required">*
Required</div></div></div>
<br><br>
<div class="ss-form">
<script type="text/javascript">var submitted=false;</script>
<iframe name="hidden_iframe" id="hidden_iframe" style="display:none;"
onload="if(submitted)
{window.location='https://sites.google.com/site/formredirection/';}">
</iframe>
<form action="https://docs.google.com/forms/d/e/formid/formResponse"
method="post" target="hidden_iframe"
onsubmit="submitted=true;">
<div class="ss-form-question errorbox-good" role="listitem">
<div dir="auto" class="ss-item ss-item-required ss-select"><div class="ss-
form-entry">
<label class="ss-q-item-label" for="entry_890244015"><div class="ss-q-
title">JOINT
<label for="itemView.getDomIdToLabel()" aria-label="(Required field)">
</label>
<span class="ss-required-asterisk" aria-hidden="true">*</span></div>
<div class="ss-q-help ss-secondary-text" dir="auto"></div></label>
<select name="entry.890244015" id="entry_890244015" aria-label="JOINT "
aria-required="true" required=""><option value=""></option>
<option value="OPTION 01">OPTION 01</option> <option value="OPTION
02">OPTION 02</option> <option value="OPTION 03">OPTION 03</option>
<option value="OPTION 04">OPTION 04</option></select>
</div></div></div>
<div class="ss-form-question errorbox-good" role="listitem">
<div dir="auto" class="ss-item ss-item-required ss-radio"><div class="ss-
form-entry">
<label class="ss-q-item-label" for="entry_117174731"><div class="ss-q-
title">REP NO.
<label for="itemView.getDomIdToLabel()" aria-label="(Required field)">
</label>
<span class="ss-required-asterisk" aria-hidden="true">*</span></div>
<div class="ss-q-help ss-secondary-text" dir="auto"></div></label>
<ul class="ss-choices" role="radiogroup" aria-label="REP NO. "><li
class="ss-choice-item">
<label><span class="ss-choice-item-control goog-inline-block"><input
type="radio" name="entry.735659431" value="" id="group_735659431_1"
role="radio" class="ss-q-radio" aria-label="" required="" aria-
required="true"></span>
<span class="ss-choice-label"></span>
</label></li></ul>
<div class="error-message" id="117174731_errorMessage"></div></div></div>
</div>
<div class="ss-form-question errorbox-good" role="listitem">
<div dir="auto" class="ss-item ss-item-required ss-date"><div class="ss-
form-entry">
<label class="ss-q-item-label" for="entry_1715668372"><div class="ss-q-
title">WELD DATE
<label for="itemView.getDomIdToLabel()" aria-label="(Required field)">
</label>
<span class="ss-required-asterisk" aria-hidden="true">*</span></div>
<div class="ss-q-help ss-secondary-text" dir="auto"></div></label>
<input type="date" name="entry.1715668372" value="" class="ss-q-date"
dir="auto" id="entry_1715668372" aria-label="WELD DATE " aria-
required="true" required="">
</div></div></div>
<div class="ss-form-question errorbox-good" role="listitem">
<div dir="auto" class="ss-item ss-item-required ss-select"><div class="ss-
form-entry">
<label class="ss-q-item-label" for="entry_1048274308"><div class="ss-q-
title">WELDER
<label for="itemView.getDomIdToLabel()" aria-label="(Required field)">
</label>
<span class="ss-required-asterisk" aria-hidden="true">*</span></div>
<div class="ss-q-help ss-secondary-text" dir="auto"></div></label>
<select name="entry.1048274308" id="entry_1048274308" aria-label="WELDER
" aria-required="true" required=""><option value=""></option>
<option value="WR 01">WR 01</option> <option value="WR 02">WR 02</option>
<option value="WR 03">WR 03</option> <option value="WR 04">WR 04</option>
</select>
</div></div></div>
<div class="ss-form-question errorbox-good" role="listitem">
<div dir="auto" class="ss-item ss-item-required ss-select"><div class="ss-
form-entry">
<label class="ss-q-item-label" for="entry_1712008875"><div class="ss-q-
title">WPS
<label for="itemView.getDomIdToLabel()" aria-label="(Required field)">
</label>
<span class="ss-required-asterisk" aria-hidden="true">*</span></div>
<div class="ss-q-help ss-secondary-text" dir="auto"></div></label>
<select name="entry.1712008875" id="entry_1712008875" aria-label="WPS "
aria-required="true" required=""><option value=""></option>
<option value="WPS 01">WPS 01</option> <option value="WPS 02">WPS
02</option> <option value="WPS 03">WPS 03</option> <option value="WPS
04">WPS 04</option></select>
</div></div></div>
<input type="hidden" name="draftResponse" value="
[null,null,"-8333688893315580231"]
">
<input type="hidden" name="pageHistory" value="0">
<input type="hidden" name="fbzx" value="-8333688893315580231">
<div class="ss-send-email-receipt" style="margin-bottom: 4px;" dir="ltr">
<label for="emailReceipt" style="display:inline;"></label></div>
<input type="submit" name="submit" value="Submit" id="ss-submit"
class="jfk-button jfk-button-action "></form></div></div>
</body>
</html>
身体{
填充:0px 0px 0px 0px;
保证金:0px 0px 0px 0px;
背景色:白色;
}
试验
焊接日期
00
*
要求的
var=false;
共同的
*
选项01选项02选项03
选项04
代表编号。
*
-
焊接日期
*
焊接工
*
WR 01 WR 02
西铁03西铁04
WPS
*
WPS 01 WPS
02 WPS 03 WPS 04
关于如何创建HTML表单,您已经得到了答案
在这个问题的代码中,您试图对字符串值使用getItemById
,但此方法来自。换句话说,这种方法应该只在Google表单上使用,而不是在web表单上使用。类似的情况也发生在其他使用的方法上,如setChoiceValues
要使用客户端代码从web表单设置选项列表,应使用DOM方法,如querySelectorAll
,getElementsByTagName
,等等。如果需要从电子表格中获取选项,可以使用服务器端代码,也可以使用google.script.run
从客户端调用该代码
有关Google应用程序脚本web应用程序工作原理的概述,请阅读
相关的
和
这允许您访问HTML文件中的应用程序脚本功能
.gs文件
HTML文件
...
...
这是一个简单的解决方案,如果您的HTML框架是预先确定的(您事先知道您的下拉菜单将有4个选项)
如果您想动态调整选项的数量,您可以选择以下更优雅的解决方案:
.gs文件
函数doGet(){
返回HtmlService
.createTemplateFromFile('索引')
.评估();
}
函数createInnerHTML()
{
var ss=SpreadsheetApp.getActive();
var name=ss.getSheetByName(“选项”);
var namesValues=names.getRange(2,16,names.getMaxRows()-1.getValues();
var InnerHTML=[];
对于(var i=0;i
...
其中是getItemById()
?感谢您的关注,Mike。以我的形式访问选项列表的正确方法是什么???@MikePole问题是使用Google Apps脚本服务器端服务,因此不应使用堆栈片段,因为这些服务在此处不可执行。该链接要求权限。无论如何,请包含客户端代码的一部分。提供。您的代码是太长了,问题中有很多不必要的东西。请参阅。从头开始,只构建重现问题所需的内容。感谢鲁本的关注我正在尝试更改表单共享选项,但它一直给我一个错误我已经使用谷歌表单,但我已将源代码添加到应用程序脚本中,以便添加一些修改下面是我的form.html文件中的问题代码:如您所见,表单仍然会将结果提交到随附的google工作表中。因此,您能否给我一个如何使用google.script.run的示例。使用电子表格中的特定列自动更新上述列表项。谢谢advance@MahmoudBayoumi关于你的例子正在询问,请检查此问题:非常感谢鲁本的努力。我检查了您发送的线程,在运行函数时仍然存在一些问题(无法获取null的GetRange,无法获取null的GetLastRaw方法)由于我对java脚本不太熟悉,请使用更新我的应用程序脚本中的选项列表所需的脚本提供建议。谢谢好的,现在我成功运行了函数(FunctionToRunformSubmit),但仍然没有成功运行(genDiscRep);它给出了一个错误(范围内的行数必须至少为1)哇,Ziganotschka,第一个代码工作得很好,非常感谢你。动态代码在运行函数时没有给出任何错误,但是,由于某种原因仍然不工作,列表在表单中变为空。如果你能帮忙,我将非常感谢。再次感谢。顺便说一句,我刚刚添加了doGet函数,并且修复了一些语法错误,因此在最后它变成这样:函数createInnerHTML(){var ss=SpreadsheetApp
function doGet() {
return HtmlService
.createTemplateFromFile('index')
.evaluate();
}
function createInnerHTML(){
var ss = SpreadsheetApp.getActive();
var names = ss.getSheetByName("CHOICES");
var namesValues = names.getRange(2, 16, names.getMaxRows() - 1).getValues();
return namesValues;
}
<body>
...
<? var namesValues= createInnerHTML(); ?>
<div>
<select name="entry.890244015" id="entry_890244015" aria-label="JOINT " aria-required="true" required="">
<option value=""></option>
<option value="OPTION 01"><?= namesValues[0][0]?></option>
<option value="OPTION 02"><?= namesValues[1][0]?></option>
<option value="OPTION 03"><?= namesValues[2][0]?></option>
<option value="OPTION 04"><?= namesValues[3][0]?></option>
</select>
</div>
...
</body>
function doGet() {
return HtmlService
.createTemplateFromFile('index')
.evaluate();
}
function createInnerHTML()
{
var ss = SpreadsheetApp.getActive();
var names = ss.getSheetByName("CHOICES");
var namesValues = names.getRange(2, 16, names.getMaxRows() - 1).getValues();
var InnerHTML = [];
for (var i=0;i<namesValues.length;i++){
InnerHTML.push('<option value="OPTION '+(i+1)+'>' + namesValues[i][0]+ '</option>';
});
InnerHTML.join('');
return InnerHTML;
}
<body>
...
<? var innerHTML= createInnerHTML(); ?>
<div>
<select name="entry.890244015" id="entry_890244015" aria-label="JOINT " aria-required="true" required="">
<option value=""></option>
//HERE the inner HTML will be inserted
<?= innerHTML?>
</select>
</div>
...
</body>