Javascript 使用谷歌应用程序脚本更改选项值(时间),如果该值在某个日期达到其限制
我有一个谷歌脚本中的时间列表,它反映在Web应用程序中。我从youtube.com上得到的。这是该web应用程序和google表单的屏幕截图 网络应用程序: 谷歌工作表(工作表名称:“时间选择”): 这些代码用于使用javascript和google脚本以html格式生成或输出时间 html代码:Javascript 使用谷歌应用程序脚本更改选项值(时间),如果该值在某个日期达到其限制,javascript,html,google-apps-script,google-sheets,Javascript,Html,Google Apps Script,Google Sheets,我有一个谷歌脚本中的时间列表,它反映在Web应用程序中。我从youtube.com上得到的。这是该web应用程序和google表单的屏幕截图 网络应用程序: 谷歌工作表(工作表名称:“时间选择”): 这些代码用于使用javascript和google脚本以html格式生成或输出时间 html代码: <div class="input-field col s4"> <select id="subTime">
<div class="input-field col s4">
<select id="subTime">
<option value="" disabled selected>Choose your preferred time</option>
<?!= list1; ?>
</select>
<label>Select Time</label>
</div> <!-- CLOSE TIME FIELD -->
</div> <!-- CLOSE ROW -->
提前感谢您的帮助。请尝试以下工作流程:
doGet()
函数返回一个HTML网页
->该网页有一个可选择日期的下拉列表
->在submit buton单击时,将调用一个JS函数,该函数将所选日期传递到代码的.gs
部分
->在.gs
中,应用程序脚本功能检查所选日期的可用时间段
->网页中包含时间的第二个下拉菜单将动态填充此特定日期的可用时间段列表
更多详细信息:
在HTML中
- 对日期实施列表/其他选择方法,并结合提交按钮:
- 编写一个
函数,在timeLimit(date)
中查找特定Test\u Data
的所有已预留时段:date
- 并对从
t检索到的每个可能的时隙运行它,测试发生率是否高于允许的限制,并仅将未达到限制的时隙推入time_Selec
:htmlListArray1
注意:请相应地调整您的
doGet()
函数。我可以问一下您的问题吗?您当前的问题是否是timeLimit()的功能?如果是这样,您能否提供想要实现的dataRg
和dataDisable
的示例值?借此,我想思考一下问题和解决办法。如果可以的话,还可以提供一个电子表格样本吗?因为在您的屏幕截图中,我无法理解单元格值的类型。@Tanaike此处:dataRg的日志:`[19-08-07 13:14:15:863 HKT][[计划日期,计划时间],[Wed Aug 07 00:00:00 GMT+08:00 2019,8:00 AM],[Wed Aug 07 00:00 GMT+08:00 2019,9:00 AM],[Wed Aug 07 00:00 GMT+08:00 2019,10:00 AM],[星期三八月七日00:00:00 GMT+2019年08:00,上午8:00],[星期三八月七日00:00 GMT+2019年08:00,上午8:00],[星期四八月八日00:00 GMT+2019年08:00,上午9:00],[星期三八月七日00:00 GMT+2019年08:00,上午9:00]]'感谢您回复并提供了一个电子表格示例。我可以理解输入值。下一步,我想知道您想要的输出值。那么,我可以问您想要的dataDisable
的值吗?@Tanaike正如您在下面的工作表名称中所看到的,这里有一个“Time\u Select”这将是工作表名称“Test_Data”的“Scheduled Time”列下的输入值。您认为如果某个日期的时间达到3次,它是否可能仅禁用该日期的选择中的时间?我正在考虑添加document.getElementById(“subDate”).addEventListener(“输入”,checkTime)
和google.script.run.withSuccessHandler(updateTime.timeLimit();
谢谢。在HTML部分,您的意思是在HTML代码上添加选项,而不是进入google工作表?在应用程序脚本部分,我应该创建您所述的函数,并更改我的doGet()
函数如您上面所示?很抱歉,我有点困惑,但感谢您的帮助。我收到了此错误:引用错误:“GetAllIndex”未定义。
。我试图调用该函数,但仍然存在相同的错误。doGet()函数是将脚本部署为Web应用程序所必需的。它需要包含return HtmlService.createhtmloutfromfile(“test”);
,其余部分进入时间限制()
function将从HTML部分的JS函数动态调用它。
引用错误源于传递给函数的某些参数为空/无效(可能为空范围?).Logs有助于查找错误。因此,您修改的代码具有var limit=3;
和htmlListArray1=[]
现在将转到timeLimit()
函数。很抱歉,我是编程初学者。另外,您是如何获得getAllIndex(arr,val)的
function,因为在另一个代码或函数中,您从未调用过该getAllIndexes
function。谢谢。
<?!= list1; ?>
function doGet(e){
var ss = SpreadsheetApp.openByUrl(url);
var ws1 = ss.getSheetByName("Time_Select");
var list1 = ws1.getRange(1,1,ws1.getRange("A1").getDataRegion().getLastRow(),1).getValues();
var htmlListArray1 = list1.map(function(r){return '<option>' + r[0] + '</option>'; }).join('');
var tmp = HtmlService.createTemplateFromFile("test");
tmp.list1 = htmlListArray1;
return tmp.evaluate();
}
function timeLimit(){
var ss = SpreadsheetApp.openByUrl(url);
var ws = ss.getSheetByName("Test_Data");
var dataRg = ws.getRange(1, 7, ws.getLastRow(), 2).getValues();
var myData = [];
var CheckLimitReached = function (T)
{
var records= {};
T.forEach(function (x) { records[x] = (records[x] || 0) + 1; });
var limit_reached = Object.keys(records).filter(function (R) {
return records[R] >= 3;});
//return limit_reached;
Logger.log(limit_reached);
};
var dataDisable = CheckLimitReached(dataRg);
Logger.log(dataDisable);
}
<select id="Date">
<option value="" disabled selected>Choose your preferred day</option>
...
</select>
<input type="button" onClick="passDate()" value="Confirm date">
function passDate(date){
var dropdown=document.getElementById('Date');
var date=dropdown.options[dropdown.selectedIndex].value;
google.script.run.withSuccessHandler(onSuccess).timeLimit(date);
}
function timeLimit(){
var ss = SpreadsheetApp.openByUrl(url);
var ws = ss.getSheetByName("Test_Data");
var dataRg = ws.getRange(1, 7, ws.getLastRow(), 2).getValues();
var myData = [];
for(var i=0;i<dataRg.lenth:i++){
if(dataRg[0][i]==date){
myData.push(dataRg[1][i])
}
}
function getAllIndexes(arr, val) {
var indexes = [], i = -1;
while ((i = arr.indexOf(val, i+1)) != -1){
indexes.push(i);
}
return indexes;
}
var ws1 = ss.getSheetByName("Time_Select");
var list1 = ws1.getRange(1,1,ws1.getRange("A1").getDataRegion().getLastRow(),1).getValues();
var limit=3;
var htmlListArray1 = []
for (var j=0;j<list1.length;j++){
if(!getAllIndexes(myData, list1[0][j]).length>=limit){
htmlListArray1.push('<option>' + list1[0][j] + '</option>'; });
}
}
htmlListArray1.join('');
return htmlListArray1;
}
function onSuccess(htmlListArray1) {
document.getElementById('subTime').innerHTML = htmlListArray1;
}