.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
Cen Eg 20 marzec 2020, 21:59

2 odpowiedzi

Najlepsza odpowiedź

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);
}

1
TheMaster 24 marzec 2020, 09:07

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

0
Cooper 21 marzec 2020, 00:32