在 Google 脚本自定义对话框中创建下拉菜单,使用 Google Sheet 中数据的选项
Creating drop-down menu in Google Script custom dialogue, with options from data in a Google Sheet
我希望在您 运行 脚本时在自定义对话框中创建下拉菜单。我已经成功地这样做了,并且还能够在一个元素中创建一个循环,该循环从静态数组 [即几个月的数组并创建一个下拉菜单]。但是,我无法从 google sheet 中提取数据并使用该数据创建下拉菜单。
用于从数组创建下拉菜单的示例代码:
<form>
<select name="Month-test" id="month-selector-test" autofocus="autofocus" autocorrect="off" autocomplete="off">
<option value="" selected="selected" id="todays-month"></option>
<script>
// select this element
var currentDayList = document.getElementById('month-selector-test');
// array of all months
var allMonthsAbv = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
// for every element in the array, add an option
for (var i=0; i<allMonthsAbv.length; i++) {
currentDayList.innerHTML += '<option value=' + allMonthsAbv[i] + '>' + allMonthsAbv[i] + '</option>';
}
</script>
</select>
</form>
无法根据 sheet 中的数据创建下拉菜单的示例代码:
<form>
<select name="Month" id="month-selector" autofocus="autofocus" autocorrect="off" autocomplete="off">
<option value="" selected="selected"></option>
<script>
var monthList = document.getElementById('month-selector');
var allData = SpreadsheetApp.openById('###ID###').getSheetByName('###NAME###').getDataRange().getValues();
var list = [];
for (var i=1;i<allData.length;i++) {
var schoolName = allData[i][1];
if (schoolName != "") {
list.push(schoolName);
}
}
for (var i = 0;i<list.length;i++) {
monthList.innerHTML += '<option value=' + list[i] + '>' + list[i] + '</option>';
}
</script>
</select>
</form>
您使用的 pop 不正确。将 list.pop 更改为 list.push
var monthList = document.getElementById('month-selector');
var allData = SpreadsheetApp.openById('###ID###').getSheetByName('###NAME###').getDataRange().getValues();
var list = [];
for (var i=1;i<allData.length;i++) {
var schoolName = allData[i][1];
if (schoolName != "") {
list.push(schoolName);
}
}
for (var i = 0;i<list.length;i++) {
monthList.innerHTML += '<option value=' + list[i] + '>' + list[i] + '</option>';
}
我确实编写过并经常使用可以满足您要求的代码。所以我可以肯定地说,这是可以做到的。
我要补充一点,这样做非常有用。电子表格是非编码人员可以愉快地更新的东西,然后我们从中生成代码。
关于您提供的代码,让我感到困惑的是您在 HTML.
中对 SpreadsheetApp 的使用
我只在 GAS 代码中这样做过。您可能知道一些我不知道的事情,或者这可能是回答您问题的开始。
我经常使用 google.script.run 你呢?
所以下一个问题是 - 你能不能在前景 (HTML) 和背景 (GAS) 之间轻松、规律地移动
我问这个是因为它对我来说是关键
好的 - 我已经完成了我之前应该做的事情并尝试了 运行 你的代码并提出了许多 非常不同的 (即分开,但是非常明确)的问题。我还剩下一个尚未解决的问题,但我想我应该及时通知您。在输入工作代码之前,我会尝试解决所有这些问题。
- 代码什么时候触发?此 必须在 HTML 正文加载事件中发生 才能填充下拉列表。我知道要在 GAS 中的那个点触发代码的唯一方法是通过 "successHandler" 进行 GAS 调用。
因此:
nullFunction()(GAS,即后端)什么都不做,它只是在加载正文时调用 addMonths(),然后填充下拉列表。
- select 标签支持哪些属性?
您正在使用 id 和关联的 getElementById() 调用,但 select 不支持 id 属性,因此:
然后,您必须了解 getElementsByName() returns 节点列表这一事实,因此您需要添加到该列表中 [0] 的 innerHtml。因此:
var currentDayList = document.getElementsByName('month-selector-test')[0];
- 方块应该放在哪里?
这有两个方面。你已经把它放在街区里了。但是,如果它在那里,它将作为 innerHtml 的一部分由您的代码处理,所以它不能去那里!
如果你把它放在 onload 触发时它还没有加载,所以它必须在
结束时加载
这是工作代码:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body onload='google.script.run.withSuccessHandler(addMonths).nullFunction();'>
x x x
<select name="month-selector-test">
</select>
<script>
var currentDayList = document.getElementsByName('month-selector-test')[0];
function addMonth(monthAbv){
text=currentDayList.innerHTML;
var firstPart='\<option value=\"';
var secondPart='\"\>';
var thirdPart='\<\/option\>';
text=text + firstPart+name + secondPart + monthAbv + thirdPart;
currentDayList.innerHTML+=text;
}
function addMonths(){
var allMonthsAbv = ["Jan","Feb"];
//"Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
// for every element in the array, add an option
for (var i=0; i<allMonthsAbv.length; i++) {
addMonth(allMonthsAbv[i]);
}
}
</script>
</body>
</html>
我希望在您 运行 脚本时在自定义对话框中创建下拉菜单。我已经成功地这样做了,并且还能够在一个元素中创建一个循环,该循环从静态数组 [即几个月的数组并创建一个下拉菜单]。但是,我无法从 google sheet 中提取数据并使用该数据创建下拉菜单。
用于从数组创建下拉菜单的示例代码:
<form>
<select name="Month-test" id="month-selector-test" autofocus="autofocus" autocorrect="off" autocomplete="off">
<option value="" selected="selected" id="todays-month"></option>
<script>
// select this element
var currentDayList = document.getElementById('month-selector-test');
// array of all months
var allMonthsAbv = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
// for every element in the array, add an option
for (var i=0; i<allMonthsAbv.length; i++) {
currentDayList.innerHTML += '<option value=' + allMonthsAbv[i] + '>' + allMonthsAbv[i] + '</option>';
}
</script>
</select>
</form>
无法根据 sheet 中的数据创建下拉菜单的示例代码:
<form>
<select name="Month" id="month-selector" autofocus="autofocus" autocorrect="off" autocomplete="off">
<option value="" selected="selected"></option>
<script>
var monthList = document.getElementById('month-selector');
var allData = SpreadsheetApp.openById('###ID###').getSheetByName('###NAME###').getDataRange().getValues();
var list = [];
for (var i=1;i<allData.length;i++) {
var schoolName = allData[i][1];
if (schoolName != "") {
list.push(schoolName);
}
}
for (var i = 0;i<list.length;i++) {
monthList.innerHTML += '<option value=' + list[i] + '>' + list[i] + '</option>';
}
</script>
</select>
</form>
您使用的 pop 不正确。将 list.pop 更改为 list.push
var monthList = document.getElementById('month-selector');
var allData = SpreadsheetApp.openById('###ID###').getSheetByName('###NAME###').getDataRange().getValues();
var list = [];
for (var i=1;i<allData.length;i++) {
var schoolName = allData[i][1];
if (schoolName != "") {
list.push(schoolName);
}
}
for (var i = 0;i<list.length;i++) {
monthList.innerHTML += '<option value=' + list[i] + '>' + list[i] + '</option>';
}
我确实编写过并经常使用可以满足您要求的代码。所以我可以肯定地说,这是可以做到的。
我要补充一点,这样做非常有用。电子表格是非编码人员可以愉快地更新的东西,然后我们从中生成代码。
关于您提供的代码,让我感到困惑的是您在 HTML.
中对 SpreadsheetApp 的使用我只在 GAS 代码中这样做过。您可能知道一些我不知道的事情,或者这可能是回答您问题的开始。
我经常使用 google.script.run 你呢?
所以下一个问题是 - 你能不能在前景 (HTML) 和背景 (GAS) 之间轻松、规律地移动
我问这个是因为它对我来说是关键
好的 - 我已经完成了我之前应该做的事情并尝试了 运行 你的代码并提出了许多 非常不同的 (即分开,但是非常明确)的问题。我还剩下一个尚未解决的问题,但我想我应该及时通知您。在输入工作代码之前,我会尝试解决所有这些问题。
- 代码什么时候触发?此 必须在 HTML 正文加载事件中发生 才能填充下拉列表。我知道要在 GAS 中的那个点触发代码的唯一方法是通过 "successHandler" 进行 GAS 调用。 因此: nullFunction()(GAS,即后端)什么都不做,它只是在加载正文时调用 addMonths(),然后填充下拉列表。
- select 标签支持哪些属性? 您正在使用 id 和关联的 getElementById() 调用,但 select 不支持 id 属性,因此: 然后,您必须了解 getElementsByName() returns 节点列表这一事实,因此您需要添加到该列表中 [0] 的 innerHtml。因此: var currentDayList = document.getElementsByName('month-selector-test')[0];
- 方块应该放在哪里? 这有两个方面。你已经把它放在街区里了。但是,如果它在那里,它将作为 innerHtml 的一部分由您的代码处理,所以它不能去那里! 如果你把它放在 onload 触发时它还没有加载,所以它必须在 结束时加载
这是工作代码:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body onload='google.script.run.withSuccessHandler(addMonths).nullFunction();'>
x x x
<select name="month-selector-test">
</select>
<script>
var currentDayList = document.getElementsByName('month-selector-test')[0];
function addMonth(monthAbv){
text=currentDayList.innerHTML;
var firstPart='\<option value=\"';
var secondPart='\"\>';
var thirdPart='\<\/option\>';
text=text + firstPart+name + secondPart + monthAbv + thirdPart;
currentDayList.innerHTML+=text;
}
function addMonths(){
var allMonthsAbv = ["Jan","Feb"];
//"Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
// for every element in the array, add an option
for (var i=0; i<allMonthsAbv.length; i++) {
addMonth(allMonthsAbv[i]);
}
}
</script>
</body>
</html>