Перенаправить, если значение совпадает с любой ячейкой в ​​указанном диапазоне c - PullRequest
0 голосов
/ 20 марта 2020

.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] любому значению ячейки в диапазоне (L2: L) в Sheet1, а затем перенаправить в Подтверждение. html, в противном случае в Ошибка. html на основе оператора if в коде

Теперь проблема заключается в; только если newRow[1] == первое / верхнее значение в диапазоне (L2: L), пользователь перенаправляется на подтверждение, а любое другое значение ниже указанного в диапазоне перенаправляет пользователя на ошибку

Например: если у нас есть 4 значения в диапазоне L2: L, например: L2: Джон L3: Майк L4: Дженни L5: Том

Если пользователь отправляет Джона как newRow[1], перенаправляется на Подтверждение, и это верно без проблема, но

Если пользователь отправляет Майка или Дженни или Тома, перенаправляется на ошибку и это неправильно, потому что новое переданное значение все еще находится в диапазоне и должно перенаправить пользователя на подтверждение

Любая помощь приветствуется. Заранее спасибо

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Используйте Array.flat, чтобы сначала сгладить данные перед проверкой значения вместо for-l oop:

if(values.flat().includes(value)){
  return /*confirmation page*/
} else {
  return /*error page*/
}

Для l oop не было работать, потому что лог c не в порядке: ваш код утверждает, что:

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

В любом случае, функция завершится после проверки первого значения. Правильный способ сделать это для l oop будет:

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

0 голосов
/ 21 марта 2020

Попробуйте это так:

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

Попробуйте свои html так:

<!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>

Некоторые из ваших html тегов были неуместны, например тег body не принадлежит выше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...