.gs (zaktualizowany)
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()
}}
Celem powyższego kodu jest sprawdzenie, czy wartość newRow[1]
pasuje do dowolnej wartości komórki z zakresu (L2: L) w Sheet1, a następnie przekierowuje do Confirmation.html, w przeciwnym razie do Error.html na podstawie warunku if instrukcja w kodzie
Teraz problem jest; tylko jeśli newRow[1]
== pierwsza / najwyższa wartość w zakresie (L2: L), użytkownik jest przekierowywany do Potwierdzenia, a każda inna wartość poniżej tej z zakresu przekierowuje użytkownika do błędu
Na przykład: Jeśli mamy 4 wartości w zakresie L2: L, takie jak: L2: John L3: Mike L4: Jenny L5: Tom
Jeśli użytkownik prześle Jana jako newRow[1]
, przekierowany do Potwierdzenia i to jest poprawne bez problemu, ale
Jeśli użytkownik prześle Mike'a, Jenny lub tom, przekierowany do błędu, a to źle, ponieważ nowo przesłana wartość jest nadal w zakresie i powinna również przekierować użytkownika do Potwierdzenia
Każda pomoc jest mile widziana. Z góry dziękuję
2 odpowiedzi
Użyj Array.flat
aby najpierw spłaszczyć dane przed sprawdzeniem wartości zamiast pętli for:
if(values.flat().includes(value)){
return /*confirmation page*/
} else {
return /*error page*/
}
Pętla for nie zadziałała, ponieważ logika jest nieprawidłowa: Twój kod stwierdza, że:
for each value in values
if this value(in loop) is equal to value, I'm checking
end this function and return confirmation html
else
end this function and return error html
W każdym razie funkcja zakończy się po sprawdzeniu pierwszej wartości. Prawidłowym sposobem wykonania takiej pętli for byłoby:
var isValueInColL = false;
for (var i = 0; i < values.length; i++) {
if (values[i][0] == value) {//added [0]
isValueInColL = true;
break;// no need to check rest of col L
}
}
var html = isValueInColL ? 'Confirmation' : 'Error';
return HtmlService.createTemplateFromFile(html).evaluate()
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
Spróbuj tego w ten sposób:
function doGet() {
return HtmlService.createHtmlOutputFromFile('Form.html');
}
function doPost (e) {
Logger.log(JSON.stringify(e))
if(!e || !e.parameter) {
Browser.msgBox('No Parameters');
return;
}
var doc=SpreadsheetApp.getActive();
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 sheet1=doc.getSheetByName("Sheet1");
var values=sheet1.getRange(2,12,sheet1.getLastRow()-1,1).getValues();
var value=newRow[1];
for (var i=0;i<values.length; i++) {
if (values[i][0]==value) {
return HtmlService.createHtmlOutputFromFile('Confirmation');
}else {
return HtmlService.createHtmlOutputFromFile('Error');
}
}
}
Wypróbuj swój HTML w ten sposób:
<!DOCTYPE html>
<html lang="en">
<head>
<base target="_top">
<style>body {font-family: "Lato", sans-serif}</style>
</head>
<body>
<form action="script URL" target="_self" method="POST">
<input type="number" placeholder="Enter OTP" required name="OTP">
<button type="submit">Send</button>
</form>
</body>
</html>
Niektóre tagi HTML były nie na miejscu, na przykład tag body nie znajduje się nad