Javascript 如何基于所附电子表格中的列自动填充表单选项

Javascript 如何基于所附电子表格中的列自动填充表单选项,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我创建了一个新的谷歌表单来收集用户信息。在我的工作表脚本编辑器中,我创建了以下表单: 上面的表单有一个选择题,我需要使用所附电子表格中的特定列自动填充 我使用了下面的代码,但出于某种原因,更新函数没有读取表单选项或其他内容 当我运行updateform函数时,它给出“TypeError:无法在对象中找到函数getItemById” 是否有任何解决方案可以通过“工作表”列更新表单选项 函数doGet(){ 返回HtmlService.createTemplateFromFile('form.ht

我创建了一个新的谷歌表单来收集用户信息。在我的工作表脚本编辑器中,我创建了以下表单:

上面的表单有一个选择题,我需要使用所附电子表格中的特定列自动填充

我使用了下面的代码,但出于某种原因,更新函数没有读取表单选项或其他内容

当我运行updateform函数时,它给出“TypeError:无法在对象中找到函数getItemById”

是否有任何解决方案可以通过“工作表”列更新表单选项

函数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,&quot;-8333688893315580231&quot;]
">
<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>