#javascript #html #google-apps-script #google-sheets
#javascript #HTML #google-apps-script #google-sheets
Вопрос:
У меня есть эта функция для проверки входных данных в HTML-форме (это боковая панель в Google Таблицах):
Зачет Чикагским компьютерам
function validate() {
var fieldsToValidate = document.querySelectorAll("#userform input, #userform select");
return Array.prototype.every.call(fieldsToValidate, function(el){
return el.checkValidity();
});
}
И затем я вызываю эту функцию с помощью оператора IF перед добавлением данных обратно в мою электронную таблицу.
if(validate()){
var familyName = document.getElementById("family_name");
var semester = document.getElementById("semester");
var rowData = {familyName: family_name.value, semesterApp: semester.value};
google.script.run.withSuccessHandler(afterRun).addNewRow(rowData);
} else {
// handle this later
}
}
Это не работает. В выпадающем меню не удается загрузить параметры, и данные в форме не добавляются при нажатии кнопки.
Я буду признателен за любую помощь, которую вы могли бы предоставить.
Это HTML-форма:
<div class="container">
<div id="userform">
<div class="form-group">
<label for="family_name">Family name</label>
<input type="text" class="form-control" id="family_name" required>
</div>
<div class="form-group">
<label for="semester">Applying for semester</label>
<select class="form-control" id="semester" required>
<option></option>
</select>
</div>
<button class="btn btn-primary" id="mainButton">Run</button>
</div>
</div>
И это интерфейсные скрипты:
function afterButtonClicked(){
if(validate()){
var familyName = document.getElementById("family_name");
var semester = document.getElementById("semester");
var rowData = {familyName: family_name.value, semesterApp: semester.value};
google.script.run.withSuccessHandler(afterRun).addNewRow(rowData);
} else {
handle this later
}
}
function afterRun(e) {
var familyName = document.getElementById("family_name");
familyName.value = "";
}
function validate() {
var fieldsToValidate = document.querySelectorAll("#userform input, #userform select");
return Array.prototype.every.call(fieldsToValidate, function(el){
return el.checkValidity();
});
}
function afterSidebarLoads() {
google.script.run.withSuccessHandler(afterDropDownArrayReturned).getDropDownArray();
}
function afterDropDownArrayReturned(arrayOfArrays) {
var semester = document.getElementById("semester");
arrayOfArrays.forEach(function(r){
var option = document.createElement("option");
option.textContent = r[0];
semester.appendChild(option);
});
}
document.getElementById("mainButton").addEventListener("click", afterButtonClicked);
document.addEventListener("DOMContentLoaded", afterSidebarLoads);
Это две функции, выполняемые в серверной части:
function addNewRow(rowData) {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet1 = ss.getSheetByName("dataFromInput");
sheet1.appendRow([rowData.familyName, rowData.semesterApp]);
return true;
}
function getDropDownArray() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet1 = ss.getSheetByName("dropDownMenuSem");
return sheet1.getRange(2, 1, sheet1.getLastRow()-1, 1).getValues(); // [[AUG - DEC 2020], [FEB - JUN 2021], [AUG - DEC 2021], [FEB - JUN 2022], [AUG - DEC 2022], [FEB - JUN 2023]]
}
Комментарии:
1. Я не могу понять взаимосвязь между вашим скриптом и
It's not working. The drop down menu fails to load the options and the data in the form doesn't get added when the button is clicked.
. В вашей ситуацииvalidate()
всегдаfalse
?2. Пожалуйста, поделитесь формой HTML, чтобы понять вышеупомянутую взаимосвязь. Кроме того, я считаю, что если данные в поле
select
ввода не заполняютсяvalidate()
, функция не может работать должным образом. Таким образом, проблема может быть найдена в раскрывающемся списке creation.3. Ваш код отлично работает в моей среде. Я полагаю, что проблема заключается в вашей серверной среде. Пожалуйста, покажите, как вы возвращаете
options
элементы вSuccessHandler
4. @Alessandro Спасибо за ваш ответ! Я только что добавил две функции, запущенные в серверной части. Может ли это быть
Array.prototype.every.call()
метод, который не поддерживается в GAS?5. Это поддерживается. См. раздел просмотр> выполнение> очистить фильтр «Запуск от имени меня» вверху слева
Ответ №1:
Я тоже следил за серией видеороликов Chicago Computers Classes и столкнулся с той же проблемой.
К сожалению, я не могу объяснить, почему функция validate() не будет работать, но я смог заставить ее работать, используя .forEach() вместо Array.prototype.every.call() .
Это код после шанса:
function validate() {
var fieldsToValidate = document.querySelectorAll("#userform input");
var isValid = true;
fieldsToValidate.forEach(f => {
if (f.checkValidity() === false) {
isValid = false;
}
})
return isValid;
}
Комментарии:
1. Другой возможностью является отсутствие «//», чтобы «обработать это позже» в первом предоставленном вами html.