猿问

如果值与特定范围内的任何单元格匹配,则重定向 - 谷歌表格

.gs(更新)


function doGet() {

return HtmlService.createTemplateFromFile('Form.html').evaluate()

.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);

}


var scriptProp = PropertiesService.getScriptProperties();


function doPost (e) {

var lock = LockService.getScriptLock();

lock.tryLock(10 * 1000);


var doc = SpreadsheetApp.getActiveSpreadsheet();

var sh = doc.getSheetByName("Sheet1");

var values = sh.getRange(2, 12, sh.getLastRow()-1, 1).getValues();

// Logger.log(values);



try {    


var sheet = doc.getSheetByName("OTP");

var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];

var nextRow = sheet.getLastRow() + 1;

var newRow = headers.map(function(header) {

return header === 'Timestamp' ? new Date() : e.parameter[header]

});

sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]);


var value = newRow[1];

for (var i = 0; i < values.length; i++) {

if (values[i] == value) {

return HtmlService.createTemplateFromFile('Confirmation.html').evaluate()

.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);

} else {

return HtmlService.createTemplateFromFile('Error.html').evaluate()

.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);

}}}


catch (e) {

return ContentService.createTextOutput(JSON.stringify({ 'result': 'error', 'error': e }))

.setMimeType(ContentService.MimeType.JSON)

}


finally {

lock.releaseLock()

}}

上述代码的目的是检查值是否newRow[1]与Sheet1中范围(L2:L)中的任何单元格值匹配,然后重定向到Confirmation.html,否则根据代码中的if语句重定向到Error.html


现在的问题是;仅当newRow[1]== 范围内的第一个/顶部值 (L2:L) 时,用户被重定向到 Confirmation,并且该范围内低于该值的任何其他值将用户重定向到错误


例如:如果我们在 L2:L 范围内有 4 个值,如下所示: L2: John L3: Mike L4: Jenny L5: Tom


如果用户将 John 提交为newRow[1],则重定向到 Confirmation 并且这是正确的,没有问题,但是


如果用户提交 Mike 或 Jenny 或 tom,重定向到错误并且这个错误,因为新提交的值仍在范围内,并且应该也将用户重定向到 Confirmation


任何帮助表示赞赏。提前致谢


德玛西亚99
浏览 139回答 2
2回答

富国沪深

用于Array.flat在检查值而不是 for 循环之前先展平数据:if(values.flat().includes(value)){&nbsp; return /*confirmation page*/} else {&nbsp; return /*error page*/}for 循环不起作用,因为逻辑错误:您的代码指出:for each value in values&nbsp; &nbsp;&nbsp;&nbsp; if this value(in loop) is equal to value, I'm checking&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; end this function and return confirmation html&nbsp; else&nbsp; &nbsp; end this function and return error html无论如何,该函数将在检查第一个值后结束。执行这种 for 循环的正确方法是:var isValueInColL = false;for (var i = 0; i < values.length; i++) {&nbsp; if (values[i][0] == value) {//added [0]&nbsp; &nbsp; isValueInColL = true;&nbsp; &nbsp; break;// no need to check rest of col L&nbsp; }}var html = isValueInColL ? 'Confirmation' : 'Error';return HtmlService.createTemplateFromFile(html).evaluate().setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);}

米脂

试试这种方式:function doGet() {&nbsp; return HtmlService.createHtmlOutputFromFile('Form.html');}function doPost (e) {&nbsp; Logger.log(JSON.stringify(e))&nbsp; if(!e || !e.parameter) {&nbsp; &nbsp; Browser.msgBox('No Parameters');&nbsp; &nbsp; return;&nbsp; }&nbsp; var doc=SpreadsheetApp.getActive();&nbsp; var sheet=doc.getSheetByName('OTP');&nbsp; var headers=sheet.getRange(1,1,1,sheet.getLastColumn()).getValues()[0];&nbsp; var nextRow=sheet.getLastRow() + 1;&nbsp; var newRow=headers.map(function(header) {return (header=='Timestamp')?new Date():e.parameter[header];});&nbsp; sheet.getRange(nextRow,1,1,newRow.length).setValues([newRow]);&nbsp; var sheet1=doc.getSheetByName("Sheet1");&nbsp; var values=sheet1.getRange(2,12,sheet1.getLastRow()-1,1).getValues();&nbsp; var value=newRow[1];&nbsp; for (var i=0;i<values.length; i++) {&nbsp; &nbsp; if (values[i][0]==value) {&nbsp; &nbsp; &nbsp; return HtmlService.createHtmlOutputFromFile('Confirmation');&nbsp; &nbsp; }else {&nbsp; &nbsp; &nbsp; return HtmlService.createHtmlOutputFromFile('Error');&nbsp; &nbsp; }&nbsp; }}以这种方式尝试您的html:<!DOCTYPE html><html><head>&nbsp; <base target="_top">&nbsp; <style>body {font-family: "Lato", sans-serif}</style></head><body>&nbsp; <form action="script URL" target="_self" method="POST">&nbsp; <input type="number" placeholder="Enter OTP" required name="OTP">&nbsp; <button type="submit">Send</button>&nbsp; </form></body></html>您的一些 html 标签不合适,例如 body 标签不属于
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答